关系型数据库
绪论
概念间的关系
数据->数据库->数据库管理系统->数据库系统
数据:存储在某种媒体上可加以鉴别的符号资料。即:对现实世界中客观事物的符号表示(描述事物的符号记录),可以是数值数据,也可以是非数值数据,如声音、图像等。
数据库(DB) :长期储存在计算机内的有组织的、可共享的相关数据的集合。
数据库管理系统:DBMS是介于用户与操作系统之间的一层数据管理软件。为用户或应用程序提供访问DB的方法,包括DB的建立、查询、更新及各种数据控制。DBMS是基于某种数据模型。
数据库系统 :数据库系统(DBS)通常是指带有数据库的计算机应用系统。包括数据库、相应的硬件、软件和各类人员。
数据库技术 :数据库技术是研究数据库的结构、存储、设计、管理和使用的一门软件学科;是一门综合性较强的学科。
数据库的历史
人工管理阶段 -> 文件系统阶段 -> 数据库系统阶段->高级数据库系统阶段
数据库系统结构:三级模式、二级映射
- 外模式:用户
- [概念]模式
- 内模式:数据库的物理存储
信息和数据
信息抽象于现实,可用E-R图描述,包括:
- 实体 entity :具体的事物 或 抽象概念 或 他们之间的联系
- 实体集 entity set
- 属性 attribute
- 属性域 domain :属性的取值范围
- 码 key :唯一标识实体的属性(集)
- 实体型 entity type
- 联系 relationship
不同实体型之间有三种联系:1:1,1:n,m:n (可以没有)
数据由信息转化,对应计算机,包括:
- 字段 field 或数据项 data item:标记实体的属性
- 记录 record
- 记录型
- 文件
- 码 key
数据模型
分类:层次模型 hierarchical model ,网状模型 network model,关系模型 relational model ,面向对象数据模型 object oriented data model ,对象关系数据模型,半结构化数据模型等
操作:增删改查
数据结构:
- 码、主关键字 primary key:唯一标识
- 域 domain
- 行=元组 tuple =记录
- 列=属性 attribute =字段
- 主属性包括主码、候选码
- 分量
完整性约束:实体完整性、参照完整性、用户定义完整性(用户自定义域)
关系模型
描述:关系名(属性1,属性2,……属性n)
关系的每一个分量必须是不可分的数据项
数据结构
- 域 domain
值域,表示属性的取值范围
域中所包含的值的个数称域的基数(m) - 笛卡尔积 cartesian product
D 1 × D 2 = { ( d 1 , d 2 ) ∣ d i ∈ D i } D_1\times D_2=\{(d_1,d_2)|d_i\in D_i\} D1×D2={(d1,d2)∣di∈Di}
( d 1 , d 2 ) (d_1,d_2) (d1,d2)为 [二]元组,其中的每一个值叫做分量
笛卡尔积的基数是各域的基数之积 - 关系 relation
笛卡尔积的子集叫在域D1,…Dn上的关系,表示为 R ( D 1 , D 2 , . . . , D n ) R(D_1,D_2,...,D_n) R(D1,D2,...,Dn)
R是关系的名字,n是关系的目或度
若关系中,某一属性组的值能唯一地标识一个元组,而其子集不能,则称候选码,候选码的诸属性称为主属性。候选码可只包含一个属性,也可能包含全部属性,此时称为全码。
从候选码中选出一个来作为主码,主码也可以是多个属性共同构成的。
外部码,在本关系中不是码,但是其他某一关系的码。
笛卡尔积没有意义,其子集才有意义。关系必须是有限集合。
关系可有:基本表(实际)、查询表、视图表(虚表)
关系完整性
- 实体完整性 entity integrity
主属性不能取空 - 参照完整性 referential integrity
属性F是关系R的属性但不是R的码,K是关系S的主码,F与K定义在同一个域上(相对应),则F是R的外部码,R是参照关系,S是被参照关系(目标关系),R中任一元组在F上的值为:F=S中某个元组的K值 或 空值 - 用户定义完整性 user-defined integrity
用户自定义域
关系操作
增删改查
查询包括:选择、投影、连接、除、并、差、交、笛卡尔积
标粗的是基本操作,其他操作可以用五种基本操作来定义和导出
语言
- 关系代数语言 relational algebra 查询 ISBL
- 关系演算语言 relational calculus 查询 元组演算:ALPHA 域演算:QBE
- 关系数据库标准语言 SQL(structured query language) 更加强大
只需要给出查询,不需要考虑如何实现查询
关系代数语言
只能做一部分查询操作
集合运算:
- 并union:R和S具有相同目n,且相应属性取自同一个域 R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S=\{t|t\in R\vee t\in S\} R∪S={t∣t∈R∨t∈S}
- 差except:R和S具有相同目n,且相应属性取自同一个域
R
−
S
=
{
t
∣
t
∈
R
∧
t
∉
S
}
R- S=\{t|t\in R\wedge t\notin S\}
R−S={t∣t∈R∧t∈/S}
从R中减去和S相同的 - 交intersection:R和S具有相同目n,且相应属性取自同一个域 R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R\cap S=\{t|t\in R\wedge t\in S\} R∩S={t∣t∈R∧t∈S}
- 广义笛卡尔积 cartesian product:连接
引入表示符号:
-
关系 R ( A 1 , A 2 , . . . , A n ) R(A_1,A_2,...,A_n) R(A1,A2,...,An)
有 t ∈ R , t\in R, t∈R,其中t是元组
t [ A i ] t[A_i] t[Ai]表示元组t中的分量Ai
A是属性列/域列
A ˉ \bar{A} Aˉ表示从关系中去掉A属性后剩余的属性组 -
R是n目关系,S是m目关系, t r ∈ R , t s ∈ S t_r\in R,t_s\in S tr∈R,ts∈S
是元组的连接 concatenation,是一个(n+m)列的元组
-
给定关系R(X,Z),XZ为属性组,定义当t[X]=x时,x在R中的象集images set是 Z x = { t [ Z ] ∣ t ∈ R , t [ X ] = x } Z_x=\{t[Z]|t\in R,t[X]=x\} Zx={t[Z]∣t∈R,t[X]=x},它表示R中属性组X上值为x的各元组在Z上分量的集合
关系运算:
- 选择运算 selection/restriction:选择元组
σ
F
(
R
)
=
{
t
∣
t
∈
R
∧
F
(
t
)
=
t
r
u
e
}
\sigma_F(R)=\{t|t\in R\wedge F(t)=true\}
σF(R)={t∣t∈R∧F(t)=true}
F是一个公式,由逻辑运算符 ∨ ∧ ¬ \vee \wedge \neg ∨∧¬连接算数表达式 > < ≥ ≤ = ≠ > < \ge \le = \ne ><≥≤==构成 - 投影运算projection:选择列 π A ( R ) = { t [ A ] ∣ t ∈ R } \pi_A(R)=\{t[A]|t\in R\} πA(R)={t[A]∣t∈R},取消重复行
- 连接运算join:
R
⋈
F
S
R\underset{F}{\Join} S
RF⋈S
- 等值连接:F中算数表达式是=, R ⋈ A = B S R\underset{A=B}{\Join} S RA=B⋈S
- 自然连接(常用且默认):进行比较的分量必须是相同的属性,并且在结果中去掉重复的属性 R ⋈ S R\underset{}{\Join} S R⋈S,会有悬浮元组消失
- 半连接 :自然连接后仅保留对R属性的投影
- 左外连接:若S中找不到匹配的元组,则不匹配的元素用空值匹配
- 右外连接:若R中找不到匹配的元组,则不匹配的元素用空值匹配
- 全外连接:所有不匹配的元组均用空值匹配
- 除:R(X,Y),S(Y,Z),
R
÷
S
=
{
t
r
[
X
]
∣
t
r
∈
R
∧
Y
X
⊇
π
Y
(
S
)
}
R\div S=\{t_r[X]|t_r\in R\wedge Y_X\supseteq \pi_Y(S)\}
R÷S={tr[X]∣tr∈R∧YX⊇πY(S)}
X的象集Yx包含S在Y上的投影
运算之间的转换:
R
∩
S
=
R
−
(
R
−
S
)
或
S
−
(
S
−
R
)
R\cap S=R-(R-S)或S-(S-R)
R∩S=R−(R−S)或S−(S−R)
R
÷
S
=
π
X
(
R
)
−
π
X
(
(
T
∗
π
Y
(
S
)
−
R
)
R\div S=\pi_X(R)-\pi_X((T*\pi_Y(S)-R)
R÷S=πX(R)−πX((T∗πY(S)−R)
此处应看ppt
关系演算语言
元组关系演算语言 ALPHA语言
可以做所有查询操作、以及增删改(更新)操作
基本格式:操作语句 工作空间名(表达式):操作条件
查询操作:GET
GET W (SC.CNO)
GET W (S.SNO,S.Sage):S.Sdept=‘CS’ DOWN S.Sage DOWN表降序排序
GET W(1)(S.SNO) 取一个符合条件的元组
- 元组变量:简化关系名、使用量词
RANGE STUDENT X
GET W (X.SNAME):X.Sdept=‘CS’
- 存在量词:必须使用元组变量
RANGE SC X
GET W (S.SNAME): ∃ \exist ∃X(X.SNO=S.SNO ∧ \wedge ∧X.CNO=‘2’)
可以变为前束范式的形式
- 全程量词
查询不选1号课程的学生的名字
RANGE SC SCX
GET W(S.Sname): ∀ \forall ∀SCX(SCX.SNO!=S.SNO ∨ \vee ∨SCX.CNO!=‘1’)
还可以用 ¬ ∃ \neg\exist ¬∃,两种量词组合
- 用蕴含implication的检索
查询最少选修了201215122学生所选课程的学生学号
RANGE Course CX
SC SCX
SC SCY
GET W(S.SNO): ∀ C X ( ∃ S C X ( S C X . S N O = ′ 20121512 2 ′ ∧ S C X . C N O = C X . C N O ) ⇒ ∃ S C Y ( S C Y . S N O = S . S N O ∧ S C Y . C N O = C X . C N O ) ) \forall CX(\exist SCX(SCX.SNO='201215122'\wedge SCX.CNO=CX.CNO)\Rightarrow \exist SCY(SCY.SNO=S.SNO\wedge SCY.CNO=CX.CNO)) ∀CX(∃SCX(SCX.SNO=′201215122′∧SCX.CNO=CX.CNO)⇒∃SCY(SCY.SNO=S.SNO∧SCY.CNO=CX.CNO)) - 聚集函数
一些简单的计算,如COUNT,TOTAL,MAX,MIN,AVG
GET W(COUNT(S.Sdept)) COUNT会自动排除重复值
更新操作
- 修改
HOLD是带并发控制的GET
更新必须先用HOLD读入,然后用宿主语言修改,然后UPDATE送回
主码不能修改 - 插入
宿主语言建立新元组,然后用PUT插入关系中 - 删除
用HOLD读入到工作空间,用DELETE删除
域关系演算语言 QBE语言
SQL语言
有交互式和嵌入式,非常好的语言
常用
- 数据类型
字符型:CHAR(n),VARCHAR(n)
数字型:INT,SMALLINT,REAL
日期型:DateTime,SmallDateTime
其他:Image - 函数
ABS(X),SQRT(X),RAND(X),LOG(X)
LENGTH(X),LOWER(X),UPPER(X),SUBSTRING(expression,start,length)
COUNT,MAX,MIN,AVG,SUM
日期函数
转换函数
其他函数
查询语句
select [all|distinct] [表名.]{*|列名|表达式[as 新列名]}--投影
[into :主变量1 [,:主变量2]...]
from 表名[表别名] --表->内存
where 条件表达式|子查询 --选择元组
group by 列名1,... --分组
having 分组表达式
[union|intersect|except]select ... from ... --查询结果的集合运算
order by 列名|列序号[asc|desc],... --排序输出
单表查询
select
:
*
列全选Sdept,Sname
选择系和姓名2020-Sage birthday
更名输出lower(Sdept)
小写字母输出distinct
消除重复行,缺省为allround(sal/22.0)
计算后四舍五入
where
:
- 比较
< <= > >= = !=
- 确定范围
between a and b
,not between a and b
(not) in
如:sedept in ('ie','cs','ma')
(not) like
字符匹配%
匹配任意字符串_
匹配单个字符(英文),如需使用通配符,需加\
转义,如cname like '%\_%' escape'\'
is (not) null
and or not
group by
:
将查询结果按照列分组,值相等的为一组,一个分组以一个元组的形式出现,只有出现在group by中的属性,才可出现在select后面
组函数COUNT,MAX,MIN,AVG,SUM可以用在select后,也可用在having的分组表达式中,having用于筛选分出的组
order by
:
desc降序,asc升序
空值看作最大值
连接查询
多表连接:
where s.sno=sc.sno
或where sal between losal and hisal
单表连接:
用表别名把一个表定义为两个不同的表,如:求比本部门职工工资低的部门负责人
select w.ename,w.sal,m.ename,m.sal
from emp w,emp m
where w.mgr=m.empno and w.sal>m.sal
外连接:
在连接条件的某侧加上*或+,表示该侧对应的表中可形成一个各数据项均为空值的万能替代行,用来与另一侧对应表中所有不满足条件的元组连接,对应右外连接、左外连接、全外连接,如:where dept.deptno=emp.deptno(*)
右外连接:
select ...
from dept right join` emp on dept.deptno=emp.deptno
select ...
from dept full jion emp on dept.deptno=emp.deptno
复合条件连接:
where
中还有其他限制条件
嵌套查询
在where
中嵌套select语句块
,外面是父查询,里面是子查询,子查询中不允许使用order by
返回单个值的子查询:
select sname,sage
from s
where sdept=
(select sdept
from s
where sname='zhangsan');
可以用嵌套查询做,也可以用单表连接做,但是效率不一样
返回一组值的子查询:
用in
表等于 或者 < any[=max (sage)]
比某一小 或者 比全部小<all
多重子查询
反复嵌套
from里面也可以放子查询,+as搞成新表
select sno,avg_g
from (select sno,avg(all grade)
from sc
group by sno)
as newr(sno,avg_g)
where avg_g>70;
带有exists的相关子查询
相关子查询:子查询的查询条件依赖于外层父查询的某个属性值
带exists的子查询不返回数据,只返回true或false
select sname
from s
where exists
(select *
from sc
where s.sno=sc.sno and cno='c1');
不关心子查询的具体内容,所以用*
反过来用not exists
集合操作
属性个数必须一致,对应类型必须一致,属性名要无关,缺省为distinct
一个查询得到的结果{集合操作}另一个查询得到的结果
union并
交用where里and做
not in差
更新语句
插入 insert
插入单个元组
insert into 表名[(列名1,...)] --如果插入元组的全部列值,可省略列名
values (值1,...)
插入子查询的的结果
insert into 表名 [(列名1,...)](子查询)
删除 delete
delete from 表名
[where 条件] --不写条件则清空表
只能删元组,不能删属性
只对单表起作用
条件可以带子查询
修改 update
update 表名
set 列名=表达式,... 或者(列名,...)=(子查询)
where 条件
数据定义
建表 create
create table 表名(
列名 类型(长度) [not null]
[default {常量|系统变量|null}]
[列约束],...
)
[primary key (列名,...)]
[foreign key (列名,...) references 表名(列名,...)]
[check 条件];--此处可以改成 as 子查询
删表 drop
drop table 表名
[cascade|restrict];
cascade表示连同视图、完整性约束一起撤销
restrict 无引用时才可撤销
修改
alter table 表名
[add 新列名 类型(长度) [not null][列约束],...]
[modify 旧列名 类型(长度)]
[drop 列约束]
[rename 旧表名 to 新表名];