第十七章組合查詢
17.1組合查詢
MySQL允許執行多個查詢(多條SELECT語句),并將結果作為單個查詢結果集返回。這些組合查詢通常稱為并(union)或復合查詢(compound query)。
以下幾種情況需要使用組合查詢:
- 在單個查詢中從不同的表返回類似結構的數據。
- 對單個表執行多個查詢,按單個查詢返回數據。
- 任何具有多個多個WHERE子句的SELECT語句都可以作為一個組合查詢給出。
17.2創建組合查詢
17.2.1使用UNION
需求:查詢價格小于等于5的所有物品和供應商1001和1002生產的所有商品(不考慮價格)。
輸入:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002)
OR prod_price <= 5;
輸出:
說明:這里使用多個WHERE條件進行的查詢。
輸入:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
輸出:
輸入:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5;
輸出:
輸入:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
輸出:
說明:可用UNION操作符來組合數條SQL查詢,將多條SELECT語句的結果組合成單個結果集。
17.2.2UNION規則
并是非常容易使用的,但要注意以下幾條規則。
- UNION必須由兩條或兩條以上的SELECT語句組成,語句之間使用UNION分隔。
- UNION中的每個查詢必須包含相同的列、表達式或聚集函數(不需要完全相同的順序)。
- 列數據類型必須兼容,類型不必完全相同。
17.2.3包含或取消重復的行
輸入:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION ALL
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002);
輸出:
說明:UNION在使用時會自動去掉重復的行,如果需要返回所有行可以使用UNION ALL,而這是WHERE完成不了的工作。
17.2.4對組合查詢結果排序
輸入:
SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001,1002)
ORDER BY vend_id, prod_price;
輸出:
說明:在使用UNION組合查詢時,只能使用一條ORDER BY子句,且必須出現在最后一條SELECT語句之后,不存在一部分按照一種方式排序,另一部分按照另一種方式排序的情況。