什么是組合查詢
把多個(gè)select語句的結(jié)果作為單個(gè)查詢的結(jié)果集返回,就稱為并(union)或復(fù)合查詢(compound query)
有兩種情況需要使用組合查詢
- 在單個(gè)查詢中從不同的表返回類似結(jié)構(gòu)的數(shù)據(jù)
- 對(duì)單個(gè)表執(zhí)行多個(gè)查詢, 按單個(gè)查詢返回結(jié)果
任何具有多個(gè)where子句的select語句,都可以作為一個(gè)組合查詢給出.
創(chuàng)建組合查詢
使用union
需要查詢價(jià)格小于等于5的所有物品的一個(gè)列表,而且還想包括供應(yīng)商1001和1002生產(chǎn)的所有物品(不考慮價(jià)格)。
如果是用兩條where查詢 那么語句如下
SELECT vend_id,prod_id,prod_price from products WHERE prod_price<=5;
SELECT vend_id,prod_id,prod_price from products WHERE vend_id in (1001,1002);
第一條select語句的結(jié)果如下,為4條記錄

第二條select語句的結(jié)果如下, 為5條記錄

使用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);
運(yùn)行的結(jié)果如下圖, 為8條記錄. 去除掉了重復(fù)的一條記錄

如果是使用一條select語句的where查詢,那么語句如下
SELECT vend_id,prod_id,prod_price from products WHERE prod_price<=5 or vend_id in (1001,1002);
其運(yùn)行的結(jié)果如下, 也是八條數(shù)據(jù)

使用union的規(guī)則
- UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關(guān)鍵字UNION分隔(因此,如果組合4條SELECT語句,將要使用3個(gè)UNION關(guān)鍵字)。
- UNION中的每個(gè)查詢必須包含相同的列、表達(dá)式或聚集函數(shù)(不過各個(gè)列不需要以相同的次序列出)。
- 列數(shù)據(jù)類型必須兼容:類型不必完全相同,但必須是DBMS可以隱含地轉(zhuǎn)換的類型(例如,不同的數(shù)值類型或不同的日期類型)。
union all的使用
在上面使用union的過程中,自動(dòng)去除了重復(fù)的數(shù)據(jù). 那么如果需要把重復(fù)的數(shù)據(jù)也顯示出來, 就需要用到union all了.
sql語句如下
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);
結(jié)果如下為9條數(shù)據(jù). 畫圈的為重復(fù)的兩條數(shù)據(jù)

由此可以得知, union all 與union的區(qū)別就在于 union all不會(huì)去除掉相同的數(shù)據(jù), 而union就會(huì)去除相同的數(shù)據(jù).
而且使用where和union的效果相同, 也會(huì)去除相同的數(shù)據(jù)
組合查詢的結(jié)果的排序
在用UNION組合查詢時(shí),只能使用一條ORDER BY子句,它必須出現(xiàn)在最后一條SELECT語句之后。
對(duì)于結(jié)果集,不存在用一種方式排序一部分,而又用另一種方式排序另一部分的情況,因此不允許使用多條ORDER BY子句。
組合查詢的sql語句的示例
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;
運(yùn)行的結(jié)果如下

UNION在最后一條SELECT語句后使用了ORDER BY子句。雖然ORDER BY子句似乎只是最后一條SELECT語句的組成部分,但實(shí)際上MySQL將用它來排序所有SELECT語句返回的所有結(jié)果。
總結(jié)
利用UNION,可把多條查詢的結(jié)果作為一條組合查詢返回. 使用UNION可極大地簡化復(fù)雜的WHERE子句,簡化從多個(gè)表中檢索數(shù)據(jù)的工作。