第1章 绪论
数据库的本质是用数据库管理系统高效支持的、使用数据结构组织的数据的集合
1.1数据库系统概述
1.1.1数据库的4个基本概念
- 1.数据(Data)
数据是数据库中存储的基本对象。定义为描述事务的符号记录。数据的含义称为语义,数据与其语义是不可分的。
- 2.数据库(DataBase,DB)
长期存储在计算机内,有组织的,可共享的大量数据的集合。
数据库基本特征:1.永久存储 2.有组织 3.可共享 4.冗余度小 5.易扩展
- 3.数据库管理系统(DataBase Management System,DBMS)
位于用户与操作系统之间的一层数据管理软件
数据库管理系统和操作系统一样是计算机的基础软件。
主要功能:提供数据定义语言(DDL)、数据操纵语言(DML)等
- 4.数据库系统(DataBase System,DBS)
数据库系统由数据库(DB),数据库管理系统(DBMS),应用程序和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统。
1.1.2数据管理技术的产生和发展(三个阶段)
1.人工管理阶段:
在计算机出现之前,人们运用常规的手段从事记录、存储和对数据加工,也就是利用纸张来记录和利用计算工具(算盘、计算尺)来进行计算,并主要使用人的大脑来管理和利用这些数据。
- 数据的管理者:用户(程序员),数据不保存
- 数据面向的对象:某一应用程序
- 数据的共享:不共享,冗余大
- 数据的独立性:不独立,完全依赖程序
- 数据的结构:无结构
- 数据控制能力:应用程序自己控制
2.文件系统阶段:
在这一阶段(20世纪50年代后期至60年代中期)计算机不仅用于科学计算,还利用在信息管理方面。随着数据量的增加,数据的存储、检索和维护问题成为紧迫的需要,数据结构和数据管理技术迅速发展起来。此时,外部存储器已有磁盘、磁鼓等直接存取的存储设备。软件领域出现了操作系统和高级软件。操作系统中的文件系统是专门管理外存的数据管理软件,文件是操作系统管理的重要资源之一。
- 数据的管理者:文件系统,可长期保存
- 数据面向的对象:某一应用程序
- 数据的共享:共享差,冗余大
- 数据的独立性:独立性差
- 数据的结构:记录内有结构,整体无结构
- 数据控制能力:应用程序自己控制
3.数据库系统阶段
1.1.3数据库系统的特点
程序员必须关注记录结构和不同文件记录之间的联系,工作量大,变成复杂,开发速度慢,缺乏并发控制。
数据库系统的特点:
- 数据结构化
- 数据的共享性高,冗余度低且易扩充
- 数据独立性高,数据独立性由数据库管理系统的二级映像功能来保证
- 物理独立性:当数据的物理存储改变了,应用数据不用改变
- 逻辑独立性:数据的逻辑结构改变了,应用程序不用改变
- 数据由数据库管理系统管理和控制
- 数据的安全性保护
- 数据的完整性检查
- 并发控制
- 数据库恢复
1.2数据模型
一、概述
二、数据模型的组成要素
数据模型通常由数据结构、数据操作和完整性约束三个部分组成。
三、逻辑模型的分类(非关系模型与关系模型)
非关系模型:层次模型(Hierarchical Model)、网状模型(Network Model)
关系模型(Relational Model)
层次模型,满足下面两个条件的基本层次联系的集合为层次模型(就是树结构):
-
①有且只有一个结点没有双亲结点,这个结点称为根结点
-
②根以外的其它结点有且只有一个双亲结点
网状模型,满足下面两个条件的基本层次联系的集合(一对多关系,结构上像有向图):
-
①允许一个以上的结点无双亲;
-
②一个结点可以有多于一个的双亲。
1.2.2概念模型
表示方法:E-R图
注意: E-R图中,实体用矩形表示,属性用椭圆表示,关系用菱形表示。
- 唯一标识实体的属性集叫做超码
- 唯一标识实体的属性集的最小子集为码
- 码肯定是超码,但是超码不一定是码
- 一个实体可以有多个码
- 一个码可以包括一到多个属性
例子:班级号,序号,学号,姓名
学号是一个码,也是一个超码
[班级号,序号]也是一个码
[学号,姓名]是超码,不是码
联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时标明联系的类型(1:1, 1:n, m:n)
比如有两个简单实体,分别是单位和职员,它们的关系就是1:m,一个单位可以有多个职员;
再比如有两个实体,分别是学生和图书,它们的关系就是m:n,从而形成中间表学生借阅的图书,结果是1本图书可以被多人借阅,1个人也可以借多本图书。
1.2.3数据模型的组成要素(3种)
1.2.4最常用的数据模型
1.2.5层次模型
1.2.6网状模型
1.3 数据库系统结构
数据库系统的三级模式结构:模式(Schema)、外模式(External Schema)、内模式(Internal Schema)
模式(也称逻辑模式)[一个]:
- ①数据库中全体数据的逻辑结构和特征的描述
- ②所有用户的公共数据视图,综合了所有用户的需求
模式的地位:是数据库系统模式结构的中间层
- ①与数据的物理存储细节和硬件环境无关
- ②与具体的应用程序、开发工具及高级程序设计语言无关
外模式(也称子模式或用户模式)[多个]:
- ①数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
- ②数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
外模式的用途:
- ①保证数据库安全性的一个有力措施
- ②每个用户只能看见和访问所对应的外模式中的数据
- 外模式描述的是数据的局部逻辑结构
内模式(也称存储模式)[一个]:
- ①是数据物理结构和存储方式的描述
- ②是数据在数据库内部的表示方式:
用途:
- a. 记录的存储方式(顺序存储,按照B树结构存储,按hash方法存储)
- b. 索引的组织方式
- c. 数据是否压缩存储
- d. 数据是否加密
- e. 数据存储记录结构的规定
第2章 关系数据库
2.1 关系数据结构及其形式化定义
2.1.1关系
- 单一结构的数据结构–关系
- 逻辑结构-- 二维表(在用户的角度)
1.域(Domain):域是一组具有相同数据类型的值的集合,例如整数、自然数都是域
2.笛卡尔积(Cartesian Product):笛卡尔积是域上面的一种集合运算。
笛卡尔积可表示为一个二维表,表中每行对应一个元组,表中每一列的值来自一个域
例如,给出3个域:
D1=导师集合SUPERVISOR={张清玫,刘逸}
D2=专业集合SPECIALITY={计算机专业,信息专业}
D3=研究生集合POSTGRADUATE={李勇,刘晨,王敏}
D1,D2,D3的笛卡尔积为
3.关系(Relation)
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码(Candidate key)
若一个关系有多个候选码,则选定其中一个或多个为主码(Primary key)
全码:若所有的属性组是候选码,那么称之为全码
超码:任意候选码的任意父集称为超码
主码:一个关系中有多个候选码,那么选择一个称为主码
主属性:候选码的属性称为主属性,不包含在任何候选码的属性叫做非主属性或非码属性
范式:关系必须满足一定的规范条件,规范化后的关系称为范式
2.1.2关系模式
关系模式是型(静态),关系是值(动态)。
关系模式是对关系的描述:
- 元组集合的结构
- 完整性约束条件
2.2.1基本的关系操作
常用的关系操作:选择,投影,连接,除,并,差,交,笛卡尔积
选择,投影,并,差,笛卡尔积是5种基本操作
数据的更新:插入,删除,修改
2.2.2关系的三类完整性约束
实体完整性
- 主属性非空
参照完整性 - 非主属性为空或者为已定义的属性值
用户定义的完整性 - 针对某一具体的数据库的约束条件,反映某一具体运用所涉及的数据必须满足的语义要求
2.2.3关系代数
选择(从行的角度进行的运算)
如查询信息系(IS系)全体学生
投影(从列的角度)
如查询学生的姓名和所在系
连接(从两个关系的笛卡尔积中选取属性间满足一定条件的元组)
一般连接
- 两个表对应的列符合某个条件的连接,保留所有符合条件的行和列
等值连接
- 对应列值相等的一般连接,保留所有符合的行和列
自然连接(特殊的等值连接)
- R和S具有相同的属性组B,且连接后移除重复列
- 需要两个关系有同名的相同属性,并且自然连接的结果要移除重复列
如:可以先得到两个关系的笛卡尔积,然后筛选出C < E的
悬浮元组与外连接
两个关系R和S在做自然连接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。
外连接(OUTER JOIN)
如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(Null),就叫做外连接
左外连接(LEFT OUTER JOIN或LEFT JOIN):只保留左边关系R中的悬浮元组
右外连接(RIGHT OUTER JOIN或RIGHT JOIN):只保留右边关系S中的悬浮元组
除
综合例子:以学生-课程数据库为例子
查询至少选修了1号课程和3号课程的学生号码
建立一个临时关系K
第三章 关系数据库操作语言SQL
3.1.2 SQL的特点
- 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体
- 可以独立完成数据库生命周期中的全部活动
- 用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据库的运行
- 数据操作符统一
- 高度非过程
- 面向集合的操作方式
- 以同一种语法结构提供多种使用方式
- 语言简洁,易学易用
3.1.3 SQL基本概念
基本表
- 本身独立存在的表
- SQL中一个关系对应一个基本表
- 一个(或多个)基本表对应一个存储文件
- 一个表可以带若干个索引
存储结构
- 逻辑结构组成了关系数据库的内模式
- 物理结构对用户是隐蔽的
视图
- 从一个或几个基本表中导出的表
- 数据库中只存放视图的定义不存放视图对应的数据
- 视图是一个虚表
- 用户可以在视图上再定义视图
3.2 索引的建立与删除
建立索引是为了加快查询速度。
索引是关系数据库的内部实现技术,属于内模式的范畴。
关系数据库常见的索引有:
(1)顺序文件上的索引
- 顺序文件中物理记录的顺序和逻辑记录的顺序是一致的
- 适合顺序存储:可以比较相等,比较大小
(2)B+树索引
- B+树的非叶子节点只包含导航信息,不包含实际值
- 所有的叶子节点和相连的节点使用链表相连
- 适合顺序存储,链表存储,且列值大都不重复(例如身份证,分数)
- 可以比较大小,相等
(3)散列(hash)索引
- 建立若干桶bucket,通过散列函数映射数值-例:求余,把整数值属性映射到10个桶。
- 适合顺序存储,链表存储
- 只适合比较相等,不适合比较大小
- 主要适合文本
(4)位图索引(bitmap index)
- map应该理解为从一个K值列映射为K个二进制列(独热编码)
- 适合只有几个固定值且不频繁更新的列(如性别,婚姻,国别等)
- 只适合比较相等
- 例子,n=5个人,分数有A,B,C三种,生成k=3个长度为n的二进制向量,查分=A时,直接和A对应的第一个位图向量求位与运算
索引的不足
虽然索引大大提高了查询速度,同时可能会显著降低更新表的速度,因为更新表时,DBMS不仅要存储数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件,一般情况这个问题不太严重。
3.2.1 比较不同的索引类型
1.顺序文件上的索引(聚簇存取)
-
可对一组记录建立一个索度引项。这种索引表称为稀疏索引。即不是每一个键值都出现在索引数组中。稀疏索引一定程度上牺牲了精确查找的效率,但大大提高了查询效率。
-
B+树索引可以用来组织适用于组织索引顺序文件的动态索引结构(B+树索引中,所有记录节点都是按键值的大小顺序存放在同一层叶子节点中)
-
聚簇索引下,数据在物理上按顺序排在数据页上。一个表只能有一个聚簇(比如学生,可以按照班级聚簇,那么这个时候就不能再按照学号进行聚簇了),经常连接的多个表也可以按照连接属性值聚簇存放(相当于预连接),例如Student.Sno和SC.sno,利于连接访问,但不利于单表访问
2.非顺序文件的索引(索引存取)
- 需要稠密索引,即每个记录都要有一个索引指针。适合随机读写,不适合批量读写(磁头需要不断移动)
- 非顺序文件的B+树索引:可以比较相等,比较大小。不适合批量读写
- 哈希索引:只适合比较相等,不适合比较大小
- 位图索引:适合只有几个固定值且不频繁更新的列(例如性别,国籍),只适合比较相等
3.3 数据查询
3.3.1 嵌套查询
- 一个SELECT-FROM-WHERE语句称为一个查询块
- 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
SQL语言允许多层嵌套查询
- 即一个子查询中还可以嵌套其他子查询
子查询限制 - 不能使用ORDER BY 子句
相关子查询:总查询次数是m*n
select t.id,t.name,t.pass from student t where 80<=(select f.score from f where f.id=t.id and f.name='xxx')
不相关子查询:
select t.id,t.name,t.pass from t where t.id in (select f.id from f where f.score=70)
select t.id,t.name,t.pass from student t where 80<=(select f.score from f
1.带有IN谓词的子查询
查询与“刘晨”在同一个Sdept的学生的Sno,Sname,Sdept
SELECT Sno ,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept FROM Student WHERE Sname='刘晨');
#用自身连接查询完成要求
SELECT S1.Sno ,S1.Sname,S1.Sdept
FROM Student S1,Student S2
WHERE S1.Sdept=S2.Sdept AND S2.Sname=‘刘晨’;
此查询为不相关子查询
由于DBMS系统对子查询优化不如连接优化做得好,一般鼓励用连接查询代替嵌套子查询
2.带有比较运算符的子查询
SELECT Sno,Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno);
3.带有ANY(SOME)或ALL谓词的子查询
#查询非计算机系中比计算机系任意一个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage<ANY(SELECT Sage FROM Student WHERE Sdept='CS')
AND Sdept<>'CS';
#使用聚集函数代替
SELECT Sname,Sage
FROM Student
WHERE Sage<(SELECT MAX(Sage) FROM Student WHERE Sdept=‘CS’);
4.带有EXISTS,NOT EXISTS谓词的子查询
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值’true’或‘‘false"
- 若内层查询结果非空,则外层的WHERE子句返回真值
- 若内层查询结果为空,则外层WHERE子句返回假值
- 注意这里是否为“空”指是否有返回结果记录行数是否为零
如果exists子查询返回记录但是记录的值为NULL,exists()返回true
#查询没有选修1号课程的学生姓名
SELECT Sname
FROM Student
WHERE NOT EXISTS(
SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1');
3.3.2 集合查询
1.并操作UNION
- 可以将多个查询结果合并起来,并且系统会自动去重。如果需要保留重复元组,需要用union all
#查询选修了课程1和课程2的学生
select Sno from SC where Cno='1'
union
select Sno from SC where Cno='2';
#不用集合查询的写法
select Sno from SC where Cno=‘1’ or Cno=‘2’;
2.交操作intersect
#查询计算机系的学生与年龄不大于19岁的学生的交集
select * from SC where Sdept='CS'
intersect
select *from SC where Sage<='19';
#实际上就是查询计算机系中学生年龄不大于19岁的学生
select *from SC where Sdept=‘CS’ and Sage<=‘19’;
3.差操作except
#查询计算机系中学生与年龄不大于19岁的学生的差集
select * from SC where Sdept='CS'
except
select * from SC where Sage<='19';
#也就是查询计算机系中年龄大于19的学生
select *from SC where Sdept=‘CS’ and Sage>=‘19’;
3.3.3 基于派生表的查询
3.4 数据更新
3.4.1 插入数据
- 插入元组
- 插入子查询结果:可以生成批量需要插入的数据
#对于每一个系,求其平均年龄并放入数据库中
insert into Dept_age(Sdept,Avg_age)
select Sdept,avg(Sage) from Student group by Sdept;
3.4.2 修改数据
1.修改某一个元组的值
update Student set Sage=22 where Sno='2012888';
2.修改多个元组的值
#将所有学生的年龄+1
update Student set Sage=Sage+1;
3.带子查询的修改语句
update Student set Grade=0 where Sno in (
select Sno from Studnet where Sdept='CS'
);
3.4.3 删除数据
1.删除一个元组
delete from Studnet where Sno='201233242';
2.删除所有记录
delete from SC;
3.带子查询的删除语句
delete from SC where Sno in (
select Sno from Student where Sdept='CS'
);
3.4.4 NULL
NULL表示不确定,并不是表示空的意思
空值的约束条件
- 属性定义(或者域定义)中
- 有not null 约束条件的不能取空值
- 标准SQL加了UNIQUE限制的属性不能取空值,但实际上像oracle和mysql都是可以用的,加了也不会报错
- 码属性不能取空值
#找出选修1号课程的不及格的学生
SELECT Sno FROM SC WHERE Grade<60 AND Cno=‘1’;
#注意:查询结果不包括缺考的学生,因为他们的Grade值为null
#选出选修1号课程的不及格的学生以及缺考的学生
SELECT Sno FROM SC WHERE Grade<60 AND Cno=‘1’
union
SELECT Sno FROM SC WHERE Grade is null and Cno=‘1’;
#或者
SELECT Sno FROM SC WHERE Grade<60 AND (Grade<60 OR Grade IS NULL);
3.5 视图
- 虚表,是从一个或几个基本表(或视图)导出的表
- 只存放视图的定义,不存放视图对应的数据
- 基表中的数据发生变化,从视图中查询出的数据也随之变化
3.5.1 定义视图
语法格式:
create view <视图名> [(<列名>[,<列名>]…)] as <子查询> [with check option];
with check option:
- 对视图进行update,insert和delete操作时要保证更新,插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)
#建立信息系学生的视图
create view IS_Student
as
select Sno,Sname,Sage from Student where Sdept='IS';
#如果加上with check option表示要求进行修改和插入操作时仍然保证该视图只有信息系的学生
create view IS_Student
as
select Sno,Sname,Sage from Student where Sdept='IS'
with check option;
基于多个基表的视图:
#建立信息系选修了1号课程的学生的视图(包括学号,姓名,成绩)
create VIEW IS_S1(Sno,Sname,Grade)
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept='IS' AND Student.Sno=SC.Sno AND SC.Cno='1';
基于视图的视图:
#建立信息系选修了1号课程且成绩在90分以上的学生的视图
CREATE VIEW IS_S2
AS
SELECT Sno,Sname,Grade
FROM IS_S1
WHERE Grade>=90;
带表达式的视图:
#定义一个反映学生出生年份的视图
CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2014-Sage
FROM Student;
分组视图:带有聚集函数group by子句的查询来定义视图
#将学生的学号及平均成绩定义为一个视图
CREATE VIEW S_G(Sno,Grade)
AS
SELECT Sno,AVG(Grade)
FROM SC
GROUD BY Sno;
3.5.2 删除视图
语法:drop view 视图名 [cascade]
cascade:级联删除
3.5.3 查询视图
3.5.3 查询视图
3.5.5 视图的作用
- 简化用户操作
- 使用户能够以多种角度看待同一数据
- 对重构数据库提供了一定程度的逻辑独立性
- 能够对机密数据提供安全保护
- 使得可更加清晰的表达查询