Oracle 组合查询

组合查询,顾名思义就是组合两个或者多个表,进行复杂的查询。组合查询有点类似高一的数学:集合。故又分为:全集,子集,并集,交集。

先预览将用到的表:

表_1:

SQL> SELECT * FROM EMPCHK;
 
EMP_ID    EMP_NAME             EMP_ST_ADDR                    EMP_ZIP EMP_ADDR             EMP_CITY             EMP_PHONE   EMP_SALRAY
--------- -------------------- ------------------------------ ------- -------------------- -------------------- ----------- ----------
100000    ZOU QI LEI           BAN TIAN BULONG STREET         518000  YANG MEI VILLAGE     SHEN ZHEN            123456789         3500
100001    CAI FANG JIE         BAN TIAN BULONG STREET         518000  YANG MEI VILLAGE     SHEN ZHEN            18218429577 
100002    LU JING HUAN         FAN YU SESSION                 430060  YANG MEI VILLAGE     GUANG ZHOU           1397165903  
100003    WU JING XIN          HU BEI DIER SHIFAN XUEYUAN     430060  MING ZHU YUAN        WU HAN               187****235  
100004    LI WEI               QING SHAN GANG DU HUA YUAN     430060  XIAO QU              WU HAN               197****436  

表_2:

SQL> SELECT * FROM EMPCHKTMP;
 
EMP_ID    EMP_NAME             EMP_ST_ADDR                    EMP_ZIP EMP_ADDR             EMP_CITY             EMP_PHONE   EMP_SALRAY
--------- -------------------- ------------------------------ ------- -------------------- -------------------- ----------- ----------
100001    CAI FANG JIE         BAN TIAN BULONG STREET         518000  YANG MEI VILLAGE     SHEN ZHEN            18218429577 
100003    WU JING XIN          HU BEI DIER SHIFAN XUEYUAN     430060  MING ZHU YUAN        SHEN ZHEN            187****235  
100005    DING LING            HAN KOU TAI BEI LU             430060  TIAN MEN DUN NEARBY  WU HAN               137***4256        2000 


 

UNION ALL : 顾名思义是取全集。例如:

SQL> SELECT EMP_ADDR FROM EMPCHK UNION ALL SELECT EMP_ST_ADDR FROM EMPCHKTMP ORDER BY EMP_ADDR ;
 
EMP_ADDR
------------------------------
BAN TIAN BULONG STREET
HAN KOU TAI BEI LU
HU BEI DIER SHIFAN XUEYUAN
MING ZHU YUAN
XIAO QU
YANG MEI VILLAGE
YANG MEI VILLAGE
YANG MEI VILLAGE
 
8 rows selected
可以看到在显示方式上是以EMP_ADDR作为列项,这也是为何ORDER BY EMP_ADDR 而不是 EMP_ST_ADDR, 而且在查询返回的结果中包含了EMP_ADDR 和EMP_ST_ADDR所有的表项.

 

UNION: 顾名思义是取并集,切不包含重复的表项,例如:

SQL> SELECT EMP_ST_ADDR FROM EMPCHK UNION SELECT EMP_ADDR FROM EMPCHKTMP ORDER BY EMP_ST_ADDR ;
 
EMP_ST_ADDR
------------------------------
BAN TIAN BULONG STREET
FAN YU SESSION
HU BEI DIER SHIFAN XUEYUAN
MING ZHU YUAN
QING SHAN GANG DU HUA YUAN
TIAN MEN DUN NEARBY
YANG MEI VILLAGE
 
7 rows selected
可以看到在显示方式上是以EMP_ST_ADDR作为表项,这也是为何ORDER BY EMP_ST_ADDR的原因。即:在显示时,永远用第一个SELECT 后边的查询字段作为列表项。

可以看到UNION组合查询时只返回了一个YANG MEI VILLAGE。即取两个表内容不重复的选项,而且忽略同一表中重复的表项。




INTERSECT:顾名思义是取交集,即取两个表或多个表中内容相同的表项。例如:

SQL> SELECT EMP_ST_ADDR FROM EMPCHK INTERSECT SELECT EMP_ST_ADDR FROM EMPCHKTMP ;
 
EMP_ST_ADDR
------------------------------
BAN TIAN BULONG STREET
HU BEI DIER SHIFAN XUEYUAN


MINUS: 顾名思义取子集,即第一个表有而第二个表没有的表项.例如:

SQL> SELECT EMP_ST_ADDR FROM EMPCHK MINUS SELECT EMP_ST_ADDR FROM EMPCHKTMP;
 
EMP_ST_ADDR
------------------------------
FAN YU SESSION
QING SHAN GANG DU HUA YUAN
可以看到字段:
FAN YU SESSION
QING SHAN GANG DU HUA YUAN
在第二个表:EMPCHKTMP中是没有的。


总结:UNION ALL 取全集,UNION 取并集(除去重复项),INTERSECT 取交集,MINUS 取子集。。且各个查询字段即SELECT后面的字段必须是同一类型,且数量要相等..


下面加入第三个查询表:EMPCHKSUB,预览:

SQL> SELECT * FROM EMPCHKSUB;
 
EMP_ID    EMP_NAME        EMP_PHONE   EMP_SALRAY
--------- --------------- ----------- ----------
100001    CAI FANG JIE    18218429577 
100002    LU JING HUAN    1397165903  
100003    WU JING XIN     187****235  
100004    LI WEI          197****436  

组合查询可以组合两个或者多个表,例如下面根据名字字段进行查询:

SQL> SELECT EMP_NAME FROM EMPCHK
  2  UNION ALL SELECT EMP_NAME FROM EMPCHKTMP
  3  UNION ALL  SELECT EMP_NAME FROM EMPCHKSUB
  4  ORDER BY EMP_NAME ;
 
EMP_NAME
--------------------
CAI FANG JIE
CAI FANG JIE
CAI FANG JIE
DING LING
LI WEI
LI WEI
LU JING HUAN
LU JING HUAN
WU JING XIN
WU JING XIN
WU JING XIN
ZOU QI LEI
 
12 rows selected
返回了三个表中所有的名字字段。


再比如用MINUS进行组合查询,返回TAB_1 - TAB_2 - TAB_3的集合。:

SQL> SELECT EMP_NAME FROM EMPCHK
  2  MINUS SELECT EMP_NAME FROM EMPCHKTMP
  3  MINUS SELECT EMP_NAME FROM EMPCHKSUB
  4  ORDER BY EMP_NAME ;
 
EMP_NAME
--------------------
ZOU QI LEI
可以看到名字字段ZOU QI  LEI 只存在于EMPCHK 中  且不存在于EMPCHKTMP和EMPCHKSUB两个表中。 



























  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值