1.創建組合查詢
可用UNION操作符來組合數條SQL查詢。利用UNION,可給出多條SELECT語句,將它們的結果組合成單個結果集。
1.1使用UNION
UNION的使用很簡單。所需做的只是給出每條SELECT語句,在各條語句之間放上關鍵字UNION。
舉一個例子,假如需要價格小於等於5的所有物品的一個列表,而且還想包括供應商1001和1002生產的所有物品(不考慮價格)。
輸入
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';
輸出
+---------------+--------------------+-----------------------+
| cust_name | cust_contact | cust_email |
+---------------+--------------------+-----------------------+
| Village Toys | John Smith | sales@villagetoys.com |
| Fun4All | Jim Jones | jjones@fun4all.com |
| The Toy Store | Kim Howard | NULL |
| Fun4All | Denise L. Stephens | dstephens@fun4all.com |
+---------------+--------------------+-----------------------+
分析:這條語句由前面的兩條SELECT語句組成,語句中用UNION關鍵字分隔。UNION指示MySQL執行兩條SELECT語句,並把輸出組合成單個查詢結果集。
1.2UNION規則
- UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關鍵字UNION分隔(因此,如果組合4條SELECT語句,將要使用3個UNION關鍵
字)。 - UNION中的每個查詢必須包含相同的列、表達式或聚集函數(不過各個列不需要以相同的次序列出)。
- 列數據類型必須兼容:類型不必完全相同,但必須是DBMS可以隱含地轉換的類型(例如,不同的數值類型或不同的日期類型)。
1.3包含或取消重複行
UNION從查詢結果集中自動去除重複行(換句話說,它的行爲與單條SELECT語句中使用多個WHERE子句條件一樣)。
如果想返回所有匹配行,可使用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';
輸出
+---------------+--------------------+-----------------------+
| cust_name | cust_contact | cust_email |
+---------------+--------------------+-----------------------+
| Village Toys | John Smith | sales@villagetoys.com |
| Fun4All | Jim Jones | jjones@fun4all.com |
| The Toy Store | Kim Howard | NULL |
| Fun4All | Jim Jones | jjones@fun4all.com |
| Fun4All | Denise L. Stephens | dstephens@fun4all.com |
+---------------+--------------------+-----------------------+
分析:使用UNION ALL,MySQL不取消重複的行。因此這裏的例子返
回5行,其中有一行出現兩次。
1.4對組合查詢結果排序
SELECT語句的輸出用ORDER BY子句排序。在用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;
輸出
+---------------+--------------------+-----------------------+
| cust_name | cust_contact | cust_email |
+---------------+--------------------+-----------------------+
| Fun4All | Denise L. Stephens | dstephens@fun4all.com |
| Fun4All | Jim Jones | jjones@fun4all.com |
| The Toy Store | Kim Howard | NULL |
| Village Toys | John Smith | sales@villagetoys.com |
+---------------+--------------------+-----------------------+
分析:這條UNION在最後一條SELECT語句後使用了ORDER BY子句。雖
然ORDER BY子句似乎只是最後一條SELECT語句的組成部分,但實際上MySQL將用它來排序所有SELECT語句返回的所有結果。