【SQL】集合运算 The Set Operators

目录

定义

联合运算

UNION

UNION ALL

交集运算

INTERSECT

差集运算

MINUS


定义

集合运算符包括UNION、UNION ALL、INTERSECT、MINUS

所有集合运算符的优先级都相等

如果一条SQL语句中包含多个set运算符,那oracle将从左到右进行求值(除非括号里指定了其他顺序)

 

联合运算

测试数据准备 tb_set01 tb_set02

SQL> create table tb_set01 as select EMPNO,ENAME,JOB,SAL,DEPTNO from emp where 1=2;
 

Table created.
 

SQL> insert into tb_set01 select EMPNO,ENAME,JOB,SAL,DEPTNO from emp where rownum<=5;
 

5 rows created.

 

SQL> insert into tb_set01 values(null,null,null,null,null);
 

1 row created.

SQL> create table tb_set02(no,name,work,price,class) as select EMPNO,ENAME,JOB,SAL,DEPTNO from emp where 1=2;
 

Table created.
 

SQL> insert into tb_set02 select * from tb_set01 where rownum<=2;
 

2 rows created.
 

SQL> insert into tb_set02 select empno+10,ename||'new',job,sal+5000,deptno from tb_set01 where empno is not null and rownum<=3;
 

3 rows created.

 

SQL> insert into tb_set02 values(null,null,null,null,null);
 

1 row created.

 

SQL> insert into tb_set02 values(null,null,null,null,null);
 

1 row created.

 

查看测试表数据

SQL> select * from tb_set01;
 
EMPNO ENAME    JOB         SAL  DEPTNO

----- -------- --------- ----- -------
 7369 SMITH    CLERK       800      20
 7499 ALLEN    SALESMAN   1600      30
 7521 WARD     SALESMAN   1250      30
 7566 JONES    MANAGER    2975      20
 7654 MARTIN   SALESMAN   1250      30
 
 

6 rows selected.
 

SQL> select * from tb_set02;
 
       
NO NAME       WORK           PRICE      CLASS
---------- ---------- --------- ---------- ----------
      7369 SMITH      CLERK            800         20
      7499 ALLEN      SALESMAN        1600         30
      7379 SMITHnew   CLERK           5800         20
      7509 ALLENnew   SALESMAN        6600         30
      7531 WARDnew    SALESMAN        6250         30
 
 
 

7 rows selected.

 

注意tb_set01有两个空行 tb_set02有一个空行

UNION

从表中返回所有的行,但是除去任何重复的行

SQL> select empno,ename,sal from tb_set01 union select  no,name,price from tb_set02;
 
EMPNO ENAME      SAL

----- -------- -----
 7369 SMITH      800
 7379 SMITHnew  5800
 7499 ALLEN     1600
 7509 ALLENnew  6600
 7521 WARD      1250
 7531 WARDnew   6250
 7566 JONES     2975
 7654 MARTIN    1250
 
 

9 rows selected.

可以看出union运算不忽略null

两个集合取并集,重复记录保留一份

按照第一个select字段升序显示

两个查询中字段数要相同,类型和名称可以不同

UNION ALL

从表中返回所有的行,保留重复的行

SQL> select empno,ename,sal from tb_set01 union all select no,name,price from tb_set02;
 
EMPNO ENAME      SAL

----- -------- -----
 7369 SMITH      800
 7499 ALLEN     1600
 7521 WARD      1250
 7566 JONES     2975
 7654 MARTIN    1250
 
 
7369 SMITH      800
 7499 ALLEN     1600
 7379 SMITHnew  5800
 7509 ALLENnew  6600
 7531 WARDnew   6250
 
 
 

13 rows selected.

与UNION不同的是结果集不会排序

 

交集运算

INTERSECT

返回多个查询中重复的行,包括null

排列方式和UNION一样按照select的第一个字段显示

SQL> select empno,ename,sal from tb_set01 intersect select no,name,price from tb_set02;
 
EMPNO ENAME      SAL

----- -------- -----
 7369 SMITH      800
 7499 ALLEN     1600

 
SQL> select count(*) from (select empno,ename,sal from tb_set01 intersect select no,name,price from tb_set02);
 
 
COUNT(*)
----------
         3

 

差集运算

MINUS

返回第一个查询里在第二个查询中没有的行

SQL> select empno,ename,sal from tb_set01 minus select no,name,price from tb_set02;
 
EMPNO ENAME      SAL

----- -------- -----
 7521 WARD      1250
 7566 JONES     2975
 7654 MARTIN    1250
 
SQL> select no,name,price from tb_set02 minus select empno,ename,sal from tb_set01;
 
       
NO NAME            PRICE
---------- ---------- ----------
      7379 SMITHnew         5800
      7509 ALLENnew         6600
      7531 WARDnew          6250

需要注意前后顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aluphami

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值