MySQL使用組合查詢的示例代碼
??本章講述如何利用UNION操作符將多條SELECT語(yǔ)句組合成一個(gè)結(jié)果集。
??組合查詢
前言
多數(shù)SQL查詢都只包含從一個(gè)或多個(gè)表中返回?cái)?shù)據(jù)的單條SELECT語(yǔ)句。MySQL也允許執(zhí)行多個(gè)查詢 (多條SELECT語(yǔ)),并將結(jié)果作為單個(gè)查詢結(jié)果集返回。這些組合查詢通常稱為并 (union)或復(fù)合查詢**(compound query)**.
有兩種基本情況,其中需要使用組合查詢:
- 在單個(gè)查詢中從不同的表返回類似結(jié)構(gòu)的數(shù)據(jù);
- 對(duì)單個(gè)表執(zhí)行多個(gè)查詢,按單個(gè)查詢返回?cái)?shù)據(jù)。
組合查詢和多個(gè)WHERE條件
多數(shù)情況下,組合相同表的兩個(gè)查詢完成的工作與具有多個(gè)WHERE子句條件的單條查詢完成的工作相同。換句話說(shuō),任何具有多個(gè)WHERE子的SELECT語(yǔ)句都可以作為一個(gè)組合查詢給出,在以下段落中可以看到這一點(diǎn)這兩種技術(shù)在不同的查詢中性能也不同。因此,應(yīng)該試一下這兩種技術(shù),以確定對(duì)特定的查詢哪一種性能更好。
??創(chuàng)建組合查詢
??可用UNION操作符來(lái)組合數(shù)條SOL查詢。利用UNION,可給出多條SELECT語(yǔ)句,將它們的結(jié)果組合成單個(gè)結(jié)果集
舉一個(gè)例子,假如需要價(jià)格小于等于5的所有物品的一個(gè)列表,而且還想包括供應(yīng)商1001和1002生產(chǎn)的所有物品(不考慮價(jià)格)。當(dāng)然,可以利用WHERE子來(lái)完成此工作,不過(guò)這次我們將使用UNION。
正如所述,創(chuàng)建UNION涉及編寫(xiě)多條SELECT語(yǔ)句。首先來(lái)看單條語(yǔ)句:
輸入
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à)格不高于5的所有物品。第二條SELECT使用IN找出供應(yīng)商1001和1002生產(chǎn)的所有物品。
為了組合這兩條語(yǔ)句,按如下進(jìn)行:
輸入
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ǔ)句由前面的兩條SELECT語(yǔ)句組成,語(yǔ)句中用UNION關(guān)鍵字分隔。UNION指示MySQL執(zhí)行兩條SELECT語(yǔ)句,并把輸出組合成單個(gè)查詢結(jié)果集。
作為參考,這里給出使用多條WHERE子句而不是使用UNION的相同查詢:
SELECT vend_id, prod_id, prod_price FROM products WHERE prod_price <= 5 OR vend_id IN (1001,1002);
在這個(gè)簡(jiǎn)單的例子中,使用UNION可能比使用WHERE子句更為復(fù)雜但對(duì)于更復(fù)雜的過(guò)濾條件,或者從多個(gè)表(而不是單個(gè)表)中檢索數(shù)據(jù)的情形,使用UNION可能會(huì)使處理更簡(jiǎn)單。
??UNION規(guī)則
正如所見(jiàn),并是非常容易使用的。但在進(jìn)行并時(shí)有幾條規(guī)則需要注意。
- UNION必須由兩條或兩條以上的SELECT語(yǔ)句組成,語(yǔ)句之間用關(guān)鍵字UNION分隔(因此,如果組合4條SELECT語(yǔ)句,將要使用3個(gè)UNION關(guān)鍵字)。
- UNION中的每個(gè)查詢必須包含相同的列、表達(dá)式或聚集函數(shù)(不過(guò)各個(gè)列不需要以相同的次序列出)。
- 列數(shù)據(jù)類型必須兼容:類型不必完全相同,但必須是DBMS可以隱含地轉(zhuǎn)換的類型(例如,不同的數(shù)值類型或不同的日期類型)。
如果遵守了這些基本規(guī)則或限制,則可以將并用于任何數(shù)據(jù)檢索任務(wù)。
??包含或取消重復(fù)的行
在上述所用的樣例SELECT語(yǔ)句。我們注意到在分別執(zhí)行時(shí),第一條SELECT語(yǔ)句返回4行,第二條SELECT語(yǔ)句返回5行。但在用UNION組合兩條SELECT語(yǔ)句后,只返回了8行而不是9行。
UNION從查詢結(jié)果集中自動(dòng)去除了重復(fù)的行(換句話說(shuō),它的行為與單條SELECT語(yǔ)句中使用多個(gè)WHERE子條件一樣)。因?yàn)楣?yīng)商1002生產(chǎn)的一種物品的價(jià)格也低于5,所以兩條SELECT語(yǔ)句都返回該行。在使用UNION時(shí),重復(fù)的行被自動(dòng)取消
這是UNION的默認(rèn)行為,但是如果需要,可以改變它。事實(shí)上,如果想返回所有匹配行,可使用UNION ALL而不是UNION。
請(qǐng)看下面的例子:
輸入
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);
輸出

