本課學習如何利用UNION操作符將多條SELECT語句組合成一個結(jié)果集闺骚。
1 組合查詢
多數(shù)SQL查詢只包含從一個或多個表中返回數(shù)據(jù)的單條SELECT語句舍咖。但是,SQL也允許執(zhí)行多個查詢(多條SELECT語句),并將結(jié)果作為一個查詢結(jié)果集返回照弥。這些組合查詢通常稱為并(UNION)或復(fù)合查詢(compound query)。
主要有兩種情況需要使用組合查詢:
- 在一個查詢中從不同的表返回結(jié)構(gòu)數(shù)據(jù)进副;
- 對一個表執(zhí)行多個查詢这揣,按一個查詢返回數(shù)據(jù)。
提示:組合查詢和多個WHERE條件
多數(shù)情況下,組合相同表的兩個查詢所完成的工作與具有多個WHERE子句條件的一個查詢所完成的工作相同曾沈。換句話說这嚣,任何具有多個WHERE子句的SELECT語句都可以作為一個組合查詢。
2 創(chuàng)建組合查詢
利用UNION可以給出多條SELECT語句塞俱,將它們的結(jié)果組合成一個結(jié)果集姐帚。
2.1 使用UNION
使用UNION很簡單,所要做的只是給出每條SELECT語句障涯,在各條語句之間放上關(guān)鍵字UNION罐旗。
舉例說明:
需要Illinois、Indiana和Michigan等美國幾個州的所有顧客的報表唯蝶,還想包括不管位于哪個州的所有的Fun4All九秀。
首先來看單條語句:
SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_state IN ('IL','IN','MI');
SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_name = 'Fun4All';
組合這兩條語句:
SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_state IN ('IL','IN','MI') UNION SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_name = 'Fun4All';
對比WHERE子句:
SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_state IN ('IL','IN','MI') OR cust_name = 'Fun4All';
2.2 UNION規(guī)則
- UNION必須由兩條或者兩條以上的SELECT語句組成,語句之間用關(guān)鍵字UNION分隔粘我。
- UNION中的每個查詢必須包含相同的列鼓蜒、表達式或聚集函數(shù)。
- 列數(shù)據(jù)類型必須兼容:類型不必完全相同征字,但必須是DBMS可以隱含轉(zhuǎn)換的類型(例如都弹,不同的數(shù)值類型或不同的日期類型)。
2.3 包含或取消重復(fù)的行
UNION從查詢結(jié)果集中自動去除了重復(fù)的行匙姜,這是UNION的默認行為畅厢。如果想返回所有的匹配行,可以使用UNION ALL氮昧。
SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_state IN ('IL','IN','MI') UNION ALL SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_name = 'Fun4All';
2.4 對組合查詢結(jié)果排序
在用UNION組合查詢時框杜,只能使用一條ORDER BY 子句,必須位于最后一條SELECT語句之后袖肥。
SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_state IN ('IL','IN','MI') UNION SELECT cust_name,cust_contact,cust_email FROM customers WHERE cust_name = 'Fun4All' ORDER BY cust_name;