数据库的4个基本概念
数据管理技术发展和特点
数据管理三个阶段:人工管理->文件系统->数据库系统
文件系统特点——面向某一应用;共享性差、冗余度大;独立性差;记录内有结构、整体无结构;由应用程序自己控制;
数据库系统的特点——数据结构化;数据共享性高、冗余度低且易扩充;数据独立性高; 数据由数据库管理系统统一管理和控制;
数据模型分类
信息世界的基本属性
概念模型的一种表示方法:实体-联系方法(E-R方法 or E-R模型)
E-R图的组成——实体型、属性、联系
逻辑数据模型三要素
常用的逻辑数据模型
关系模型的基本概念
数据库系统的体系结构采用三级模式结构并提供两级映像功能
外模式(external schema)
外模式也称子模式或用户模式,是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
一个数据库可以有多个外模式,而一个应用只能有一个外模式。
模式(schema)
模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
一个数据库只有一个模式。
内模式(internal schema)
内模式也称存储模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。
一个数据库只有一个内模式。
为了实现三个抽象层次的联系和转换,DBS在三级模式之间提供了两层映像
外模式/模式映像
外模式和模式之间的对应关系(可多)。
当模式改变时,由DBA对各个外模式/模式映像作相应改变,可以使外模式保持不变。应用程序是依据外模式编写的,从而应用程序不必改变,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。
模式/内模式映像
唯一
当数据库的存储结构改变时,由DBA对模式/内模式映像作出相应改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,简称数据的物理独立性。
按照逻辑数据模型的三要素,关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。
详细定义书P39(如何从域和笛卡儿积推导到关系)
在用户看来,关系模型中数据的逻辑结构是一张二维表。表的每一行对应一个元组,每一列对应一个域。
看懂定义2.1 2.2 2.3 理解基本概念
超码
可以唯一标识一个元组的属性或属性组
如果k是超码,那么所有包含k的属性组都是超码
候选码(candidate key)
可以唯一标识一个元组的最小属性或最小属性组,称为候选码,也是最小超码。
候选码的诸属性称为主属性,不包含在任何候选码中的属性称为非主属性或非码属性。
如果关系模式的所有属性是这个关系的候选码,称为全码。
主码(primary key)
若一个关系中有多个候选码,则选定一个作为主码
总结,超码包括候选码,候选码包括主码
关系的三种类型
基本关系的6条性质
关系模式是对关系的描述,是关系的抽象。关系是关系模式在某一时间的状态和内容。关系模式是静态的、稳定的,而关系是动态的、随时间不断变化的。关系和关系模式是“值”和“型”的关系。
形式化表示—— R ( U , D , D O M , F ) R(U, D, DOM, F) R(U,D,DOM,F),R:关系名;U:属性名集合;D:域;DOM:属性向域的映像集合;F:属性间数据的依赖集合。
关系数据库
所有关系的集合构成一个关系数据库,关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常就称为关系数据库。
操作的对象和结果都是集合
两大部分
关系模型中的三类完整性约束
实体完整性
主码取值唯一
主码中的属性即主属性不能取空值
参照完整性
F是关系R的一个或一组属性,但不是R的码,Ks是关系S的主码。如果F与Ks相对应,则称F是R的外码,称R为参照关系,S为被参照关系,R和S不一定是同一关系。
则对与R中每个元组在F上的取值必须:(要么为空,要么在Ks的值中选一个)
用户定义完整性
反映某一具体应用的关系数据库所指定约束条件
反映某一具体应用所涉及的数据必须满足的语义要求
违反完整性约束的处理
实体完整性、用户自定义完整性——拒绝执行
参照完整性——拒绝执行;接受此操作,同时执行一些附加操作,以保证数据库状态正确(外键删除,级联更新、删除);
传统的集合运算
参与运算的关系具有相同的n个属性,相应属性取自同一域。
举例见书P49
专门的关系运算
结构化查询语言SQL集数据查询、数据操纵、数据定义和数据控制功能于一体,集数据库定义语言(DDL)、数据库操纵语言(DML)、数据库控制语言(DCL)于一体。
DDL(create)
DML(select insert delete update)
DCL(授权、回收)
SQL功能 | 动词 |
---|---|
数据查询 | SELECT |
数据定义 | CREATE、DROP、ALTER |
数据操纵 | INSERT、UPDATE、DELETE |
数据控制 | GRANT、REVOKE |
数据类型 | 含义 |
---|---|
CHAR(n) CHARACTER(n) |
长度为n的定长字符串 |
VARCHAR(N) CHARACTERVARYING(n) |
最大长度为n的变长字符串 |
CLOB | 字符串大对象 |
BLOB | 二进制大对象 |
INTINTEGER | 长整数(4字节) |
SMALLINT | 短整数(2字节) |
BIGINT | 大整数(8字节) |
NUMERIC(p,d) | 定点数,由p位数字(不包括符号、小数点)组成,小数点后面有d位数字 |
DECIMAL(p,d) DEC(p,d) |
同NUMERIC |
REAL | 取决于机器精度的单精度浮点数 |
DOUBLE PRECISION |
取决于机器精度的双精度浮点数 |
FLOAT(n) | 可选精度的浮点数,精度至少为n位数字 |
BOOLEAN | 逻辑布尔量 |
DATE | 日期,格式为YYYY-MM-DD |
TIME | 时间,格式为HH:MM:SS |
TIMESTAMP | 时间戳类型 |
INTERVAL | 时间间隔类型 |
create scheme <模式名> authorization <用户名>
删除模式
drop scheme <模式名> <cascade|restrict>
定义基本表
create table <表名> (
<列名> <数据类型> [列级完整性约束],
<列名> <数据类型> [列级完整性约束],
....
[,<表级完整性约束>]
);
删除基本表
drop table [cascade|restrict]
修改基本表
alter table <表名>
[add [column] <新列名><数据类型> [完整性约束]]
[add <表级完整性约束>]
[drop [column] <列名> [cascade|restrict]]
[drop constraint <完整性约束> [cascade|restrict]]
[alter column <列名><数据类型>]
select [all|distinct] <目标表达式> [,<目标列表达式>]
from <表名或视图名> [,<表名和视图名>...]|(<select 语句>)[as]<别名>
[where <条件表达式>]
[group by <列名1> [having <条件表达式>]]
[order by <列名2> [asc|desc]]
目标表达式可选
聚集函数的一般格式
count;sum;avg;max;min + ([distinct|all]<列名>)
distinct代表要去掉列中重复值,默认是all
where子句中不能用聚集函数作为条件表达式。聚集函数只能用于select子句和group by中的having子句。
查询条件 | 谓词 |
---|---|
比较 | =, >, <, >=, <=, !=, <>, !>, !<; NOT+前面 |
确定范围 | between and , not between and |
确定集合 | in, not in |
字符匹配 | like, not like |
空值 | is null, is not null |
多重条件(逻辑运算) | and, or, not |
insert into <表名>[(<属性列1[,<属性列2>]...>)] values (<常量1> [,<常量2>]...);
insert into <表名>[(<属性列1[,<属性列2>]...>)] 子查询;
update <表名> set <列名>=<表达式> [,<列名>=<表达式>]... [where <条件>];
update <表名> set <列名>=<表达式> [,<列名>=<表达式>]... [where <列名><谓词>子查询];
delete from <表名> [where <条件>];
delete from <表名> [where <列名><谓词>子查询];
定义视图
create view <视图名> [(<列名> [,<列名>])]
as <子查询>
[with check option]
select sname,2019-age,dept from student;
查询选修了课程的学生学号,并且去除重复的记录
select distinct sno from sc;
查询年龄在19-21岁之间的学生的姓名和年龄
select sname,age from student where age between 19 and 21;
查询年龄不在19-21岁之间的学生的姓名和年龄
select sname,age from student where age not between 19 and 21;
查询计算机专业、物联网专业的学生的姓名和所在系
select sname,dept from student where dept in ('计算机','物联网');
查询所有姓王的学生的姓名和性别、年龄
select sname,sex,age from student where sname like '王%';
查询名字中第二个字为“晓”的学生的姓名和学号
select sname,sno from student where sname like '_晓%';
查询以“DB_”开头,且倒数第三个字符为T的课程的详细情况
select *from course where cname like 'DB/_%T__'escape'/';
查询选修了1号课程的学生的学号及成绩,查询结果按分数的降序排列
select sno,score from sc where cno=1 order by score desc;
查询全体学生情况,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列
select *from student order by dept,age desc ;
查询学生总人数
select count(*) from student;
查询选修了1号课程的学生的平均成绩
select avg(score) from sc where cno=1;
求每个课程号及其选课人数
select cno,count(sno) from sc group by cno;
查询选修了两门以上课程的学生学号
select sno from sc group by sno having count(*)>2
查询平均成绩大于等于80分的学生学号和平均成绩
select sno,avg(score)from sc group by sno having avg(score)>80;
查询每个学生及其选修课程的情况
select student.sno,sname,sex,age,dept,cno,score from student,sc where student.sno=sc.sno;
查询选修1号课程且成绩在80分以上的学生的学号和姓名
select student.sno,sname from student,sc
where student.sno=sc.sno and sc.cno=1 and sc.score>80;
查询每一门课的间接先修课(不要出现NULL结果)
select a.cno,b.pcno from course a,course b where a.pcno=b.cno and b.pcno is not null;
查询与“王一”在同一个系学习的学生的情况
select *from student where dept in (select dept from student where sname='王一');
查询选修了课程名为“DB_DESIGN”的学生学号和姓名(嵌套查询、连接查询)
select sno,sname from student
where sno in (select sno from sc
where cno in (select cno from course where cname='DB_DESIGN'));
查询非物联网系比物联网系任意一个学生年龄小的学生的姓名和年龄
select sname,age from student
where age<any (select age from student where dept='物联网')
and dept<>'物联网';
查询非物联网系比物联网系所有学生年龄都小的学生的姓名和年龄
select sname,age from student
where age<all (select age from student where dept='物联网')
and dept<>'物联网';
查询所有选修了1号课程的学生姓名
select sname from student where exists(select *from sc where sno=student.sno and cno=1);
查询每个学生超过他自己选修课程平均成绩的课程号
select sno,cno from sc x where score >=(select avg(score) from sc y where y.sno=x.sno);
查询选修了全部课程的学生姓名
select sname from student where not exists(
select *from course where not exists(
select *from sc where sc.sno=student.sno and sc.cno=course.cno));
查询至少选修了学生201702001选修的全部课程的学生学号
select distinct sno from sc scx where not exists(
select *from sc scy where scy.sno='201702001' and not exists(
select *from sc scz where scz.sno=scx.sno and scz.cno=scy.cno));
数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
数据库不安全因素
安全性控制的常用方法
grant <权限>[,<权限>...]
on <对象类型><对象名>[,<对象类型><对象名>...]
to <用户>[,<用户...>]
[with grant option]
如果指定了 with grant option ,则获得某种权限的用户还可以把这种权限再授予其他用户。
如果没有指定,则只能使用权限而不能传播。
revoke <权限>[,<权限>...]
on <对象类型><对象名>[,<对象类型><对象名>...]
from <用户>[,<用户>...]
[cascade|restrict]#默认值是cascade
实体完整性
单个主码可以在列级定义也可以在表级定义
多个主码只能在表级定义
参照完整性
维护参照完整性的策略:
若修改被参照表会破坏参照完整性,则可选择拒绝执行/级联操作/设置为空。
例子:
on delete cascade #当删除被参照表中元组时,级联删除参照表中相应元组值
on update cascade #当更新被参照表主码时,级联更新参照表中相应元组值
on delete no action #当删除被参照表中元组造成不一致时,拒绝删除
用户定义完整性
check (sex in (‘男’,‘女’))
check (grade >=0 and grade <=100)
为什么要规范化
为了防止:
数据依赖
数据依赖是一个关系内部属性与属性之间的一种约束关系。其中最重要的两个依赖是:
定义
X,Y是一个关系模式属性集U的子集,X决定Y,即Y依赖于X,记作X → \to →Y,属性组U上的一组函数依赖F可以写成
F = { S n o → S d e p t , S d e p t → M n a m e , ( S n o , C n o ) → G r a d e } F=\lbrace Sno\to Sdept, Sdept\to Mname, (Sno, Cno)\to Grade \rbrace F={Sno→Sdept,Sdept→Mname,(Sno,Cno)→Grade}
平凡\非平凡函数依赖
完全\部分函数依赖
传递依赖
如果 X → Y X\to Y X→Y ( Y ⊈ X ) (Y\nsubseteq X) (Y⊈X), Y ↛ X Y\nrightarrow X Y↛X, Y → Z Y\to Z Y→Z ( Z ⊈ Y ) (Z\nsubseteq Y) (Z⊈Y),则称Z对X传递函数依赖。记为 X → 传 递 Z X\stackrel{传递}\to Z X→传递Z。
规范化
一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫做规范化。
第一范式(1NF)
关系模式满足:
第二范式(2NF)
关系模式在满足1NF的情况下还应满足:
第三范式(3NF)
关系模式在满足2NF的情况下还应满足:
BC范式(BCNF)
关系模式在满足3NF的情况下还应满足:
第四范式(4NF)
消除非平凡的非函数依赖的多值依赖
定义
设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值有一组Y的值,这组值仅仅决定于x值而与z值无关。
若X→→Y,而Z为空集,则称X→→Y为平凡的多值依赖;若Z不为空,则称其为非平凡的多值依赖。
逻辑蕴涵
对于满足一组函数依赖F的关系模式R< U, F >,其任何一个关系r,若函数依赖X→Y都成立,则称F逻辑蕴涵X→Y
Armstrong公理系统
三律
三规则
闭包
数据库设计的基本步骤
将概念模型转换为关系模型
数据库的运行和维护