分析
使用UNIONALL,MySOL不取消重復(fù)的行。因此這里的例子返回9行,其中有一行出現(xiàn)兩次。
UNION與WHERE
本篇文章開(kāi)始時(shí)說(shuō)過(guò),UNION幾乎總是完成與多個(gè)WHERE條件相同的工作。UNIONALL為UNION的一種形式,它完成WHERE子句完成不了的工作。如果確實(shí)需要每個(gè)條件的匹配行全部出現(xiàn)(包括重復(fù)行),則必須使用UNIONALL而不是WHERE
??對(duì)組合查詢結(jié)果排序
提示
SELECT語(yǔ)句的輸出用ORDER BY子排序。在用UNION組合查詢時(shí)只能使用一條ORDER BY子句,它必須出現(xiàn)在最后一條SELECT語(yǔ)句之后對(duì)于結(jié)果集,不存在用一種方式排序一部分,而又用另一種方式排序另部分的情況,因此不允許使用多條ORDER BY子句。
下面的例子排序前面UNION返回的結(jié)果:
輸入
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在最后一條SELECT語(yǔ)后使用了ORDER BY子句雖然ORDER BY子句似乎只是最后一條SELECT語(yǔ)句的組成部分,但實(shí)際上MySQL將用它來(lái)排序所有SELECT語(yǔ)句返回的所有結(jié)果。
組合不同的表
為使表述比較簡(jiǎn)單,本章例子中的組合查詢使用的均是相同的表。但是其中使用UNION的組合查詢可以應(yīng)用不同的表。
如何鞏固學(xué)習(xí)
提示:在學(xué)習(xí)的過(guò)程中,我們需要先自行進(jìn)行思考,而不是一遇到不會(huì)的就放棄思考直接看答案,如果最后遇到真的不會(huì)的題目,我們可以適當(dāng)?shù)倪M(jìn)行觀看答案,看自己的思路是否正確,在作出正確的判斷
本文小結(jié)
本篇文章講授如何用UNION操作符來(lái)組合SELECT語(yǔ)句。利用UNION,可把多條查詢的結(jié)果作為一條組合查詢返回,不管它們的結(jié)果中包含還是不包含重復(fù)。使用UNION可極大地簡(jiǎn)化復(fù)雜的WHERE子句,簡(jiǎn)化從多個(gè)表中檢索數(shù)據(jù)的工作。
到此這篇關(guān)于MySQL使用組合查詢的示例代碼的文章就介紹到這了,更多相關(guān)MySQL 組合查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql下普通用戶備份數(shù)據(jù)庫(kù)時(shí)無(wú)lock tables權(quán)限的解決方法
mysql使用普通用戶備份出現(xiàn)無(wú)lock tables權(quán)限的解決方法,需要的朋友可以參考下。2011-10-10
Dbeaver連接不上mysql數(shù)據(jù)庫(kù)(Access denied for user&nb
本文主要介紹了Dbeaver連接不上mysql數(shù)據(jù)庫(kù)(Access denied for user ‘root‘@‘localhost‘),嘗試了很多方法,下面就來(lái)介紹一下,感興趣的可以了解一下2024-04-04
從零教會(huì)你如何進(jìn)行前后端的數(shù)據(jù)庫(kù)(MySQL)連接操作
這篇文章主要介紹了如何從零開(kāi)始實(shí)現(xiàn)一個(gè)完整的前后端項(xiàng)目,將數(shù)據(jù)存儲(chǔ)在MySQL數(shù)據(jù)庫(kù)中,并通過(guò)API進(jìn)行實(shí)時(shí)的更新、查詢、修改和刪除操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02
簡(jiǎn)單了解mysql存儲(chǔ)字段類型查詢效率
這篇文章主要介紹了簡(jiǎn)單了解mysql存儲(chǔ)字段類型查詢效率,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
MySQL中將逗號(hào)分隔的字段轉(zhuǎn)換為多行數(shù)據(jù)的方法
在我們的實(shí)際開(kāi)發(fā)中,經(jīng)常需要存儲(chǔ)一些字段,它們使用像,?-?等連接符進(jìn)行連接,在查詢過(guò)程中,有時(shí)需要將這些字段使用連接符分割,然后查詢多條數(shù)據(jù),今天,我們將使用一個(gè)實(shí)際的生產(chǎn)場(chǎng)景來(lái)詳細(xì)解釋這個(gè)解決方案,需要的朋友可以參考下2024-04-04
MySQL 5.6下table_open_cache參數(shù)優(yōu)化合理配置詳解
這篇文章主要介紹了MySQL 5.6下table_open_cache參數(shù)合理配置詳解,需要的朋友可以參考下2018-03-03
mysql?count?為null時(shí),顯示0的問(wèn)題
這篇文章主要介紹了mysql?count?為null時(shí),顯示0的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09

