本文最后更新于:2024年3月18日 凌晨
SQL 集合查询
- SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作,集合操作主要包括并操作UNION,交操作INTERSECT和差操作EXCRPT
- 参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。
UNION
[例3.64]:查询计算机科学系的学生及年龄不大于19岁的学生。
1 2 3 4 5 6 7
| SELECT * FROM Student WHERE Sdept='CS' UNION SELECT * FROM Student WHERE Sage <= 19;
|
- 本查询实际上是求计算机科学系的所有学生与年龄不大于19岁的学生的并集,使用UNION将多个查询结果合并起来时,系统会自动去掉重复元组,如果要保留重复元组则用UNION ALL操作符。
[例3.65]:查询选修了课程1或者选修了课程2的学生。
- 本例即查询选修课程1的学生集合与选修课程2的学生集合的并集。
1 2 3 4 5 6 7
| SELECT Sno FROM SC WHERE Cno='1' UNION SELECT Sno FROM SC WHERE Cno='2';
|
INTERSECT
[例3.66]:查询计算机科学系的学生与年龄不大于19岁的学生的交集。
1 2 3 4 5 6 7
| SELECT * FROM Student WHERE Sdept='CS' INTERSECT SELECT * FROM Student WHERE Sage<=19;
|
- 这实际上就是查询计算机科学系中年龄不大于19岁的学生。
1 2 3 4
| SELECT * FROM Student WHERE Sdept='CS' AND Sage<=19;
|
[例3.67]:查询既选修了课程1又选修了课程2的学生,就是查询选修课程1的学生集合与选修课程2的学生集合的交集。
1 2 3 4 5 6 7
| SELECT Sno FROM SC WHERE Cno='1' INTERSECT SELECT Sno FROM SC WHERE Cno='2';
|
1 2 3 4 5 6
| SELECT Sno FROM SC WHERE Cno='1' AND Sno IN (SELECT Sno FROM SC WHERE Cno='2');
|
EXCEPT
[例3.68]:查询计算机科学系的学生与年龄不大于19岁的学生的差集。
1 2 3 4 5 6 7
| SELECT * FROM Student WHERE Sdept='CS' EXCEPT SELECT * FROM Student WHERE Sage <= 19;
|
1 2 3
| SELECT * FROM Student WHERE Sdept='CS' AND Sage>19;
|