这里的SQL,使用以下的测试表,与测试数据
CREATE TABLE union_tab_1 ( id INT, val VARCHAR(10) );
CREATE TABLE union_tab_2 ( id INT, val VARCHAR(10) );
INSERT INTO union_tab_1 VALUES(1, 'A'); INSERT INTO union_tab_1 VALUES(2, 'B'); INSERT INTO union_tab_1 VALUES(3, 'C');
INSERT INTO union_tab_2 VALUES(1, 'A'); INSERT INTO union_tab_2 VALUES(1, 'A'); INSERT INTO union_tab_2 VALUES(2, 'B'); INSERT INTO union_tab_2 VALUES(4, 'D');
UNION-合并且去除重复记录
SQL中的UNION用法
UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都
可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用
UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。
UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2]
此处理 Oracle / SQL Server / MySQL 都支持,因此这里只粘贴 Oracle 例子,不重复粘贴其他数据库的代码了。(下同)SQL> SELECT * FROM union_tab_1 2 UNION 3 SELECT * FROM union_tab_2;
ID VAL ---------- -------------------- 1 A 2 B 3 C 4 D
UNION ALL-合并且不去除重复记录
SQL> SELECT * FROM union_tab_1 2 UNION ALL 3 SELECT * FROM union_tab_2;
ID VAL ---------- -------------------- 1 A 2 B 3 C 1 A 1 A 2 B 4 D
7 rows selected.
INTERSECT - 仅仅给出2个表都有的数据(去除重复记录)
(注: 此语句, Oracle 与 SQL Server 可用, 好像 MySQL 不支持。)
SQL> SELECT * FROM union_tab_1 2 INTERSECT 3 SELECT * FROM union_tab_2;
ID VAL ---------- -------------------- 1 A 2 B
MINUS / EXCEPT- 返回第一个表中有、第二个表中没有的数据
Oracle
MINUS 指令是运用在两个 SQL 语句上。它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL 语句的
结果中。如果有的话,那这一笔资料就被去除,而不会在最后的结果中出现。如果第二个 SQL 语句所产生的结果并没有存在于第
一个 SQL 语句所产生的结果内,那这笔资料就被抛弃。
MINUS 的语法如下:
[SQL 语句 1]
MINUS
[SQL 语句 2]
SQL> SELECT * FROM union_tab_1 2 MINUS 3 SELECT * FROM union_tab_2;
ID VAL ---------- -------------------- 3 C
SQL> SELECT * FROM union_tab_2 2 MINUS 3 SELECT * FROM union_tab_1;
ID VAL ---------- -------------------- 4 D
SQL Server
1> SELECT * FROM union_tab_1 2> EXCEPT 3> SELECT * FROM union_tab_2; 4> go id val ----------- ---------- 3 C
(1 行受影响)
1> SELECT * FROM union_tab_2 2> EXCEPT 3> SELECT * FROM union_tab_1; 4> go id val ----------- ---------- 4 D
(1 行受影响)
好像 MySQL 不支持