子查詢基本含義,就是在一個查詢語句(select語句)中的內部,某些位置,又出現的“查詢語句”。本文主要和大家分享mysql子查詢簡單介紹,希望能幫助到大家。
例:
修改后:
如果將該“select 5000”的子查詢語句,替換為“select出來所有商品的平均價”,就具有了現實含義。
-
子查詢是為主查詢服務的
-
都是子查詢獲得一定的結果數據之后,才去執行主查詢;
在形式上,可以有如下表達:
-
selelct 字段或表達式或子查詢 [as 別名] from 表名或鏈接結果或子查詢 where ?字段或表達式或子查詢的條件判斷
即可以在這幾個位置出現子查詢(其中having其實也可以,因為它跟where是一樣含義);
子查詢,按位置(場合)分:
類型 | 形式 |
---|---|
作為主查詢的結果數據 | select c1,(select f1 from tab2) as f11 from tab1; #這里子查詢應該只有一個數據(一行一列,標量子查詢) |
作為主查詢的條件數據 | select c1 from tab1 where c1 in (select f1 from tab2); #這里子查詢可以是多個數據(多行一列,列子查詢) |
作為主查詢的來源數據 | select c1 from (select f1 as c1, f2 from tab2) as t2; #這里子查詢可以是任意查詢結果(表子查詢) |
常見子查詢
比較運算符中的子查詢
形式:
-
操作數 比較運算符 (標量子查詢);
說明:
-
操作數,其實就是比較運算符的2個數據之一而已,通常就是一個字段名;
??select?....??from?XXX?where??id?>?5;
例:
-
找出最高價的商品;
select?*?from?product??where??price?=?(select??max(price)??from??product?);
使用in的子查詢
-
以前用的in的用法:
XX??in??(值1,值2,值3,....);
-
則in子查詢為:
XX??in??(列子查詢)
例:
-
找出所有類別名稱中帶“電”這個字的所有商品;
select??*??from??product??where??protype_id??in(? select??protype_id??from??product_type??where??protype_name??like?‘%電%’ );
使用any的子查詢
形式:
操作數?比較運算符?any??(列子查詢);
含義:
-
當某個操作數(字段) 對于該列子查詢的其中任意一個值,滿足該比較運算符,則就算是滿足了條件;
例:
select??*??from??tab1??where??id?>??any??(select??f1??from??tab2);
使用all的子查詢:
形式:
操作數??比較運算符?all???(列子查詢);
含義:
-
當某個操作數(字段) 對于該列子查詢的所有數據值,都滿足該比較運算符,才算滿足了條件;
例:
select??*??from??tab2??where??f1??>??all??(?select??id??from???tab1?);
使用some的子查詢
-
一句話:some是any的同義詞。
使用exists的查詢
形式:
where??exists(?子查詢?)
含義:
-
該子查詢如果“有數據”,則exists的結果是true,否則就是false
說明:
因為,exists子查詢的該含義,造成主查詢往往出現這樣的情形:要么全都取出,要么都不取出。如果局限于這個含義(使用情形),其基本就失去了它的現實使用意義。
所以:
實際應用中,該子查詢,往往都不是獨立的子查詢,而是會需要跟“主查詢”的數據源(表),建立某種關系——通常就是連接關系。建立的方式是“隱式的”,即沒有在代碼上體現關系,但卻在內部有其連接的“實質”。
-
此隱式連接方式,通常就體現在子查詢中的where條件語句中,使用了主查詢表中的數據(字段);
例:
-
查詢商品表中其類別名稱中帶“電”這個字的所有商品;
結果就:
注意:
– 這種子查詢語句,沒法“獨立存在(獨立運行)”,而是必須跟主查詢一起使用;
– 其他子查詢,是可以獨立運行的,而且會得到一個運行的結果。
– 該子查詢中的條件,應該設定為跟主查詢的某個字段有一定的關聯性判斷,通常該判斷就是這兩個表的“本來該有的連接條件”
最后一個結論:
如果一個查詢需求,可以使用連接查詢的,也可以使用子查詢得到,則通常推薦使用連接插敘,效率歸更高。
相關推薦: