【保研复习】数据库复习笔记

数据库保研复习笔记

文章目录

  • 数据库相关概念
    • 基本概念
      • 数据Data
      • 数据库 DB
      • 数据库管理系统 DBMS
      • 数据库系统 DBS
    • 数据模型
      • 概念模型
        • 概念
        • ER图
      • 逻辑模型
        • 关系模型
    • 关系数据库
        • 完整性
        • 关系代数
  • SQL
    • 表操作
      • 定义表
      • 修改表
      • 删除表
    • 数据操作
        • WHERE子句的常用谓词
        • ORDER BY
        • 聚集函数
        • GROUP BY
      • 连接查询
      • 嵌套查询
    • 索引
        • 索引的原理
    • 视图
  • 数据库保护
    • 数据库安全性
    • 数据库完整性
      • 存储过程和触发器?
  • 数据依赖
    • 函数依赖
    • 多值依赖
    • 范式
  • 事务
    • 数据库恢复
    • 并发控制

数据库相关概念

基本概念

数据Data

数据是数据库中存储的基本对象。数据的种类可以是数字、文本、图像、音频、视频等多种。

数据与信息的区别:

数据库 DB

数据库即存放数据的仓库。数据库中数据有永久存储、有组织、可共享三个特点。

数据库管理系统 DBMS

数据库管理系统是进行数据库管理的基础软件,其功能包括数据定义、组织、存储、管理、操纵,数据库的建立和维护,事务管理、运行管理等。

外模式:应用程序

模式:逻辑结构

内模式:物理结构

物理独立性:内模式改变不影响模式

逻辑独立性:模式改变不影响外模式

二级映像:

  • 外模式/模式映像:数据库的每一个外模式都有一个外模式/模式映像,它定义了外模式和模式之间的对应关系,一般在外模式中描述。当对某个字段重新修改关系、类型等时,只需要修改外模式/模式映像,而不需要修改外模式,由于应用程序是根据外模式编写的,因此应用程序也不需要修改,从而保证了逻辑独立性
  • 模式/内模式映像:这一映像存在于模式和内模式之间,定义了模式和内模式之间的对应关系。模式/内模式映像在数据库中是唯一的,因为一个数据库只有一个模式和内模式。

数据库系统 DBS

数据库系统是由数据库、数据库管理系统、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统。

与人工管理和文件系统相比,数据库系统的特点有:

  1. 数据结构化:指数据之间存在结构关系
  2. 数据共享性高、冗余度低且易扩充
  3. 数据独立性高
    • 物理独立性:用户应用程序与数据库中数据的物理存储相互独立,应用程序不需要了解数据库中是如何进行物理存储的
    • 逻辑独立性:用户应用程序与数据库中数据的逻辑结构相互独立,如果数据逻辑结构改变,应用程序也可以不变
  4. 数据是由数据库管理系统统一管理控制的。DBMS需要提供以下功能:
    • 数据安全性控制
    • 数据完整性控制
    • 并发控制
    • 数据库恢复

数据模型

数据模型可以分为两类,第一类是概念模型,第二类是逻辑模型和物理模型。

概念模型用于将现实世界抽象为某种信息结构,这种抽象与具体的数据库实现无关,可以应用于任何一种数据库。

逻辑模型是按计算机观点对数据建模,主要用于数据库管理系统的实现。

物理模型是对数据最底层的抽象,它描述数据在系统内部的表示方式和存取方法。

概念模型

概念

实体:客观存在并可相互区别的事物称为实体

属性:实体的某种特性

码:唯一标识实体的属性,例如对学生而言,学号是码

实体型:用实体名和属性名集合来抽象刻画同类实体,称为实体型。例如:学生(学号,性别,年龄,所在院系)

实体集:同一类型的实体集合

联系:一对一、一对多、多对多

ER图

实体型用矩形表示,属性用椭圆表示,联系用菱形表示。用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的取值集合

运算符:>、<、=、≥、≤、<>(不等于)

SQL

表操作

定义表

定义一个属于用户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,默认升序

WHERE子句的常用谓词

比较大小:>,<,=,>=,<=,!=,<>,!>(不大于),!<(不小于),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表示\是转义字符,字符串中的_不是通配符,而是本来的字符

ORDER BY

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

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存在的问题:

  1. 数据冗余。例如学生表中存了系和系主任,系主任在学生表中大量重复出现
  2. 更新异常。由于数据冗余,当系主任名字需要更新时,需要修改大量数据。
  3. 插入异常。如果把系存放在学生表中,当一个系刚成立还没有学生的时候无法插入。
  4. 删除异常。如果该系所有学生全部毕业,将学生删除后这个系及其系主任的信息也丢失了。

2NF:每个非主属性完全依赖于任何一个候选码。(消除表内的部份依赖)

反例:有的非主属性完全依赖于候选码中的一个属性,而部分依赖于候选码。

3NF:不存在非主属性传递依赖于码的情况,都是直接依赖(消除表内传递依赖)

BCNF:对每个X→Y,X中必有码

4NF:不存在多值依赖

事务

事务是数据库的逻辑工作单位,是进行数据库恢复和并发控制的基本单位

ACID特性:

