Intersect、minus、union、union all用法

MINUS是从第一个查询结果减去第二个查询结果,如果有相交部分就减去相交部分;否则和第一个查询结果没有区别.

INTERSECT是两个查询结果的交集

UNION ALL是两个查询的并集;

Minusintersect、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

数据库中,UNIONUNION 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:两个结果集进行并集操作,返回结果(其结果包括重复行,不进行排序)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值