MINUS是从第一个查询结果减去第二个查询结果,如果有相交部分就减去相交部分;否则和第一个查询结果没有区别.
INTERSECT是两个查询结果的交集
UNION ALL是两个查询的并集;
Minus、intersect、union all三个图示如下:
示例表tab_emp和test
create table tab_emp
(EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
SAL NUMBER(7,2));
create table test
(EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
SAL NUMBER(7,2));
tab_emp数据如下:
SQL> select * from tab_emp;
EMPNO ENAME SAL
----- ---------- ---------
7654 MARTIN 1250.00
7698 BLAKE 2850.00
7782 CLARK 2450.00
7788 SCOTT 3000.00
7839 KING 5000.00
7844 TURNER 1500.00
7876 ADAMS 1100.00
7900 JAMES 950.00
7902 FORD 3000.00
7934 MILLER 1300.00
test数据如下:
SQL> select * from test;
EMPNO ENAME SAL
----- ---------- ---------
7369 SMITH 800.00
7499 ALLEN 2000.00
7521 WARD 1250.00
7566 JONES 2975.00
7654 MARTIN 1250.00
7698 BLAKE 2850.00
7782 CLARK 2450.00
Minus示例:
SQL> select * from tab_emp
2 minus
3 select * from test;
EMPNO ENAME SAL
----- ---------- ---------
7788 SCOTT 3000.00
7839 KING 5000.00
7844 TURNER 1500.00
7876 ADAMS 1100.00
7900 JAMES 950.00
7902 FORD 3000.00
7934 MILLER 1300.00
Intersect示例:
SQL> select * from tab_emp
2 intersect
3 select * from test;
EMPNO ENAME SAL
----- ---------- ---------
7654 MARTIN 1250.00
7698 BLAKE 2850.00
7782 CLARK 2450.00
在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
UNION ALL只是简单的将两个结果合并后就返回。如果返回的两个结果集中有重复的数据,那么在返回的结果集中也包含有重复的数据了。
从效率上说,UNION ALL要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:
SQL> select * from tab_emp
2 union
3 select * from test;
EMPNO ENAME SAL
----- ---------- ---------
7369 SMITH 800.00
7499 ALLEN 2000.00
7521 WARD 1250.00
7566 JONES 2975.00
7654 MARTIN 1250.00
7698 BLAKE 2850.00
7782 CLARK 2450.00
7788 SCOTT 3000.00
7839 KING 5000.00
7844 TURNER 1500.00
7876 ADAMS 1100.00
7900 JAMES 950.00
7902 FORD 3000.00
7934 MILLER 1300.00
SQL> select * from tab_emp
2 union all
3 select * from test;
EMPNO ENAME SAL
----- ---------- ---------
7654 MARTIN 1250.00
7698 BLAKE 2850.00
7782 CLARK 2450.00
7788 SCOTT 3000.00
7839 KING 5000.00
7844 TURNER 1500.00
7876 ADAMS 1100.00
7900 JAMES 950.00
7902 FORD 3000.00
7934 MILLER 1300.00
7369 SMITH 800.00
7499 ALLEN 2000.00
7521 WARD 1250.00
7566 JONES 2975.00
7654 MARTIN 1250.00
7698 BLAKE 2850.00
7782 CLARK 2450.00
总结:
Minus由第一个表对第二个表进行差操作,并返回结果(其结果不包括重复行,同时进行默认规则的排序);
Intersect:两个结果集进行交集操作,并返回结果(其结果不包括重复行,同时进行默认规则的排序);
Union:两个结果集进行并集操作,返回结果(其结果不包括重复行,同时进行默认规则的排序);
Union All:两个结果集进行并集操作,返回结果(其结果包括重复行,不进行排序)。