理论
关系模型
码
超码
K⊆R,K的值可以表示R中每一个元素(唯一标识),则K为R的超码,可以是一个属性,也可以是一个属性组
K是R的超码,K的任意子集也是R的超码
K中可能有无关属性
候选码
K为最小化的超码,则K为一个候选码
候选码的任意一个子集都不能唯一标识一个记录(最小性)
主码
某一个能唯一标识一条记录的最小属性集
只能存在一个主码
外码
R1中的属性组A,在R2中为主码B,A为R1的外码
A在R1中的取值要参照R2
形式化关系查询语言
关系代数
基本运算
选择
选择满足给定条件的元组
σp(r)
查询Physics系教师:σ dept_name=“Physics”(instructor)
查询Physics系且年薪高于90000的教师:
σ dept_name=“Physics” ^ salary>90000(instructor)
查询Physics系或年薪高于90000的教师:
σ dept_name=“Physics” V salary>90000(instructor)
投影
返回作为参数的那个关系的所有数据
如果有重复数据,只返回一个
πA1,A2…Ak ® A1,A2,Ak为需要返回的属性名
列出教师信息:πID,name,salary (instructor)
笛卡尔积
结合任意两个关系的信息,两个关系里的所有元素都配对
r1×r2
instructor关系与teacher关系的笛卡尔积:instructor×teacher
若出现有完全相同的元组,则要加上前缀,如instructor.ID,teacher.ID
以下为表达式之间的运算
交运算
∩(和选择内的交运算区分)
差运算
-
并运算
∪(和选择内的并运算区分)
附加运算
连接运算
筛选出两个关系中指定属性相同的元组
将选择运算和笛卡尔积运算合并到一个运算中
将instructor关系和teacher关系通过ID联系在一起
内连接:等值连接(包括重复列)、自然连接(不包括重复列)
外连接:左外连接(内连接+左边表中没有匹配的元组)、右外连接(内连接+右边表中没有匹配的元组)、全外连接(内连接+左右)
赋值
通过一个代数表达式中的一部分赋值给临时的关系变量
←
Physics←σ dept_name=“Physics”(instructor)
更名
ρx(E) 返回E的结果,用x命名(把E表命名为x)
ρx(A1,A2…An)(E) 把E表命名为x,且属性依次命名为A1,A2…An
关系演算
元组关系演算
域关系演算
数据库设计
需求分析
通过详细调查现实世界要处理的对象,充分了解工作情况,明确用户需求,然后确定新系统的功能。
概念设计
ER图
逻辑设计
规范化理论
实体:如学生,教师等
属性:如姓名,学号等
联系:一对一,一对多,多对一等
映射基数:1:1,1:m,m:1
函数依赖
X→Y
平凡函数依赖:X决定Y,但是Y不在X中
非平凡函数依赖:↑反之
完全函数依赖:X中所有属性才能决定Y
部分函数依赖:↑反之
传递函数依赖:X→Y,Y→Z,Y,Z不被X包含,Z不被Y包含,Y!→X,则Z传递函数依赖X
范式
数据库中关系是要满足一定要求的,满足程度不同的要求称之为不同范式
规范化:一个低一级范式的关系模型通过模式分解,转化为若干高一级的范式关系模式,这个过程称为规范化
大题
求闭包
实践
SQL语言
DDL语言
CREATE
创建数据库
CREATE DATABASE A(数据库名)
ALTER
修改表中的字段或索引
ALTER TABLE A ADD B
ALTER TABLE A DROP B
ALTER TABLE A MODIFY B
A:数据库名
B:新列名称+新列数据结构
DROP
删除数据库
DROP DATABASE A(数据库名)
DML语言
SQL不区分大小写
SQL允许在关系和查询中出现重复
INSERT
INSERT INTO A vales (‘B’,‘C’,)
A:表名
B、C:字符串加 ’ ’ ,数字不加
DELETE
DELETE FROM A(数据库名)
UPDATE
UPDATE A SET B
A:数据库名
B:执行语句
SELECT
SELECT A FROM B WHERE C
A:属性
B:关系
C:谓词
select允许重复,若要删除重复,可在select后加distinct
语句可以不包含from后面的部分,结果为一列一行的表,内容为A
select语句可以含有运算符±*/等
WHERE
跟在from后面
允许使用逻辑连接词
连接词运算对象可以包括比较运算符(<,>,=等)
select name from instructor where dept_name = ‘COMP’ and salary >7000
BETWEEN
跟在where后
表示筛选在区间内的元组
工资在9000-10000:select * from instructor where salary between 9000 and 10000
多关系查询
涉及到笛卡尔积运算
select * from instructor,teachers
select name,course_id from instructor,teachers where instructor.ID=teachers.ID and instructor.dept_name=‘a’
字符串运算
==%==匹配任意字符串,随便多长
==_==匹配单个字符
%ar%匹配含有ar的元组
_ _ _匹配三个字符的字符串
_ _ _%匹配至少含有三个字符的字符串
集合运算
或:union
(select * from instructor where name = ‘a’)union(select * from section where semester = ‘spring’)
与:intersect
(select * from instructor where name = ‘a’)intersect(select * from section where semester = ‘spring’)
差:expect
(select * from instructor where name = ‘a’)expect(select * from section where semester = ‘spring’)
上述运算会自动删除重复项,若要保留,则使用:union all、intersect all、except all
聚集函数
avg(平均值)、min(最小值)、max(最大值)、sum(求和)、count(计数)
select avg(salary) from instructor where name=‘a’
count可以搭配distinct一起使用:count(distinct a)
分组聚集
group by
放在where后
select dept_name from instructor where name=‘a’ group by dept_name
HAVING
跟在group by后面
作为group by的补充,对分组后的数据进行过滤
group by dept_name having avg(salary) > 4200 按平均工资大于4200的年薪分组
ORDER BY
order by A(属性)
按照A排序,先group by 后order by
默认升序,可在后面 + desc(降序)asc(升序)
可对多个属性进行排序:order by dept_name decs,name(先按dept_name降序排序,同名则按name升序排序)
集合成员资格
求交集:select name from instructor where name=‘a’ and course_id in (select course_id from section where year=‘2018’)
求差集:select name from instructor where name=‘a’ and course_id not in (select course_id from section where year=‘2018’)
EXISTS
与的另一种写法
select name from instructor where name=‘a’ and exists (select * from section where semester = ‘spring’)
e=‘a’ and course_id in (select course_id from section where year=‘2018’)
求差集:select name from instructor where name=‘a’ and course_id not in (select course_id from section where year=‘2018’)
EXISTS
与的另一种写法
select name from instructor where name=‘a’ and exists (select * from section where semester = ‘spring’)