两张结构一样的表如何找不同的记录:UNION - UNION ALL - INTERSECT - MINUS / EXCEPT

来源:互联网 发布:和明星合影软件 编辑:程序博客网 时间:2024/04/30 23:32

这里的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_12> EXCEPT3> SELECT * FROM union_tab_2;4> goid          val----------- ----------          3 C

(1 行受影响)

1> SELECT * FROM union_tab_22> EXCEPT3> SELECT * FROM union_tab_1;4> goid          val----------- ----------          4 D

(1 行受影响)

好像 MySQL 不支持

原创粉丝点击