1 嵌套查询
(不)相关子查询
1.不相关子查询
特点:由子向父执行(子 -> 父),且父查询和子查询可以轻松分开单独处理
父子查询仅有查询结果直接的关系(父用子的结果),而查询条件之间无依赖,则为不相关子查询
2.相关子查询
特点:
- 父查询和子查询使用一些相同的查询条件,所以不易分开处理
- 相关子查询不能一次就求解出子查询的结果,必须反复求值 (重点)
- 相关子查询事先规定了执行规则,有固定处理顺序
执行规则:
- 外层查询条件的表中取出一个元组,传送给内层
- 执行内层查询,得到一个结果,返送给外层
- 执行外层查询,得到一个结果,作为这一次查询结果
- 执行步骤1,直到外层查询条件的表的元组全部取完
1.带有IN谓词的子查询
子查询的结果为一个集合时,往往使用IN。
where 属性 IN(子查询)属性在哪个集合当中
2.带有比较运算符的子查询
where 属性=、>、<、>=、<=、!= (子查询)
找出每个学生超过他自己选修课程平均成绩的课程号
select Sno,Cno
from SC x //别名
where Grade>=(select avg(Grade)
from SC y //别名
where y.Sno=x.Sno) //子查询的学生和父查询比较的是同一个人
(相关子查询)
3.带有ANY(SOME)或ALL谓词的子查询
any:任意all:全部
使用比较运算符+any / all。
一般可以用聚集函数代替。
= | != | < | <= | > | >= | |
---|---|---|---|---|---|---|
any | IN | <MAX | <=MAX | >MIN | >=MIN | |
all | NOT IN | <MIN | <=MIN | >MAX | >=MAX |
4.带有exists的子查询
exists:存在not exists:不存在
带有exists谓词的子查询 不返回任何数据,只产生逻辑真值 “true” 或逻辑假值 “false” 。
若子查询结果非空,则外层的where子句返回“true”,否则返回“false”。
exists子查询不能被其他形式的子查询所替换。
其他三种都能用exists子查询等价替换。
SQL中没有全称量词,只能用存在量词等价替换全部做某事==不存在一个不做某事的。
2 集合查询
并操作:union 用union合并时,系统会自动去掉重复元组。保留用 union all 操作符交操作:intersect
差操作:except 可以用 条件1 AND 取反条件2 代替
两个查询块之间用union , intersect , except
3 基于派生表的查询
子查询不仅出现在where子句中,还可以出现在from子句中,这是子查询生成的临时派生表成为主查询的查询对象。
在派生表后面必须指定一个别名,方便在下面where语句中使用派生表其属性
如果派生表中有聚集函数列,在其别名时需加上(属性列,聚集函数的别名)