MySQL必知必會 —— 第十七章 組合查詢

1.組合查詢

多數SQL查詢都只包含從一個或多個表中返回數據的單條SELECT語句。MySQL也允許執行多個查詢(多條SELECT語句),並將結果作爲單個查詢結果集返回。這些組合查詢通常稱爲並(union)或複合查詢(compound query)。
有兩種基本情況,其中需要使用組合查詢:
❑ 在單個查詢中從不同的表返回類似結構的數據;
❑ 對單個表執行多個查詢,按單個查詢返回數據。
組合查詢和多個WHERE條件 多數情況下,組合相同表的兩個查詢完成的工作與具有多個WHERE子句條件的單條查詢完成的工作相同。換句話說,任何具有多個WHERE子句的SELECT語句都可以作爲一個組合查詢給出,在以下段落中可以看到這一點。這兩種技術在不同的查詢中性能也不同。因此,應該試一下這兩種技術,以確定對特定的查詢哪一種性能更好。

2.創建組合查詢

可用UNION操作符來組合數條SQL查詢。利用UNION,可給出多條SELECT語句,將它們的結果組合成單個結果集。

2.1 使用 union

假如需要價格小於等於5的所有物品的一個列表,而且還想包括供應商1001和1002生產的所有物品(不考慮價格)。
第一條SELECT檢索價格不高於5的所有物品。

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

在這裏插入圖片描述
第二條SELECT使用IN找出供應商1001和1002生產的所有物品。

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
union
select vend_id,prod_id,prod_price
from products
where vend_id in (1001,1002);

在這裏插入圖片描述

2.2 union規則

正如所見,並是非常容易使用的。但在進行並時有幾條規則需要注意。
❑ UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關鍵字UNION分隔(因此,如果組合4條SELECT語句,將要使用3個UNION關鍵字)。
❑ UNION中的每個查詢必須包含相同的列、表達式或聚集函數(不過各個列不需要以相同的次序列出)。
❑ 列數據類型必須兼容:類型不必完全相同,但必須是DBMS可以隱含地轉換的類型(例如,不同的數值類型或不同的日期類型)。
如果遵守了這些基本規則或限制,則可以將並用於任何數據檢索任務。

2.3 包含或取消重複的行

UNION從查詢結果集中自動去除了重複的行。
如果想返回所有匹配行,可使用UNION ALL而不是UNION。

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與WHERE UNION幾乎總是完成與多個WHERE條件相同的工作。UNION ALL爲UNION的一種形式,它完成WHERE子句完成不了的工作。如果確實需要每個條件的匹配行全部出現(包括重複行),則必須使用UNION ALL而不是WHERE。

2.4 對組合查詢結果進行排序

SELECT語句的輸出用ORDER BY子句排序。在用UNION組合查詢時,只能使用一條ORDER BY子句,它必須出現在最後一條SELECT語句之後。對於結果集,不存在用一種方式排序一部分,而又用另一種方式排序另一部分的情況, 因此不允許使用多條ORDER BY子句

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)
order by vend_id,prod_price;

在這裏插入圖片描述

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