集合运算
-
SQL作用在关系(relation,就是指表)上的 union、intersect 和 except 运算对应于数学集合论中的∪, ∩和-运算
-
union、intersect 和 except 运算与 select 子句不同,它们会自动去除重复
-
如果想保留所有重复,必须用 union all、intersect all 和 except all
-
假设一个元组在关系r中重复出现了m次,在关系s中重复出现了n次,那么这个元组将会重复出现:
- 在 r union all s 中,重复出现 m+n次
- 在 r intersect all s 中,重复出现 min(m,n)次
- 在 r except all s 中,重复出现max(0,m-n) 次
-
举个例子:已知表结构
section(course_id,sec_id,semester,year,building,room_number,time_slot_id)
-
例1,找出在2009年秋季开课,或者在2010年春季开课或两个学习都开课的所有课程
(select course_id from section where semester =‘Fall’and year = 2009) union (select course_id from section where semester =‘Spring’and year = 2010);
-
例2,找出在2009年秋季和2010年春季同时开课所有课程
(select course_id from section where semester =‘Fall’and year = 2009) intersect (select course_id from section where semester =‘Spring’and year = 2010);
-
例3,找出在2009年秋季开课,但不在2010年春季开课的所有课程
(select course_id from section where semester =‘Fall’and year = 2009) except (select course_id from section where semester =‘Spring’and year = 2010);
-
-
补充
- 在 SQL Server 2000中,只支持 union 和 union ALL
- 在 Oracle 中,支持 union,union ALL,intersect 和 Minus;但不支持 Intersect ALL 和 Minus ALL
-
参考
- 浙江大学 陈岭《数据库系统原理》课程第四章的集合运算