讀書筆記《MySQL必知必會(huì)》之第十七章組合查詢

什么是組合查詢

把多個(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ù)的工作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容