1. 程式人生 > 實用技巧 >第14課 組合查詢

第14課 組合查詢

第14課 組合查詢

14.1 組合查詢

多數SQL查詢只包含從一個或多個表中返回資料的單條SELECT語句。但是,SQL也允許執行多個查詢(多條SELECT語句),並將結果作為一個查詢結果集返回。這些組合查詢通常稱為並(union)或複合查詢(compound query)。

主要有兩種情況需要使用組合查詢:

  • 在一個查詢中從不同的表返回結構資料;
  • 對一個表執行多個查詢,按一個查詢返回資料。

14.2 建立組合查詢

14.2.1 使用UNION

使用UNION很簡單,所要做的只是給出每條SELECT語句,在各條語句之間放上關鍵字UNION。

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';

這條語句由前面的兩條SELECT語句組成,之間用UNION關鍵字分隔。UNION指示DBMS執行這兩條SELECT語句,並把輸出組合成一個查詢結果集。

為了便於參考,這裡給出使用多條WHERE子句而不是UNION的相同查詢:

SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
 OR cust_name = 'Fun4All';

14.2.2 UNION規則

UNION非常容易使用,但在進行組合時需要注意幾條規則。

  • UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關鍵字UNION分隔(因此,如果組合四條SELECT語句,將要使用三個UNION關鍵字)。
  • UNION中的每個查詢必須包含相同的列、表示式或聚集函式(不過,各個列不需要以相同的次序列出)。
  • 列資料型別必須相容:型別不必完全相同,但必須是DBMS可以隱含轉換的型別(例如,不同的數值型別或不同的日期型別)。

14.2.3 包含或取消重複的行

使用UNION時,重複的行會被自動取消。

這是UNION的預設行為,如果願意也可以改變它。事實上,如果想返回所有的匹配行,可使用UNION ALL而不是UNION。

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';

14.2.4 對組合查詢結果排序

在用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, cust_contact; 

雖然ORDER BY子句似乎只是最後一條SELECT語句的組成部分,但實際上DBMS將用它來排序所有SELECT語句返回的所有結果。

14.3 小結

利用UNION,可以把多條查詢的結果作為一條組合查詢返回,不管結果中有無重複。使用UNION可極大地簡化複雜的WHERE子句,簡化從多個表中檢索資料的工作。