交-并-差的处理
- SQL语言:并运算
UNION
,交运算INTERSECT
,差运算EXCEPT
- 基本语法形式:
子查询{UNION [ALL] | INTERSECT [ALL] | EXPECT [ALL] 子查询}
- 通常情况下自动删除重复元组:不带
ALL
。若要保留重复的元组,则要带ALL
示例1:求即学过Math课程,又学过English课程的同学
表结构
SELECT * FROM SC
+----------------+------------------+
| name | course |
+----------------+------------------+
| Tom | English |
| Tom | Math |
| David | english |
| David | Computer |
+----------------+------------------+
查询
SELECT name FROM SC WHERE course = 'Math'
INTERSECT
SELECT name FROM SC WHERE course = 'English';
注意!Mysql4.0中增加了对UNION
的支持,但是仍然不支持INTERSECT
和EXPECT
这是因为交运算符INTERSECT
并没有增强SQL的表达能力。没有INTERSECT
,SQL也可以通过其他方式表达同样的查询需求。只是有了INTERSECT
更容易表达一些.。但是增加了SQL语言的不唯一性。
比如上面的查询可以用如下方式替换
SELECT name FROM sc WHERE course='Math' AND name IN
(SELECT name FROM sc WHERE course='English')
+----------------+
| name |
+----------------+
| Tom |
+----------------+
示例2:假定所有学生都有选课,求没有学过Math课程的学生
不能写成
SELECT name FROM sc WHERE course<>'Math'
可以写成
SELECT name FROM sc
EXCEPT
SELECT name FROM sc WHERE course='Math'
同样的EXCEPT
也没有增强SQL的表达能力,上面的查询可以改写为
SELECT DISTINCT name
FROM sc sc1
WHERE NOT EXISTS
(
SELECT name
FROM sc
WHERE course='Math'
AND name = sc1.name
)
+----------------+
| name |
+----------------+
| David |
+----------------+
注意
-
UNION
运算符是Entry-SQL92
的一部分 -
INTERSECT
和EXCEPT
是Full-SQL92
的一部分 - 它们都是
Core-SQL99
的一部分,但有些DBMS并不支持这些运算