zoukankan      html  css  js  c++  java
  • 数据库基础

    基本理论知识

    数据模型

    数据库是长期存储在计算机内有组织的大量的共享的数据集合,数据库系统的核心和基础是数据模型

    第一类数据模型:概念模型,信息模型,按照用户的观点来对数据和信息建模,主要用于数据库设计

    第二类数据模型:逻辑模型和物理模型。

    ---逻辑模型包括:层次模型、网状模型、关系模型、面向对象模型、对象关系模型等

    ---物理模型:对数据最底层的抽象,描述数据在系统内部的表示方法和存取方法,在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。

    数据模型一般由数据结构、数据操作和完整性约束三部分组成。

    数据结构

    存储在数据库中对象类型的集合,作用是描述数据库组成对象以及对象之间的联系。

    数据操作

    对数据库中各种对象实例允许执行的操作的集合,包括操作及相关的操作规则。

    数据完整性约束条件

    在给定的数据模型中,数据及其联系所遵守的一组通用的完整性规则,它能保证数据的正确性和一致性。

    关系模型

    关系模型是目前最重要的一种数据模型,关系数据库系统用关系模型作为数据的组织方式,关系模型中数据的逻辑结构是一张二维表

    (1)关系的数据结构:一张表

    (2)关系数据模型的数据操作包括:查询、插入、删除和更新数据

    (3)关系模型的数据完整性约束条件包括:实体完整性、参照完整性、用户自定义的完整性

    主键与外键

    候选码:若关系中的某一属性组的值能唯一标识一个元组,则该属性组为候选码

    主键(主关键字):若一个表中有多个候选码,则可选定其中一个为主键

    主属性:候选码的诸属性称为主属性,不包含在任何候选码中的属性称为非主属性或非码属性

    外键(外关键字):如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键,则该属性集是关系模式R的外键。以另一个关系的外键作主键的表被称为主表,具有此外键的表被称为主表的从表。

    关系模型的实体完整性规则

    若属性A(一个或一组属性)是基本关系R的主属性,则A不能取空值,即主键不能为空

    关系模型的参照完整性规则

    若属性F(一个或一组属性)是某基本关系R的外键,且它与基本关系R1 的主键相对应,则对于R中,每个F上的值或为空值或等于R1中的主键值

    事务

    用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位

    事务的四个特性(ACID特性):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)。

    索引

    对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

    索引的作用

    (1)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

    (2)可以大大加快数据的检索速度,这是创建索引的最主要原因

    (3)可以加速表与表之间的连接,特别是在实现数据的参照完整性方面特别有意义

    (4)在使用分组(group by)和排序(order by)字句进行数据检索时,同样可以显著减少查询中分组和排序的时间

    (5)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

    为表设置索引的代价

    (1)增加了数据库的存储空间

    (2)在插入和修改数据时要花费较多的时间(因为索引也要随之变动)

    索引建立和删除语句

    //在表Student(学生信息表)上按Sno(学号)降序建唯一索引

    CREATE UNIQUE INDEX Stusno ON Student(Sno desc);

    //删除Student表的Stusno索引

    ALTER TABLE Student DROP INDEX Stusno;

    视图

    从一个或几个基本表(或视图)导出的表,与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍然存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了,从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。

    视图建立和删除语句

    //建立一个计算机系学生的视图(在学生表Student的基础上)

    CREATE VIEW CS_Student

    AS

    SELECT sno, sname

    FROM Student

    WHERE Sdept='CS';

    注:视图一经建立,就可以像基本表一样被查询、删除

    //删除视图

    DROP view CS_Student;

    SQL语句

    SQL语句包含:数据定义(create、drop、alter)、数据查询(select)、数据操纵(insert、update、delete)、数据控制(grant、revoke)

    数据定义

    定义基本表(create)
    CREATE TABLE 表名 
    (列名 数据类型 列级完整性约束条件,
    ...... 列名 数据类型 列级完整性约束条件); 

    //例子:建立“学生信息表”student

    CREATE TABLE Student

    (Sno CHAR(9) PRIMARY KEY,

    Sname CHAR(20) UNIQUE,

    Ssex CHAR(2),

    Sage SMALLINT,

    Sdept CHAR(20)

    );

    修改基本表(alter)
    ALTER TABLE 表名
    
    [ADD 新列名 数据类型 完整性约束]
    
    [DROP 完整性约束名]
    
    [MODIFY COLUMN 列名 数据类型]

    例子:

    //向Student表增加“入学时间”列,数据类型为日期型

    ALTER TABLE Student ADD S_entrance DATE;

    //将年龄的数据类型由字符型改为整数

    ALTER TABLE Student MODIFY COLUMN Sage INT;

    //增加Student表Sname必须取唯一值的约束条件

    ALTER TABLE Student ADD UNIQUE(Sname);

    删除基本表(drop)
    //RESTRICT表示表的删除是有限制条件的,CASCADE表示表的删除没有限制条件
    DROP TABLE 表名 [RESTRICT | CASCADE]

    //例子:删除Student表

    DROP TABLE Student CASCADE;

    数据查询(select)

    SELECT [ALL | DISTINCT] 目标列表达式
    FROM 表明或视图名
    [WHERE 条件表达式]
    [GROUP BY 列名 [HAVING 条件表达式]]
    [ORDER BY 列名 [ASC | DESC]];选择
    选择表中的若干列

    //在表Student中,查询名为Bill Gates 的学生信息

    SELECT * from Student WHERE Sname='Bill Gates';

    //在表Student中,查询名字中有Bill的学生信息

    SELECT * from Student WHERE Sname like '%Bill%';

    //在表Student中查询年龄在20-23岁(包括20与23岁)之间的学生信息

    SELECT * from Student WHERE Sage BETWEEN 20 AND 23;

    //在表Student中查询计算机系(CS)、信息系(MA)、数学系(IS)学生的姓名与性别

    SELECT Sname,Ssex FROM Student WHERE Sdept IN('CS', 'IS', 'MA');

    //在表Student中查询没有年龄信息的学生

    SELECT * FROM Student WHERE Sage IS NULL;

    ORDER BY子句

    order by子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认是升序

    //在表Student中,按学生的年龄值升序检索出全部学生的信息

    SELECT * FROM Student ORDER BY Sage;

    //在表Student中,先按专业升序,再同一专业按年龄降序,输出全部学生信息

    SELECT * FROM Student ORDER BY Sdept, Sage desc;

    LIMIT子句

    查询之后要显示返回的前几条或中间某几行数据

    SELECT * FROM TABLE LIMIT [offset, ] rows | rows OFFSET offset //偏移量从0开始

    例子:

    SELECT * FROM Student LIMIT 5,10;  //行,偏移; 检索记录行6-15

    SELECT * FROM Student LIMIT 5;  //检索前5个记录行

    注:LIMIT n等价于LIMIT 0,n

    聚集函数

    SQL语句中常用的聚集函数有count、sum、avg、max、min。

    总数:select count(*) as totalcount from table1;
    求和:select sum(field1) as sumvalue from table1;
    平均:select avg(field1) as avgvalue from table1;
    最大:select max(field1) as maxvalue from table1;
    最小:select min(field1) as minvalue from table1;
    
    GROUP BY子句

    根据一个或多个属性的值来对元组进行分组,值相等的为一组

    //查询Student表中具有相同年龄的每个组的人数

    select Sage, count(*) from Student group by Sage;

    //HAVING 子句用在GROUP BY子句的SQL语句中,用来选取符合指定条件的分组

    select Sage,count(*) from Student group by Sage having count(*) > 1;

    连接查询

    若一个查询同时涉及两个以上的表,则称之为连接查询

    //有表Student(学生信息表)、SC(选课表),要求查询每个学生及其选修课程的情况

    SELECT Student.*, SC.*

    FROM Student, SC

    WHERE Student.Sno=SC.Sno;

    //若某个学生没有选课,依然将其保存到结果中,这时需要使用外连接

    //下例为左外连接,列出左边表(Student)中所有元组

    SELECT Student.*, SC.* 

    FROM Student LEFT JOIN SC ON(Student.Sno=SC.Sno);

    数据操纵

    向表中添加若干行数据、修改表中的数据、删除表中的若干行数据

    插入元组(insert)

    将新元组插入到制定表中,其中新元组的field1的值为value1,field2的值为value2...; 

    INSERT
    INTO table1(field1,field2...)
    VALUES(value1,value2...)
    

    //例:将新学生元组(学号:201009013;姓名:王明;性别:男;所在系:CS;年龄:23)插入到Student表中

    INSERT INTO Student(Sno, Sname, Ssex, Sdept, Sage)

    VALUES('201009013', '王明', '男', 'CS', '23' );

    修改数据(update)
    UPDATE table1
    SET field1=value1, field2=value2
    WHERE 范围;
    

    //例:将学生201009013的年龄改为22岁

    UPDATE Student

    SET Sage=22

    WHERE Sno='201009013';

    删除数据(delete)
    DELETE 
    FROM table1
    WHERE 范围;
    

    //例:删除学号为201009013的学生记录

    DELETE 

    FROM Student

    WHERE Sno='201009013';

    参考:

    《王道程序员面试宝典》

    《程序员面试宝典》

  • 相关阅读:
    工作实战之项目常用技术
    Thymeleaf的错误解决方式
    实用小demo
    idea常用的几个插件
    idea2019+Plugins中搜索不到任何插件解决办法
    git的初体验
    springboot2.+的整合log4j2错误解决浅谈
    MobaXterm百度网盘下载
    阿里云RDS云数据库连接步骤
    读源码学编程之——死循环妙用
  • 原文地址:https://www.cnblogs.com/meiqin970126/p/15398948.html
Copyright © 2011-2022 走看看