組合查詢,顧名思義就是組合兩個或者多個表,進行複雜的查詢。組合查詢有點類似高一的數學:集合。故又分為:全集,子集,並集,交集。
先預覽將用到的表:
表_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 3500100001 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 STREETHAN KOU TAI BEI LUHU BEI DIER SHIFAN XUEYUANMING ZHU YUANXIAO QUYANG MEI VILLAGEYANG MEI VILLAGEYANG 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 STREETFAN YU SESSIONHU BEI DIER SHIFAN XUEYUANMING ZHU YUANQING SHAN GANG DU HUA YUANTIAN MEN DUN NEARBYYANG 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 STREETHU BEI DIER SHIFAN XUEYUAN
MINUS: 顧名思義取子集,即第一個表有而第二個表沒有的表項.例如:
SQL> SELECT EMP_ST_ADDR FROM EMPCHK MINUS SELECT EMP_ST_ADDR FROM EMPCHKTMP; EMP_ST_ADDR------------------------------FAN YU SESSIONQING SHAN GANG DU HUA YUAN
可以看到欄位:
FAN YU SESSIONQING 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 JIECAI FANG JIECAI FANG JIEDING LINGLI WEILI WEILU JING HUANLU JING HUANWU JING XINWU JING XINWU JING XINZOU 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兩個表中。