日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

详细讲述MySQL中的子查询操作

發布時間:2024/4/18 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详细讲述MySQL中的子查询操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基本含義

??? 就是在一個查詢語句(select語句)中的內部,某些位置,又出現的“查詢語句”。

例:
這里寫圖片描述
修改后:
這里寫圖片描述

??? 如果將該“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;

??? 1

例:

??? 找出最高價的商品;

select * from product? where? price = (select? max(price)? from? product );

??? 1

??? 使用in的子查詢

??? 以前用的in的用法:

XX? in? (值1,值2,值3,....);

??? 1

??? 則in子查詢為:

XX? in? (列子查詢)

??? 1

例:

??? 找出所有類別名稱中帶“電”這個字的所有商品;

select? *? from? product? where? protype_id? in(
select? protype_id? from? product_type? where? protype_name? like ‘%電%’
);

??? 1
??? 2
??? 3

??? 使用any的子查詢

形式:

操作數 比較運算符 any? (列子查詢);

??? 1

含義:

??? 當某個操作數(字段) 對于該列子查詢的其中任意一個值,滿足該比較運算符,則就算是滿足了條件;
??? 例:

select? *? from? tab1? where? id >? any? (select? f1? from? tab2);

??? 1

??? 使用all的子查詢:

形式:

操作數? 比較運算符 all?? (列子查詢);

??? 1

含義:

??? 當某個操作數(字段) 對于該列子查詢的所有數據值,都滿足該比較運算符,才算滿足了條件;

例:

select? *? from? tab2? where? f1? >? all? ( select? id? from?? tab1 );

??? 1

??? 使用some的子查詢

??? 一句話:some是any的同義詞。

??? 使用exists的查詢

形式:

where? exists( 子查詢 )

??? 1

含義:

??? 該子查詢如果“有數據”,則exists的結果是true,否則就是false

說明:

??? 因為,exists子查詢的該含義,造成主查詢往往出現這樣的情形:要么全都取出,要么都不取出。如果局限于這個含義(使用情形),其基本就失去了它的現實使用意義。

所以:

??? 實際應用中,該子查詢,往往都不是獨立的子查詢,而是會需要跟“主查詢”的數據源(表),建立某種關系——通常就是連接關系。建立的方式是“隱式的”,即沒有在代碼上體現關系,但卻在內部有其連接的“實質”。

??? 此隱式連接方式,通常就體現在子查詢中的where條件語句中,使用了主查詢表中的數據(字段);

例:

??? 查詢商品表中其類別名稱中帶“電”這個字的所有商品;
??? 這里寫圖片描述

結果就:
這里寫圖片描述

注意:
- 這種子查詢語句,沒法“獨立存在(獨立運行)”,而是必須跟主查詢一起使用;
- 其他子查詢,是可以獨立運行的,而且會得到一個運行的結果。
- 該子查詢中的條件,應該設定為跟主查詢的某個字段有一定的關聯性判斷,通常該判斷就是這兩個表的“本來該有的連接條件”

最后一個結論:

??? 如果一個查詢需求,可以使用連接查詢的,也可以使用子查詢得到,則通常推薦使用連接插敘,效率歸更高。
————————————————
版權聲明:本文為CSDN博主「change_any_time」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/change_any_time/article/details/79478878

總結

以上是生活随笔為你收集整理的详细讲述MySQL中的子查询操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。