MySQL必知必會——第17章 組合查詢 讀書筆記

如何利用UNION操作符將多條select語句組合成一個結果集
1 what is 組合查詢?
多數SQL查詢都只包含從一個或多個表中返回數據的單條select語句。MySQL也允許執行多個查詢(多條select語句),並將結果作爲單個查詢結果集返回。
2 how to create 組合查詢?
可用UNION操作符來組合數條SQL查詢。利用UNION,可給出多條SELECT語句,將它們的結果組合成單個結果集。
UNION的使用很簡單, 所需做的只是給出每條SELECT語句,在各條語句之間放上關鍵字UNION。
舉例:假設需要價格小於等於5的所有物品的一個列表,而且還想包括供應商1001和1002生產的所有物品(不考慮價格)。
先實現單條語句:
①價格小於等於5的所有物品列表

select vend_id,prod_id,prod_price
from products
where prod_price <= 5;

查詢結果:
在這裏插入圖片描述
②供應商1001和1002生產的所有物品

select  vend_id,prod_id,prod_price
from products
where vend_id in (1001,1002);

查詢結果:
在這裏插入圖片描述
將多條select語句通過UNION組合起來:

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指示MySQL執行兩條SELECT語句,並把輸出組合成單個查詢結果集
也可以使用多個where子句而不是使用UNION:

select vend_id,prod_id,prod_price
from products
where prod_price <= 5 OR  vend_id IN (1001,1002);

在這個簡單的例子中,使用UNION可能比使用WHERE子句更復雜。對於更復雜的過濾條件,或者從多個表(而不是單個表)中檢索數據的情形,使用UNION可能會使處理更簡單。
3 UNION規則
①UNION中的每個查詢必須包含相同的列、表達式或聚集函數(不過各個列不需要以相同的次序列出)
②列數據類型必須兼容,類型不必完全相同,但必須是DBMS可以隱含轉換的類型。
4 包含或取消重複的行
看上述舉的例子,第一條SELECT語句返回4行,第二條SELECT語句返回5行。在UNION組合兩條SELECT語句後,只返回了8行而不是9行。
UNION從查詢結果集中自動去除了重複的行。換句話說,它的行爲與單條SELECT語句中使用多個WHERE子句條件一樣。這是UNION 的默認行爲,如果需要,可以改變它。如果想要返回所有匹配行,可使用UNION ALL而不是UNION。
UNION幾乎總是完成與多個WHERE條件相同的工作。UNION ALL爲UNION 的一種形式,它完成WHERE子句完成不了的工作。如果確實需要每個條件的匹配行全部出現(包括重複行),則必須使用UNION ALL 而不是WHERE。
5 對組合查詢結果排序
在使用UNION組合查詢時,只能使用一條ORDER BY子句,它必須出現在最後一條SELECT語句之後。對於結果集,不存在用一種方式排序一部分,而又用另一種方式排序另一部分的情況,因此不允許使用多條ORDER BY子句。
雖然ORDER BY子句似乎只是最後一條SELECT語句的組成部分,但實際上MySQL用它來排序所有SELECT語句返回的所有結果。
使用UNION的組合查詢可以應用於不同的表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章