SQL作用在关系上的union、intersect、except运算对应数学集合论中的并、交、差运算。
通用形式:
关系1 [集合运算方式] 关系2;
1、并运算
示例:
(
SELECT * FROM instructor WHERE name='smith')
UNION
(
SELECT * FROM instructor WHERE dept_name = 'history');
原表
结果表
与select子句不同,union运算自动去除重复的结果集元组。如果要保留重复数据,则应用union all 代替 union。
值得注意的是,参与并运算中select的属性数目应该相同,否则会报以下错误:
The used SELECT statements have a different number of columns
并运算生成的结果关系的属性名是是根据关系1而定,例如:
(
SELECT name,salary FROM instructor)
UNION
(
SELECT dept_name,building FROM department);
运算结果表
2、交运算:
同理的交运算运算:intersect 和 intersect all。
示例:
(
SELECT dept_name
FROM instructor
WHERE name = 'smith'
)intersect(
SELECT dept_name
FROM department
);
3、差运算:
差运算也有 except 和 except all两种操作。
所谓差运算是取出关系1中有但关系2没有的元组。
(
SELECT dept_name
FROM instructor
)EXCEPT (
SELECT dept_name
FROM department
WHERE dept_name = 'biology'
);
注:在MySQL中,是没有交,差两种运算操作的,所以的另选他法。
交运算(利用连接,往后会提到):
SELECT DISTINCT dept_name
FROM instructor
INNER JOIN department USING (dept_name)
差运算:
SELECT dept_name
FROM department
LEFT JOIN instructor USING (dept_name)
WHERE instructor.dept_name IS NULL ;
当然,也可以分别利用in 和not in 分别实现上面的两种集合运算,从字面意义也很容易理解,不过in和 not in不适用大数据集合的运算。