mysql_子查詢

子查詢指一個(gè)查詢語(yǔ)句嵌套在另一個(gè)查詢語(yǔ)句內(nèi)部的查詢

由一個(gè)具體的需求,引入子查詢:

一.子查詢的基本使用
>稱謂的規(guī)范:外查詢(或主查詢)、內(nèi)查詢(或子查詢)
> 子查詢(內(nèi)查詢)在主查詢之前一次執(zhí)行完成。
> 子查詢的結(jié)果被主查詢(外查詢)使用 。
注意事項(xiàng):
1.子查詢要包含在括號(hào)內(nèi)
2.將子查詢放在比較條件的右側(cè)
3.單行操作符對(duì)應(yīng)單行子查詢,多行操作符對(duì)應(yīng)多行子查詢

子查詢的分類
角度1:從內(nèi)查詢返回的結(jié)果的條目數(shù)
單行子查詢? vs? 多行子查詢
角度2:內(nèi)查詢是否被執(zhí)行多次
相關(guān)子查詢? vs? 不相關(guān)子查詢
?比如:相關(guān)子查詢的需求:查詢工資大于本部門平均工資的員工信息。
? ? ? ? ? ? 不相關(guān)子查詢的需求:查詢工資大于本公司平均工資的員工信息。
子查詢的編寫技巧(或步驟):① 從里往外寫? ② 從外往里寫

二.單行子查詢
單行操作符: =? !=? >? ?>=? <? <=?
HAVING 中的子查詢:
> 首先執(zhí)行子查詢。?
> 向主查詢中的HAVING子句返回結(jié)果。
CASE中的子查詢:
在CASE表達(dá)式中使用單列子查詢

三.多行子查詢
多行子查詢的操作符: IN? ?ANY? ALL? SOME(同ANY)
in: 屬于子查詢結(jié)果中的任意一個(gè)就行
any和all往往可以用其他查詢代替
舉例:

四.相關(guān)子查詢
(上面寫的案例都是不相關(guān)子查詢)
1.相關(guān)子查詢執(zhí)行流程:
如果子查詢的執(zhí)行依賴于外部查詢,通常情況下都是因?yàn)樽硬樵冎械谋碛玫搅送獠康谋?,并進(jìn)行了條件 關(guān)聯(lián),因此每執(zhí)行一次外部查詢,子查詢都要重新計(jì)算一次,這樣的子查詢就稱之為 關(guān)聯(lián)子查詢 。

2.代碼示例

3.EXISTS 與 NOT EXISTS關(guān)鍵字

五.拋一個(gè)思考題
自連接和子查詢兩種方式有好壞之分嗎?
自連接方式好!
理解:子查詢實(shí)際上是通過(guò)未知表進(jìn)行查詢后的條件判斷,而自連接是通過(guò)已知的自身數(shù)據(jù)表 進(jìn)行條件判斷,因此在大部分 DBMS 中都對(duì)自連接處理進(jìn)行了優(yōu)化。

六.練習(xí)