原子性(Atomicity):事务中的操作要么都做要么都不做

一致性(Consistency):事务的执行结果是将数据库从一个一致性状态变到另一个

隔离性(Isolation):一个事务的执行不能被其他事务干扰

持续性(Durability):也称永久性,指一个事务一旦提交,它对数据库中数据的改变是永久性的

BEGIN TRANSACTION;
COMMIT;
ROLLBACK;

数据库恢复

原理:冗余

技术:数据转储和登记日志文件

  • 数据转储:定期保存到后备副本。故障发生时,将后备副本重新装入,然后运行自转储以后的所有事务。
    • 静态转储:在无事务运行时进行转储,得到的一定是一个数据一致性的副本
    • 动态转储:转储期间允许对数据库进行存取或修改。有可能转储结束后后备副本已经过时。
  • 登记日志文件:先写日志文件,再写数据库。日志文件中需要记录:事务的开始、结束标志和事务的更新操作

恢复策略:

  • 事务故障的恢复(事务内部发生错误,导致事务还未完成时发生故障)
    • 反向扫描日志文件,查找该事务的更新操作
    • 对更新操作执行逆操作
    • 直到读到事务的开始标记
  • 系统故障的恢复(系统发生故障。已提交事务可能还留在缓冲区没有写入数据库,未完成事务对数据库的更新可能已经写入数据库)(对已提交数据库进行REDO,对未完成事务进行UNDO)
    • 正向扫描日志文件,找出在故障发生时已经提交的事务(既有BEGIN TRANSACTION记录也有COMMIT记录)
    • 将其事务标记入重做队列REDO-LIST
    • 找出故障时尚未完成的事务(只有BEGIN TRANSACTION没有COMMIT)
    • 将事务标记入撤销队列
  • 介质故障(磁盘上的物理数据和日志文件被破坏)
    • 装入最新的后备副本
    • 装入日志文件副本,重做已完成的事务

检查点

记录检查点时刻所有正在执行的事务清单,以及这些事务最近一个日志记录的地址。

使用检查点可以提高恢复效率。

数据库写入发生在检查点建立之前或之时,那么在检查点之前提交的事务一定已经写入数据库,不需要REDO。检查点建立时正在执行的事务需要REDO。系统故障时未完成的事务需要UNDO。

使用检查点进行恢复的步骤:

  • 找到最后一个检查点
  • 由该检查点得到检查点建立时刻所有正在执行的任务清单ACTIVE-LIST。将ACTIVE-LIST暂时放入UNDO队列,REDO队列暂为空
  • 从检查点开始正向扫描日志文件:
    • 如果有新开始的事务,将其暂时放入UNDO队列
    • 如果有提交的事务,将其从UNDO队列移到REDO队列
    • 这样就实现了,系统故障时已完成的事务进行REDO操作,系统故障时未完成的事务执行UNDO操作
  • 对UNDO队列中的所有事务执行UNDO操作,对REDO队列的所有事务执行REDO操作

并发控制

并发操作破坏事务的隔离性,其带来的数据不一致问题有:

  1. 丢失修改:T1、T2两个事务同时读入同一数据并进行修改,T2提交的结果覆盖了T1的提交,导致T1的修改丢失。
  2. 不可重复读:事务T1读取某数据后,事务T2对其进行了修改,导致T1无法再现前一次的读取结果。
  3. 读脏数据:事务T1修改某一数据并将其写回磁盘后,事务T2读了这部分数据,但是随后T1由于某些原因被撤销,此时T2读到的数据与磁盘数据不一致,称之为脏数据。

控制方法:

  • 封锁
  • 时间戳
  • 乐观控制法
  • 多版本并发控制

排他锁(写锁X锁):一个事务对数据对象加排他锁后,其他事务不能再对该对象加任何锁

共享锁(读锁S锁):一个事务对数据对象加共享锁后,其他事务只能只能读而不能修改

一级封锁协议:修改之前必须加X锁,事务结束释放,防止丢失修改

二级封锁协议:读取之前必须加S锁,读完释放,防止读脏数据

三级封锁协议:读取之前必须加S锁,事务结束释放,防止不可重复读

活锁:事务饿死(T1封锁,T2、T3等待,分配给T3,T2、T4等待,分配给T4;T2一直等待)

防止活锁:先来先服务

死锁:循环等待

死锁的预防:

  • 一次封锁法
  • 顺序封锁法

死锁的诊断:

  • 超时法(事务超时即认为存在死锁)
  • 等待图法(等待图存在回路即认为存在死锁)

并发调度的可串行性

可串行化即并发执行的结果与按某一次序串行的结果相同。只有并发调度是可串行的,才认为它是正确调度。

冲突操作:不同事务的读写操作和写写操作。

不同事务的冲突操作和同一事务的操作是不可交换的,其他操作是可交换的。如果一个并发操作可以通过交换得到一个串行序列,则称它是冲突可串行的。

冲突可串行是可串行的充分条件。(不是必要)

两段锁协议:

事务分为两段,第一段是获得封锁,称为扩展阶段,第二阶段是释放封锁,称为收缩阶段

你可能感兴趣的:(保研复习笔记,数据库,mysql,java)