共計 4154 個字符,預計需要花費 11 分鐘才能閱讀完成。
本文丸趣 TV 小編為大家詳細介紹“mysql 中有沒有嵌套查詢語句”,內容詳細,步驟清晰,細節處理妥當,希望這篇“mysql 中有沒有嵌套查詢語句”文章能幫助大家解決疑惑,下面跟著丸趣 TV 小編的思路慢慢深入,一起來學習新知識吧。
mysql 中有嵌套查詢語句,語法為“SELECT 語句 WHERE 條件 (SELECT 語句)”;該語句也被稱為子查詢語句,能夠在已有的查詢語句中的 where 后面再嵌套一層查詢語句,也即將內層查詢結果當做外層查詢參照的數據來使用。
本教程操作環境:windows10 系統、mysql8.0.22 版本、Dell G3 電腦。
mysql 中有嵌套查詢語句嗎
嵌套查詢,也稱為子查詢,是實際工作中經常用到的一種查詢方式。子查詢其實就是在已有的查詢語句中的 where 后面再嵌套一層查詢語句,也就是把內層查詢結果當做外層查詢參照的數據表來使用。
在工作中,經常會遇見 4 種子查詢,即含有比較運算符(、=、、=、=、!=)、IN 關鍵詞、ANY/ALL 關鍵詞以及 EXISTS 關鍵詞的嵌套查詢。下面我們以學員考試成績為例,來學習一下這四種子查詢的應用。
# 創建學員信息表
CREATE TABLE stu_info
id INT AUTO_INCREMENT PRIMARY KEY,
iname VARCHAR(20),
gender CHAR(1),
department VARCHAR(10),
age TINYINT,
province VARCHAR(10),
email VARCHAR(50),
mobilephone CHAR(11)
# 向學員表中插入數據
INSERT INTO stu_info(iname,gender,department,age,province,email,mobilephone) VALUES
(張勇 , 男 , 數學系 ,23, 河南 , sfddf123dd@163.com , 13323564321),
(王兵 , 男 , 數學系 ,25, 江蘇 , lss1993@163.com , 17823774329),
(劉偉 , 男 , 計算機系 ,21, 江蘇 , qawsed112@126.com , 13834892240),
(張峰 , 男 , 管理系 ,22, 上海 , 102945328@qq.com , 13923654481),
(董敏 , 女 , 生物系 ,22, 浙江 , 82378339@qq.com , 13428439022),
(徐曉紅 , 女 , 計算機系 ,24, 浙江 , xixiaohong@gmail.com , 13720097528),
(趙伊美 , 女 , 數學系 ,21, 江蘇 , zhaomeimei@163.com , 13417723980),
(王建國 , 男 , 管理系 ,24, 浙江 , 9213228402@qq.com , 13768329901),
(劉清 , 女 , 統計系 ,23, 安徽 , lq1128@gmail.com , 17823651180),
( 趙家和 , 男 , 計算機系 ,28, 山東 , dcrzdbjh@163.com , 13827811311
# 創建學員成績表
CREATE TABLE stu_score( id INT , Excel TINYINT, Tableau TINYINT, MySQL TINYINT );
# 向成績表中插入數據
INSERT INTO stu_score VALUES
(1,87,72,88),
(3,90,66,72),
(2,90,70,86),
(4,88,82,76),
(8,92,67,80),
(10,88,82,89),
(5,79,66,60),
(7,91,78,90),
(6,82,79,88),
(9,85,70,85);
# 1. 查詢年齡超過所有學員平均年齡的學員信息
SELECT * FROM stu_info
WHERE age = avg(age);
#需要注意的是 Where 后面不能使用聚合函數
#應該修改成
SELECT AVG(age) FROM stu_info;
SELECT * FROM stu_info
WHERE age =23.3
#二合一
# 1. 查詢年齡超過所有學員平均年齡的學員信息
SELECT * FROM stu_info
WHERE age = (SELECT AVG(age) FROM stu_info);
# 2. 查詢年齡不低于所屬系平均年齡的學員信息
SELECT * FROM stu_info AS s1
WHERE age = ( SELECT avg(age) FROM stu_info AS s2
WHERE s1.department = s2.department);
使用含比較運算符的嵌套查詢時,需要注意,比較運算符后面的子查詢只能返回一個結果。
(2)含 ANY 或 ALL 關鍵詞的嵌套查詢
對于含比較運算符的嵌套查詢來說,嵌套部分的查詢語句只能返回一個值。那如果子查詢返回多個值,就需要用到 ANY 或者 ALL 關鍵詞了。通常,ANY / ALL 關鍵詞經常和比較運算符連用,下面是 6 種比較運算符與 ANY / ALL 關鍵詞的搭配結果:
# 1. 查詢非管理系中比管理系任意一個學員年齡小的學員信息 SELECT * FROM stu_info
WHERE age ANY(SELECT DISTINCT age FROM stu_info WHERE department = 管理系)
AND department != 管理系
這里的查詢邏輯是這樣的:首先查詢管理系中學生的年齡(去重),得到的結果是 22 和 24;然后查詢出非管理系中年齡比 22 或 24 年齡小的學生信息(也就是年齡小于 24 的非管理系學生信息)。
# 2. 查詢非管理系中比管理系所有學員年齡大的學員信息 SELECT * FROM stu_info
WHERE age ALL (SELECT DISTINCT age FROM stu_info WHERE department = 管理系)
AND department != 管理系
這里的查詢邏輯是這樣的:首先查詢管理系中學生的年齡(去重),得到的結果是 22 和 24;然后查詢出非管理系中年齡比 22 和 24 都大的學生信息(也就是年齡大于 24 的非管理系學生信息)。
(3)含 IN 關鍵詞的嵌套查詢
當查詢條件涉及某些已知的可枚舉離散值的時候,我們就可以選擇 IN 關鍵詞來完成數據的提取。IN 關鍵詞有兩種用法:
將可枚舉的離散值直接寫在值列表中
當離散值是基于其他表的篩選結果時,就可以使用嵌套查詢,即把另一個表的查詢語句塊寫在 IN 關鍵詞后面的括號里。
# 1. 查詢數學系和計算機系的學員信息
SELECT * FROM stu_info WHERE department IN( 數學系 , 計算機系
# 2. 查詢與張勇、劉偉同一個系的學員信息
SELECT * FROM stu_info
WHERE department IN (SELECT department FROM stu_info WHERE iname IN( 張勇 , 劉偉
# 3. 查詢 MySQL 成績大于 85 分的學員信息
SELECT * FROM stu_info
WHERE id IN (SELECT id FROM stu_score WHERE MySQL 85);
需要注意的是,在使用 IN 關鍵詞的嵌套查詢的時候,嵌套部分只能返回一個字段的信息(比如上面的 department 字段或者 id 字段),如果返回兩個及以上字段信息則會出現語法錯誤。
(4)含 EXISTS 關鍵詞的嵌套查詢
EXISTS 關鍵詞的作用和 IN 關鍵詞非常類似,不同的是,通過 EXISTS 關鍵詞的嵌套查詢返回的不是具體的值集合,而是滿足條件的邏輯值(也就是 True / False)。也就是說,EXISTS 的作用就是“判斷是否存在滿足某種條件的記錄”,如果存在這樣的記錄就返回真(True),如果不存在這樣的記錄就返回假(False)。
# 查詢 MySQL 成績大于 85 分的學員信息 SELECT * FROM stu_info
WHERE EXISTS(SELECT * FROM stu_score WHERE stu_score.id = stu_info.id AND MySQL 85);
需要注意的是,使用 EXISTS 關鍵詞的嵌套語句 WHERE 與 EXISTS 關鍵詞之間沒有任何參數,這是因為 EXISTS 只需要一個參數,通常是在 EXISTS 右側加一個子查詢語句。此外,EXISTS 后面的子查詢中 SELECT 后面可以寫表中任何一個字段或者星號或者一個常數,因為 EXISTS 后面的子查詢只關心是否存在滿足條件的記錄。下面返回的結果都是一樣:
【補充】關于 IN 和 EXISTS 兩個關鍵詞還有兩個延伸關鍵詞 NOT IN 和 NOT EXISTS
# 查詢數學系和計算機系之外的學員信息
# 方法一
SELECT * FROM stu_info
WHERE department NOT IN( 數學系 , 計算機系
#方法二
SELECT * FROM stu_info
WHERE NOT EXISTS(SELECT * FROM stu_score WHERE department IN( 數學系 , 計算機系) and stu_score.id = stu_info.id);
# not exists 的邏輯比較復雜,需要大家慢慢領會
# 主要看 not exists 括號中的 sql 語句是否有結果,無結果:才會繼續執行 where 條件;有結果:視為 where 條件不成立。
# 當子查詢和主查詢有關聯條件時,相當于從主查詢中去掉子查詢的數據。
對于 IN 和 EXISTS 兩個關鍵詞,大多數情況下都可以相互替換,主要差別是使用效率問題,通常情況下采用 EXISTS 要比 IN 效率要高,但也要看實際情況具體使用:IN 適合于外表大而內表小的情況;EXISTS 適合于外表小而內表大的情況。
讀到這里,這篇“mysql 中有沒有嵌套查詢語句”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注丸趣 TV 行業資訊頻道。