有两个表,表中的记录如下:
表tb_test中的数据有:
SQL> select * from tb_test;
ID NAME AGE
------------------------------------ -------------------------------------------------- ----------
1 A 22
2 B 23
3 C
4 D
5 E 24
6 F 25
7 G 26
8 H 22
8 rows selected
表tb_test2中的数据有:
SQL> select * from tb_test2;
ID NAME AGE
------------------------------------ -------------------------------------------------- ----------
1 A 22
2 B 23
3 C
4 D
5 E 24
6 F 25
6 rows selected
1、比较MINUS和NOT EXISTS
使用NOT EXISTS的查询结果:
SQL> SELECT * FROM tb_test t WHERE NOT EXISTS (SELECT * FROM tb_test2 t2 WHERE t2.id=t.id);
ID NAME AGE
------------------------------------ -------------------------------------------------- ----------
7 G 26
8 H 22
使用MINUS的查询结果:
SQL> SELECT * FROM tb_test MINUS SELECT * FROM tb_test2;
ID NAME AGE
------------------------------------ -------------------------------------------------- ----------
7 G 26
8 H 22
可以看出使用MINUS和NOT EXISTS的结果是一样的。
MINUS的意思是使用第一个查询的结果作为基础数据减去另一个查询结果作为最终结果集。可以解决的问题是“我需要返回在数据源A中存在,但是在B中不存在的数据集”。
2、比较EXISTS和INTERSECT
使用EXISTS的查询结果:
SQL> SELECT * FROM tb_test t WHERE EXISTS (SELECT * FROM tb_test2 t2 WHERE t2.id=t.id);
ID NAME AGE
------------------------------------ -------------------------------------------------- ----------
1 A 22
2 B 23
3 C
4 D
5 E 24
6 F 25
6 rows selected
使用INTERSECT的查询结果:
SQL> SELECT * FROM tb_test t INTERSECT (SELECT * FROM tb_test2 t2);
ID NAME AGE
------------------------------------ -------------------------------------------------- ----------
1 A 22
2 B 23
3 C
4 D
5 E 24
6 F 25
6 rows selected
可以看出使用EXISTS和INTERSECT的查询结果相同。
INTERSECT是返回查询中都存在的行,可以解决的问题为“我需要返回源A和B中都存在的数据”。