易错点
- 视图是虚表,观察到的数据反映的是实际基本表中的数据
- 索引最主要的副作用是维护的代价(更新索引),而不是增加存储空间的消耗
- GROUP BY 会去重
- 只有GROUP BY中的属性列(或者聚合函数)才能出现在SELECT中
- 查询得到的结果不再是关系,因为有可能有重复
- 嵌套查询不能有ORDER BY
关系
- 试述关系模型的三个组成部分。
- 关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成
- 为什么外部码属性的值也可以为空?什么情况下才可以为空?
- 实体完整性规则是指若属性 A 是基本关系 R 的主属性,则属性 A 不能取空值。
- 即属性 F(外码) 本身不是主属性,则可以取空值,否则不能取空值。
- 试述等值连接与自然连接的区别和联系。
- 连接运算符是“=”的连接运算称为等值连接。它是从关系 R 与 S 的广义笛卡尔积中选取 A,B 属性值相等的那些元组
- 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。
SQL
SQL的数据定义包括模式定义,表定义,视图和索引
- 模式(schema)实际上是一个命名空间
查询
- 单表查询
- 查询时,可以对列进行简单运算(大小写更改,加减),也可以指定别名(直接在列名后面写别名)
- 选择表中的若干元祖
确定范围
- Sage between 20 and 30
- 确定集合
- Sdept in ('cs','ff')
字符匹配
Like
%
- 表示任意长度的字符串
- a%b
- 表示以a开头,b结尾的任意长度的字符串
_
- 代表任意单个字符
聚集函数
where语句中不能使用聚集函数作为表达式
- 只能用于group by 和 having
- having作用于组,where作用于基本表和视图
- Sage between 20 and 30
连接操作
- 等值连接
- 在目标中重复的属性列去掉为自然连接
自身连接
- 需要给表取别名FIRST,SECOND
外连接
- 左连接、右连接
- 将悬浮元祖保存在结果关系中
- 嵌套操作
子查询
- 相关子查询
- 子查询的查询条件依赖于父查询
- 例如大于自己的平均成绩的元祖
- 使用
IN
进行嵌套 - 带有
EXISTS
谓词的子查询- 不返回任何数据,只产生逻辑真值,因此其目标列表表达式通常都用*代替
集合查询
参加集合操作的割裂结果的列数必须相同,对应的数据类型也必须相同
- UNION
- 会自动去掉重复元祖
- INTERSECT
- EXCEPT
派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表称为主查询的查询对象。
注意,通过FROM子句生成派生表时,一定要为派生关系指定一个别名。
数据更新
插入操作时,字符串要用单引号括起来。
若没有指明插入的属性名,则每个字段都必须存在,即使为NULL,也要显示的写出来。
插入子查询的结果
INSERT
INTO Dept_Age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
修改数据
UPDATE student
SET Sage=22
WHERE Sno = '...'
视图
WITH CHECK OPTION
- 在视图创建时使用,表示对视图进行UPDATE、INSERT、DELETE操作要保证行满足视图定义中的谓词条件
- 组成视图的属性列名全部省略或全部指定
- 有聚合函数时必须全部指定
- 视图可以建立在一个或多个表上,也可以建立在视图上
视图消解
关系数据库系统执行对视图的查询步骤
- 检查有效性
- 检查查询中涉及的表、视图是否存在,如果存在,把定义的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询
- 有时候不能直接转换,例如WHERE语句中不能使用聚集函数
视图更新
- 并不是所有的视图都可以更新
- 基本表的行列子集视图一般是可以更新的
- 若视图的属性来自集合函数、表达式,则该视图肯定是不可更新的
- 对视图的更新都要转换为基本表的更新,因为有些视图的更新不能唯一有意义的转换为基本表的更新,因此并不能更新
视图的作用
- 简化用户的操作
- 使用户能以多种角度看待同一数据
- 对重构数据库提供了一定程度的逻辑独立性
- 表属性改变时,只需要改变视图,应用程序SQL语句不用修改
- 视图能够对机密数据提供安全保护
- 可以更清晰的表达查询