子查询
1.1.1
1),带有any(some) 或all谓词的子查询。
any 大于子查询结果的某个值
all 大于子查询结果中的所有值
=any 大于等于子查询结果中的某个值
=all 大于等于子查询结果中的所有值
=any 等于子查询结果中的某个值
=all 等于子查询结果中的所有值
2),带有exists谓词的子查询
语法含义:带有exists谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
a,
使用存在量词exists后,若内层查询结果非空,则外层的where子句返回真值(类似于可以查到值,然后显示出来),否则返回假值(类似于查不到值)。
b,
与exists相对应的是not exists谓词。使用存在量词not exists后,若内层查询结果为空,则外层的where子句返回真,否则返回假值。
3) , 基于派生表的查询
子查询不仅可以出现在where子句中,还可以出现在from子句中,这时子查询生成的派生表成为主查询对象。
通过from子句生成派生表时,as关键字可以省略,但必须为派生表指定一个别名。
select*from a,(select age,avg(grade) from b) as r(age,age(grade));
1.1.2
集合查询
集合操作主要包括并操作union,交操作intersect和差操作except.
a,union
使用union将多个查询结果合并起来时,系统会自动去掉重复元组。如果要保留重复元组则用union all 操作符。
b,intersect (交集操作)
同时满足多个条件的查询结果 (类似于and)
【例3.67】查询计算机科学系的学生与年龄不大于19岁的学生的交集。
selectfrom student where sdept=‘cs’ intersect selectfrom student where age<=19;
也就是查询计算机科学系中年龄小于等于19岁的学生。
select*from student where sdept=‘cs’ and age<=19;
c,except 求差
【例3.68】查询计算机科学系的学生与年龄不大于19岁的学生的差集。
selectfrom student where sdept=‘cs’ except selectfrom student where age<=19;
也就是查询计算机科学系中年龄大于19岁的学生。
select*from student where sdept=‘cs’ and age>19;