UNION 与UNION ALL UNION 将返回两个查询的结果并去除其中的重复部分下边有两个值勤人员表:
输入: SQL> SELECT * FROM FOOTBALL 输出:
NAME
------
ABLE
BRAVO
CHARLIE
DECON
EXITOR
FUBAR
GOOBE
7 rows selected.
--------
输入: SQL> SELECT * FROM SOFTBALL
输出:
NAME
-----
ABLE
BAKER
CHARLIE
DEAN
EXITOR
FALCONER
GOOBER
7 rows selected.
--------
在这两个表中有哪些不重复的人员呢
输入/输出: SQL> SELECT NAME FROM SOFTBALL 2 UNION 3 SELECT NAME FROM FOOTBALL
NAME
-------
ABLE
BAKER
BRAVO
CHARLIE
DEAN
DECON
EXITOR
FALCONER
FUBAR
GOOBER
10 rows selected.
----------
UNION 返回了两个表中的10 个记录它们是不重复的但是两个表中共有多少人呢包括重复的人员
输入/输出:
SQL> SELECT NAME FROM SOFTBALL 2 UNION ALL 3 SELECT NAME FROM FOOTBALL
NAME
----------
ABLE
BAKER
CHARLIE
DEAN
EXITOR
FALCONER
GOOBER
ABLE
BRAVO
CHARLIE
DECON
EXITOR
FUBAR
GOOBER
14 rows selected.
------------------
分析可以看到UNION ALL 与UNION 一样对表进行了合并但是它不去掉重复的记录
可是如果我们想知道都有谁同时在两个表中呢UNION 无法做到这一点我们需要学习使用 INTERSECT INTERSECT 相交 INTERSECT 返回两个表中共有的行看下例它将返回两个表中有存在的员工
输入: SQL> SELECT * FROM FOOTBALL 2 INTERSECT 3 SELECT * FROM SOFTBALL
输出
NAME
--------
ABLE
CHARLIE
EXITOR
GOOBER
--------
分析这些记录是两个表中都存在的 MINUS 相减 MINUS 返回的记录是存在于第一个表中但不存在于第二个表中的记录
例如输入: SQL> SELECT * FROM FOOTBALL MINUS SELECT * FROM SOFTBALL
输出
NAME
--------
BRAVO
DECON
FUBAR
--------
上例中显示了三个不在垒球队中的足球队员如果你把语句的次序颠倒那么你将得到在垒球队中但不在足球队中的队员
输入: SQL> SELECT * FROM SOFTBALL MINUS SELECT * FROM FOOTBALL
输出
NAME
-------
BAKER
DEAN
FALCONER
--------