目录
带有EXISTS谓词的子查询
exists谓词
例子
not exists谓词
例子
不同形式的查询间的替换
用EXISTS/NOT EXISTS实现全称量词
用EXISTS/NOT EXISTS:实现逻辑蕴涵
集合查询
并操作UNION
交操作INTERSECT
差操作EXCEPT
基于派生表的查询
select语句的基本格式
带有EXISTS谓词的子查询
exists谓词
EXISTS谓词代表存在量词,带有EXISTS谓词的子查询只返回逻辑真值“true”或逻辑假值“false'”
例子
【例】查询所有选修了1号课程的学生姓名。
SELECT Sname FROM Student WHERE EXISTS(SELECT FROM SC WHERE Sno=Student.Sno AND Cno=1')
将student表里的数据一条一条带入到子查询中,看是不是选修了课程号1的。
使用存在量词EX1STS后,若内层查询结果非空,)则外层的WHERE子句返回真值;否则返回假值。
not exists谓词
若内层查询结果非空,则外层的WHERE子句返回假值,若内层查询结果空则外层的WHERE子句返回真值
例子
查询没有选修1号课程的学生姓名。
SELECT Sname FROM Student WHERE NOT EXISTS(SELECT FROM SC WHERE Sno Student.Sno AND Cno =1')
不同形式的查询间的替换
一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换;
所有带IN谓词、比较运算符、 ANY和ALL谓词的子查询都能完成对EXISTS谓词的子查询等价替换。
用EXISTS/NOT EXISTS实现全称量词
SQL语言中没有全称量词(For all)。可以把带有全称量词的谓词转换为等价的带有存在量词的谓词
用EXISTS/NOT EXISTS:实现逻辑蕴涵
SQL语言中没有蕴涵(Implication)逻辑运算,可以利用谓词演算将逻辑蕴涵谓词等价转换
p推出q,q推不出p。
集合查询
并操作UNION
SELECT * FROM Student WHERE Sdept='CS UNION SELECT FROM Student WHERE Sage≤=19
UNION:将多个查询结果合并起来,系统自动去掉重复元组
UNION ALL:将多个查询结果合并起来时,保留重复元组。
交操作INTERSECT
查询计算机科学系的学生氖年龄不大于19岁的学生的交集。
SELECT FROM Student WHERE Sdept='CS' INTERSECT SELECT FROM Student WHERE Sage<=19
差操作EXCEPT
【例】查询计算机科学系的学生与年龄不大于19岁的学生的差集。
SELECT FROM Student WHERE Sdept='CS'; EXCEPT SELECT FROM Student WHERE Sage<=19;
查询的结果在前面的集合里但不在后面的集合里。
基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表(derived table)成为主查询的查询对象。
如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其默认属性。
select语句的基本格式
SELECT [ALL / DISTINCTI<目标列表达式>[别名][<目标列表达式>[别名]
FROM<表名或视图名>[别名] <表名或视图名>[别名
WHERE<条件表达式>
[GROUP BY<列名>
[HAVING<条件表达式>
[ORDER BY<列名2>[ASC / DESC]