【前言】

本期汇总了Oracle数据库两张表间使用SQL进行差集查询的四种方法,主要应用于表复制后进行数据比对的情况,四种方法有各自较合适的使用场景。

【准备工作】

新建两张表stu1和stu2,表结构和数据如下图。

stu1表结构如下:

mysql俩表取差集 sql取两张表的差集_表结构


stu2表结构如下:

mysql俩表取差集 sql取两张表的差集_表结构_02


stu1数据如下:

mysql俩表取差集 sql取两张表的差集_数据_03


stu2数据如下:

mysql俩表取差集 sql取两张表的差集_表结构_04

1.1.NOT EXISTS

意思是不在此范围内的,用来比对两张表的某一个列是否存在差集,两张表列数可不一致,按列来查询(支持不一致的列数据类型)。

1.1.1. 找出stu1存在,但stu2不存在的NAME(数据类型一致)

SELECT * FROM stu1 a WHERE NOT EXISTS (SELECT * FROM stu2 b WHERE a.NAME = b.NAME);

mysql俩表取差集 sql取两张表的差集_表结构_05

1.1.2. 找出stu1存在,但stu2不存在的AGE(数据类型不一致)

SELECT * FROM stu1 a WHERE NOT EXISTS (SELECT * FROM stu2 b WHERE a.AGE = b.AGE);

mysql俩表取差集 sql取两张表的差集_差集_06

1.2.NOT IN

类似于NOT EXISTS,但如果查询的列存在空值的话,将导致查询结果为空。

1.2.1. 找出stu1存在,但stu2不存在的NAME(stu2存在空值)

stu1

mysql俩表取差集 sql取两张表的差集_数据_07


stu2

mysql俩表取差集 sql取两张表的差集_表结构_08


SELECT * FROM stu1 a WHERE a.NAME NOT IN (SELECT b.NAME FROM stu2 b);

mysql俩表取差集 sql取两张表的差集_Oracle_09

1.2.2. 找出stu1存在,但stu2不存在的NAME(stu2存在空值,但给出条件)

SELECT * FROM stu1 a WHERE a.NAME NOT IN (SELECT b.NAME FROM stu2 b WHERE a.NAME = b.NAME);

mysql俩表取差集 sql取两张表的差集_Oracle_10

1.3.UNION ALL

union all本身的用法是合并两个或以上select语句的结果集,相同数据不合并,这里的思路是对union all结果集搜索出相同数据数量只为1的结果(即为stu1和stu2的差集)。

需注意的,两张表选择进行对比的列的数据类型需保持一致,列数也不一致。

1.3.1. 找出两张表的差集(列的数据类型一致)

SELECT ID,NAME,AGE FROM(SELECT id,name,age

FROM stu1 UNION all SELECT id,name,age FROM stu2) GROUP BY ID,NAME,AGE HAVING count(*)=1 ORDER BY ID;

mysql俩表取差集 sql取两张表的差集_Oracle_11


1.3.2. 找出两张表的差集(列的数据类型不一致)

mysql俩表取差集 sql取两张表的差集_差集_12

1.4.MINUS

差集运算,同步数据常用。表结构需保持一致。

1.4.1. 表结构不一致

mysql俩表取差集 sql取两张表的差集_mysql俩表取差集_13


mysql俩表取差集 sql取两张表的差集_mysql俩表取差集_14

1.4.2. 表结构一致

stu1

mysql俩表取差集 sql取两张表的差集_数据_15


stu2

mysql俩表取差集 sql取两张表的差集_Oracle_16


SELECT * FROM stu1 MINUS SELECT * FROM stu2;

mysql俩表取差集 sql取两张表的差集_数据_17

1.4.3. 表结构一致(存在空值也可查出)

stu1

mysql俩表取差集 sql取两张表的差集_表结构_18


stu2

mysql俩表取差集 sql取两张表的差集_mysql俩表取差集_19


SELECT * FROM stu1 MINUS SELECT * FROM stu2;

mysql俩表取差集 sql取两张表的差集_mysql俩表取差集_20