数据库保研复习笔记
数据是数据库中存储的基本对象。数据的种类可以是数字、文本、图像、音频、视频等多种。
数据与信息的区别:
数据库即存放数据的仓库。数据库中数据有永久存储、有组织、可共享三个特点。
数据库管理系统是进行数据库管理的基础软件,其功能包括数据定义、组织、存储、管理、操纵,数据库的建立和维护,事务管理、运行管理等。
外模式:应用程序
模式:逻辑结构
内模式:物理结构
物理独立性:内模式改变不影响模式
逻辑独立性:模式改变不影响外模式
二级映像:
数据库系统是由数据库、数据库管理系统、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统。
与人工管理和文件系统相比,数据库系统的特点有:
数据模型可以分为两类,第一类是概念模型,第二类是逻辑模型和物理模型。
概念模型用于将现实世界抽象为某种信息结构,这种抽象与具体的数据库实现无关,可以应用于任何一种数据库。
逻辑模型是按计算机观点对数据建模,主要用于数据库管理系统的实现。
物理模型是对数据最底层的抽象,它描述数据在系统内部的表示方式和存取方法。
实体:客观存在并可相互区别的事物称为实体
属性:实体的某种特性
码:唯一标识实体的属性,例如对学生而言,学号是码
实体型:用实体名和属性名集合来抽象刻画同类实体,称为实体型。例如:学生(学号,性别,年龄,所在院系)
实体集:同一类型的实体集合
联系:一对一、一对多、多对多
实体型用矩形表示,属性用椭圆表示,联系用菱形表示。用m、n、p表示多个,用1表示单个。(例题见第一次作业)
层次模型、网状模型、关系模型
一个关系对应一个表,表中的一行为一个元组,表中的一列是一个属性。分量指元组中的一个属性值。
候选码:能唯一标识一个元组的属性
主码:在候选码中选出一个属性来唯一标识元组,称为主码
实体完整性:主键不能为空
参照完整性:如果某元组的外键不为空,那么这个外键必须能够在外部表中有对应元组
用户定义完整性:用户自定义的一些约束
并union:∪
差execpt:-
交intersection:∩
笛卡尔积cartesian product:×
选择selection:σ选择条件(关系R) 该运算的作用是从R中提取符合条件的元组
投影projection:ΠA® A是属性列,R是关系,该运算的作用是提取R中的列A
连接join:从两个关系的笛卡尔积中选择符合条件的元组(如果符号下没有写条件,则)
除运算division:
如果R(A, B, C)、S(B, C, D),则R÷S的结果是包含S中所有B、C组合的R中A的取值集合
运算符:>、<、=、≥、≤、<>(不等于)
定义一个属于用户WANG的模式
CREATE SCHEMA AUTHORIZATION WANG;
定义表
CREATE TABLE STUDENT(
id VARCHAR(9) PRIMARY KEY,
name VARCHAR(20),
sex VARCHAR(2),
major VARCHAR(10)
);
主键只有一个时,可以直接在属性后标注,如果主键由多个属性组成,必须作为表级完整性进行定义
CREATE TABLE Student(
id VARCHAR(8),
name VARCHAR(20),
sex VARCHAR(2),
PRIMARY KEY(id, name),
);
外键定义方法:
表示外键major参照Major表中的id属性
CREATE TABLE Student(
id VARCHAR(8) PRIMARY KEY,
name VARCHAR(20),
major VARCHAR(10),
FOREIGN KEY(major) REFERENCES Major(id),
);
数据类型
类型 | 原名 | 含义 |
---|---|---|
CHAR(n) | CHARACTER | 长度为n的定长字符串 |
VARCHAR(n) | CHARACTERVARYING | 最大长度为n的字符串 |
INT | INTEGER | 长整数(4字节) |
SMALLINT | / | 短整数(2字节) |
BIGINT | / | 大整数(8字节) |
REAL | / | 单精度浮点数,其精度取决于机器 |
DOUBLE PRECISION | / | 双精度浮点数,其精度取决于机器 |
FLOAT(n) | / | 自定义精度浮点数,精度至少为n位数字 |
BOOLEAN | / | 布尔值 |
DATE | / | 日期,包括年月日 |
TIME | / | 时间,包括时分秒 |
TIMESTAMP | / | 时间戳类型 |
INTERVAL | / | 时间间隔类型 |
// 修改Student表,加入入学时间列entrance,类型为DATE
ALERT TABLE Student ADD entrance DATE;
// 修改Student表,添加完整性约束
ALERT TABLE Student ADD FOREIGN KEY(entrance) REFERENCES date_table(date_id);
// 修改Student表,删除列entrance
ALERT TABLE Student DROP entrance;
// 修改Student表,删除完整性约束
ALERT TABLE Student DROP CONSTRAINT<完整性约束名>
// 修改Student表,将sex列的类型修改为BOOLEAN类型
ALERT TABLE Student sex BOOLEAN;
DROP TABLE <TABLE_NAME> RESTRICT|CASCADE;
RESTRICT表示约束,意味着如果表上有视图,则表不能删除。
CASCADE表示级联,意味着如果表上有视图,则删除表时将视图也级联删除。
INSERT INTO Student(id, name, major)
VALUES(1, Meng, SOFTWARE);
// 插入子查询结果:将按照系分组后各系的平均成绩插入Grade表中
INSERT INTO Grade(major_id, avg_grade)
SELECT major, AVG(grade)
FROM Student
GROUP BY major;
DELETE
FROM Student
WHERE id=''20039454;
// 带子查询的删除
DELETE
FROM Student
WHERE id in
(SELECT id
FROM Student
WHERE major = 'CS')
UPDATE Student
SET age=20
WHERE id='19373178';
UPDATE Student
SET age = age + 1;
// 带子查询的修改操作:将CS系的所有学生成绩置为0
UPDATE Student
SET grade = 0
WHERE id in
(SELECT id
FROM Student
WHERE major='CS')
SELECT [all|distinct] id, name // 默认为all,distinct为去重操作
FROM Student
[WHERE <条件表达式>]
[GROUP BY <按列分组>]
[ORDER BY <按列排序>] // 升序ASC,降序DESC,默认升序
比较大小:>,<,=,>=,<=,!=,<>,!>(不大于),!<(不小于),NOT+上述运算符
确定范围:BETWEEN AND, NOT BETWEEN AND
确定集合:IN, NOT IN
字符匹配:LIKE, NOT LIKE(%任意长度字符串,_表示任意单个字符,\转义字符)
空值:IS NULL, IS NOT NULL
多重条件逻辑运算:AND, OR, NOT
WHERE age BETWEEN 20 AND 30
WHERE major IN ('CS', 'SOFTWARE', 'MATH')
WHERE name LIKE '张%'
WHERE grade IS NULL
WHERE name LIKE 'DB\_Design' ESCAPE'\'; // ESCAPE表示\是转义字符,字符串中的_不是通配符,而是本来的字符
SELECT *
FROM Student
ORDER BY major, age DESC; // 学生按系号升序排列,同系学生按年龄降序排列
COUNT(*) // 统计元组数量
COUNT([ALL|DISTINCT] <列名>) // 统计一列中值的个数(去重)
SUM([ALL|DISTINCT] <列名>) // 统计一列中值的总和
AVG([ALL|DISTINCT] <列名>) // 统计一列中值的平均值
MAX([ALL|DISTINCT] <列名>) // 统计一列中值的最大值
MIN([ALL|DISTINCT] <列名>) // 统计一列中值的最小值
注意:WHERE子句中不能用聚集函数,聚集函数只能用于SELECT子句或GROUP BY子句中的HAVING子句
GROUP BY按照某列分组,HAVING只输出符合某条件的分组
如下,按照专业分组,只输出专业人数大于3人的分组
SELECT *
FROM Student
GROUP BY major
HAVING COUNT(*) > 3
SELECT Student.*, SC.course_name
FROM Student, SC
WHERE Student.id=SC.student_id
外连接
如下是一个左外连接的例子,左外连接列出左侧表中所有元组,如果左侧表中元组在右侧表中没有对应,就把对应位置置为NULL
SELECT Student.*, SC.course_name
FROM Student LEFT OUTER JOIN SC ON(Student.id = SC.student_id)
in谓词
select * from student
where id in
(select id from Major
where major = 'CS')
比较运算符与ALL|ANY
select * from Student
where grade >
(select AVG(grade)
FROM SC
WHERE Student.id = SC.id)
>ANY
大于子查询中的任意一个值
>ALL
大于子查询中的所有值
select * from Student
where grade > ALL(select grade from SC where Student.id=SC.id)
EXISTS谓词
若子查询结果不为空,则EXISTS谓词返回真,否则返回假
select * from Student
where EXISTS
(select *
from SC
where Student.id=SC.id)
集合查询
交INTERSECT、并UNION、差EXCEPT
select * from Student
where major='CS'
UNION
select * from Student
where age>19;
派生表
select Sno, Cno
FROM SC, (select Sno, AVG(grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno, avg_grade)
WHERE SC.Sno=Avg_sc.Sno and SC.grade>Avg_sc.avg_grade
顺序文件上的索引、散列索引、B+树索引、位图索引等多种
如下语句意思是建立某表中某列对整个表的索引
CREATE [UNIQUE|CLUSTER] INDEX <索引名> ON <表名>(列名 [ASC|DSEC])
UNIQUE:此索引的每个索引值只对应一条记录
CLUSTER:此索引是聚簇索引
修改索引:
ALTER INDEX <旧索引名> RENAME TO <新索引名>
删除索引:
DROP INDEX <索引名>
B树
B+树
视图是从一个或几个基本表中导出的表,但与基本表不同,视图是一个虚表,数据库中只存放视图的定义,视图包括的数据仍然存放在基本表中。
建立视图
CREATE VIEW <视图名> [(列名, 列名)]
AS <子查询>
WITH CHECK OPTION;
WITH CHECK OPTION表示对视图进行更新、插入、删除操作时要满足视图定义中的谓词条件,即子查询中的表达式
例如
CREATE VIEW Student_view(no, name, age)
AS
SELECT Sno, Sname, Sage
FROM Student
WHERE major='CS'
WITH CHECK OPTION
加上WITH CHECK OPTION后,对视图进行更新操作时,系统会自动加上where major='CS’的条件,也就是只能对视图内部的数据进行操作
使用视图进行查询时,将视图当作基本表来使用即可
删除视图
DROP VIEW <视图名>
可以说派生表是临时的,视图是永久的
Student(Sid, Sname, Ssex, Sage)
Course(Cid, Cname, Tname)
SC(Cid, Sid, grade)
---1.检索年龄大于20岁的男生的学号和姓名。
select Sid, Sname
from Student
where Sage>20 and Ssex='男'
---2.检索选修了姓刘的老师所教授的课程的女学生的姓名。
select distinct Sname
from SC, Student
where SC.Sid=Student.Sid and Ssex='女'
and Cid in
(select Cid
from Course
where Tname='刘老师')
---3.检索李想同学不学的课程的课程号和课程名。
select distinct Cid, Cname
from Course
where Cid not in
(select Cid
from SC, Student
where SC.Sid=Student.Sid and Sname='李想')
---4.检索至少选修了两门课程的学生的学号。
select Sid
from SC
group by Sid
having COUNT(Cid) >= 2
---5.求刘老师所教授课程的每门课的平均成绩。
select AVG(grade)
from SC,Course
where SC.Cid=Course.Cid and Tname='刘老师'
group by Cid
---6.假设不存在重修的情况,请统计每门课的选修人数(选课人数超过两人的课程才统计)。要求显示课程号和人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
select Cid, COUNT(*)
from SC
group by Cid
having COUNT(*) > 2
order by COUNT(*) DSEC, Cid ASC
---7.求年龄大于所有女生年龄的男生的姓名和年龄。
select Sname, Sage
from Student
where Ssex='男' and Sage > ALL
(select Sage
from Student
where Ssex='女')
---8.假定不存在重修的情况,求选修了所有课程的学生的学号姓名。(可以不用相关子查询做)
select Sid, Sname
from Student,
(select Sid, COUNT(*)
from SC
group by Sid)
AS Num(num_id, course_num)
where Student.Sid=Num.num_id and course_num = (select count(*) from Course)
---9.查询重修次数在2次以上的学生学号,课程号,重修次数
select Sid, Cid, COUNT(*)
from SC
group by Sid, Cid
having COUNT(*) > 2
---10.查询重修学生人数最多的课程号,课程名,教师姓名
select SC.Cid, Cname, Tname
from SC, Course
where SC.Cid=Course.Cid
group by Cid, Sid
having COUNT(*) >= ALL
(select COUNT(*)
from SC
group by Cid, Sid)
用户身份鉴别(口令、生物特征、智能卡等)
存取控制
数据库完整性是指数据的正确性和相容性。正确性指数据符合现实世界语义,相容性指数据库不同表之间逻辑关系合理。
实体完整性:主键唯一且不为空。违约处理:拒绝操作。
参照完整性:外键的值在参照表中有对应数据项。违约处理:1.拒绝操作;2.级联操作(参照表中数据项删除,则将作为外键引用该项的数据也删除);3.设置为空(参照表中数据项删除,则将作为外键引用位置置为空)
用户定义的完整性:用户自定义的约束,例如某列非空NOT NULL,列值唯一UNIQUE,检查是否满足某个表达式CHECK等
完整性约束使用CONSTRAINT子句定义
函数依赖:一个属性的值确定后另一个属性的值也唯一确定了。例如学号确定后,学生姓名也唯一确定,学生所在院系也唯一确定。类似于函数关系,自变量确定后因变量也唯一确定。
X函数确定Y或Y函数依赖于X,记作X→Y。
平凡的函数依赖:X→Y,且Y⊆X,则称X→Y是平凡的函数依赖。平凡的函数依赖一定成立。
非平凡的函数依赖:X→Y,且Y⊄X,则称X→Y是非平凡的函数依赖。
完全函数依赖:X函数确定Y,且X的任意真子集都无法函数确定Y
部分函数依赖:X函数确定Y,但X的某个真子集也可以函数确定Y,即Y不是完全函数依赖于X
传递函数依赖:X→Y,Y→Z,则X→Z
对于 Z=U-X-Y,给定一对值 (x, z),得到一组 Y,Y 只与 X 有关,与 Z 无关(X 是中转)
超码:一个元组部分依赖于一组属性,则这组属性称为超码。
候选码:一个元组完全依赖于一组属性,则这组属性称为候选码。
主码:选定一个候选码为主码。
全码:整个属性组构成一个主码,称为全码。
外码:表中存在其他表的主码。
码:候选码和主码统称为码
主属性:候选码或主码中的属性
非主属性:不在候选码中也不在主码中的属性
超码能唯一确定元组,而候选码是最小超码,也就是没有冗余元素。
1NF:属性不可分。每个分量是不可分的数据项。
1NF存在的问题:
2NF:每个非主属性完全依赖于任何一个候选码。(消除表内的部份依赖)
反例:有的非主属性完全依赖于候选码中的一个属性,而部分依赖于候选码。
3NF:不存在非主属性传递依赖于码的情况,都是直接依赖(消除表内传递依赖)
BCNF:对每个X→Y,X中必有码
4NF:不存在多值依赖
事务是数据库的逻辑工作单位,是进行数据库恢复和并发控制的基本单位
ACID特性:
原子性(Atomicity):事务中的操作要么都做要么都不做
一致性(Consistency):事务的执行结果是将数据库从一个一致性状态变到另一个
隔离性(Isolation):一个事务的执行不能被其他事务干扰
持续性(Durability):也称永久性,指一个事务一旦提交,它对数据库中数据的改变是永久性的
BEGIN TRANSACTION;
COMMIT;
ROLLBACK;
原理:冗余
技术:数据转储和登记日志文件
恢复策略:
检查点
记录检查点时刻所有正在执行的事务清单,以及这些事务最近一个日志记录的地址。
使用检查点可以提高恢复效率。
数据库写入发生在检查点建立之前或之时,那么在检查点之前提交的事务一定已经写入数据库,不需要REDO。检查点建立时正在执行的事务需要REDO。系统故障时未完成的事务需要UNDO。
使用检查点进行恢复的步骤:
并发操作破坏事务的隔离性,其带来的数据不一致问题有:
控制方法:
排他锁(写锁X锁):一个事务对数据对象加排他锁后,其他事务不能再对该对象加任何锁
共享锁(读锁S锁):一个事务对数据对象加共享锁后,其他事务只能只能读而不能修改
一级封锁协议:修改之前必须加X锁,事务结束释放,防止丢失修改
二级封锁协议:读取之前必须加S锁,读完释放,防止读脏数据
三级封锁协议:读取之前必须加S锁,事务结束释放,防止不可重复读
活锁:事务饿死(T1封锁,T2、T3等待,分配给T3,T2、T4等待,分配给T4;T2一直等待)
防止活锁:先来先服务
死锁:循环等待
死锁的预防:
死锁的诊断:
并发调度的可串行性
可串行化即并发执行的结果与按某一次序串行的结果相同。只有并发调度是可串行的,才认为它是正确调度。
冲突操作:不同事务的读写操作和写写操作。
不同事务的冲突操作和同一事务的操作是不可交换的,其他操作是可交换的。如果一个并发操作可以通过交换得到一个串行序列,则称它是冲突可串行的。
冲突可串行是可串行的充分条件。(不是必要)
两段锁协议:
事务分为两段,第一段是获得封锁,称为扩展阶段,第二阶段是释放封锁,称为收缩阶段