数据库的本质是用数据库管理系统高效支持的、使用数据结构组织的数据的集合
数据是数据库中存储的基本对象。定义为描述事务的符号记录。数据的含义称为语义,数据与其语义是不可分的。
长期存储在计算机内,有组织的,可共享的大量数据的集合。
数据库基本特征:1.永久存储 2.有组织 3.可共享 4.冗余度小 5.易扩展
位于用户与操作系统之间的一层数据管理软件
数据库管理系统和操作系统一样是计算机的基础软件。
主要功能:提供数据定义语言(DDL)、数据操纵语言(DML)等
数据库系统由数据库(DB),数据库管理系统(DBMS),应用程序和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统。
在计算机出现之前,人们运用常规的手段从事记录、存储和对数据加工,也就是利用纸张来记录和利用计算工具(算盘、计算尺)来进行计算,并主要使用人的大脑来管理和利用这些数据。
在这一阶段(20世纪50年代后期至60年代中期)计算机不仅用于科学计算,还利用在信息管理方面。随着数据量的增加,数据的存储、检索和维护问题成为紧迫的需要,数据结构和数据管理技术迅速发展起来。此时,外部存储器已有磁盘、磁鼓等直接存取的存储设备。软件领域出现了操作系统和高级软件。操作系统中的文件系统是专门管理外存的数据管理软件,文件是操作系统管理的重要资源之一。
程序员必须关注记录结构和不同文件记录之间的联系,工作量大,变成复杂,开发速度慢,缺乏并发控制。
数据库系统的特点:
一、概述
二、数据模型的组成要素
数据模型通常由数据结构、数据操作和完整性约束三个部分组成。
三、逻辑模型的分类(非关系模型与关系模型)
非关系模型:层次模型(Hierarchical Model)、网状模型(Network Model)
关系模型(Relational Model)
层次模型,满足下面两个条件的基本层次联系的集合为层次模型(就是树结构):
①有且只有一个结点没有双亲结点,这个结点称为根结点
②根以外的其它结点有且只有一个双亲结点
网状模型,满足下面两个条件的基本层次联系的集合(一对多关系,结构上像有向图):
①允许一个以上的结点无双亲;
②一个结点可以有多于一个的双亲。
表示方法:E-R图
注意: E-R图中,实体用矩形表示,属性用椭圆表示,关系用菱形表示。
例子:班级号,序号,学号,姓名
学号是一个码,也是一个超码
[班级号,序号]也是一个码
[学号,姓名]是超码,不是码
联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时标明联系的类型(1:1, 1:n, m:n)
比如有两个简单实体,分别是单位和职员,它们的关系就是1:m,一个单位可以有多个职员;
再比如有两个实体,分别是学生和图书,它们的关系就是m:n,从而形成中间表学生借阅的图书,结果是1本图书可以被多人借阅,1个人也可以借多本图书。
数据库系统的三级模式结构:模式(Schema)、外模式(External Schema)、内模式(Internal Schema)
模式(也称逻辑模式)[一个]:
模式的地位:是数据库系统模式结构的中间层
外模式(也称子模式或用户模式)[多个]:
外模式的用途:
内模式(也称存储模式)[一个]:
用途:
1.域(Domain):域是一组具有相同数据类型的值的集合,例如整数、自然数都是域
2.笛卡尔积(Cartesian Product):笛卡尔积是域上面的一种集合运算。
笛卡尔积可表示为一个二维表,表中每行对应一个元组,表中每一列的值来自一个域
例如,给出3个域:
D1=导师集合SUPERVISOR={张清玫,刘逸}
D2=专业集合SPECIALITY={计算机专业,信息专业}
D3=研究生集合POSTGRADUATE={李勇,刘晨,王敏}
D1,D2,D3的笛卡尔积为
3.关系(Relation)
若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码(Candidate key)
若一个关系有多个候选码,则选定其中一个或多个为主码(Primary key)
全码:若所有的属性组是候选码,那么称之为全码
超码:任意候选码的任意父集称为超码
主码:一个关系中有多个候选码,那么选择一个称为主码
主属性:候选码的属性称为主属性,不包含在任何候选码的属性叫做非主属性或非码属性
范式:关系必须满足一定的规范条件,规范化后的关系称为范式
关系模式是型(静态),关系是值(动态)。
关系模式是对关系的描述:
常用的关系操作:选择,投影,连接,除,并,差,交,笛卡尔积
选择,投影,并,差,笛卡尔积是5种基本操作
数据的更新:插入,删除,修改
实体完整性
如查询信息系(IS系)全体学生
如查询学生的姓名和所在系
一般连接
等值连接
自然连接(特殊的等值连接)
两个关系R和S在做自然连接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。
外连接(OUTER JOIN)
如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(Null),就叫做外连接
左外连接(LEFT OUTER JOIN或LEFT JOIN):只保留左边关系R中的悬浮元组
右外连接(RIGHT OUTER JOIN或RIGHT JOIN):只保留右边关系S中的悬浮元组
综合例子:以学生-课程数据库为例子
查询至少选修了1号课程和3号课程的学生号码
建立一个临时关系K
基本表
存储结构
视图
建立索引是为了加快查询速度。
索引是关系数据库的内部实现技术,属于内模式的范畴。
关系数据库常见的索引有:
(1)顺序文件上的索引
(2)B+树索引
(3)散列(hash)索引
(4)位图索引(bitmap index)
索引的不足
虽然索引大大提高了查询速度,同时可能会显著降低更新表的速度,因为更新表时,DBMS不仅要存储数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件,一般情况这个问题不太严重。
可对一组记录建立一个索度引项。这种索引表称为稀疏索引。即不是每一个键值都出现在索引数组中。稀疏索引一定程度上牺牲了精确查找的效率,但大大提高了查询效率。
B+树索引可以用来组织适用于组织索引顺序文件的动态索引结构(B+树索引中,所有记录节点都是按键值的大小顺序存放在同一层叶子节点中)
聚簇索引下,数据在物理上按顺序排在数据页上。一个表只能有一个聚簇(比如学生,可以按照班级聚簇,那么这个时候就不能再按照学号进行聚簇了),经常连接的多个表也可以按照连接属性值聚簇存放(相当于预连接),例如Student.Sno和SC.sno,利于连接访问,但不利于单表访问
SQL语言允许多层嵌套查询
相关子查询:总查询次数是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"
如果exists子查询返回记录但是记录的值为NULL,exists()返回true
#查询没有选修1号课程的学生姓名 SELECT Sname FROM Student WHERE NOT EXISTS( SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1');
1.并操作UNION
#查询选修了课程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’;
#对于每一个系,求其平均年龄并放入数据库中 insert into Dept_age(Sdept,Avg_age) select Sdept,avg(Sage) from Student group by Sdept;
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' );
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' );
NULL表示不确定,并不是表示空的意思
空值的约束条件
#找出选修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);
语法格式:
create view <视图名> [(<列名>[,<列名>]…)] as <子查询> [with check option];
with check option:
#建立信息系学生的视图 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;
语法:drop view 视图名 [cascade]
cascade:级联删除