一文帶你了解MySQL中的子查詢
1. 需求分析與問題解決
1.1實(shí)際問題
誰的工資比 馬云 高?
方式1:原始方法
SELECT salary FROM employees WHERE last_name = '馬云';
返回結(jié)果:馬云的工資為 11000
那么我們查詢出工資比 11000 高的即可。
SELECT last_name,salary FROM employees WHERE salary > 11000;
方式2:自連接
SELECT e2.last_name,e2.salary FROM employees e1,employees e2 WHERE e1.last_name = '馬云' AND e1.`salary` < e2.`salary`
方式3:子查詢
SELECT last_name,salary FROM employees WHERE salary > ( SELECT salary FROM employees WHERE last_name = '馬云' );
1.2 子查詢的基本使用
- 子查詢的基本語法結(jié)構(gòu)

子查詢(內(nèi)查詢)在主查詢之前一次執(zhí)行完成。
子查詢的結(jié)果被主查詢(外查詢)使用 。
注意事項(xiàng)
- 子查詢要包含在括號(hào)內(nèi)
- 將子查詢放在比較條件的右側(cè)
- 單行操作符對(duì)應(yīng)單行子查詢,多行操作符對(duì)應(yīng)多行子查詢
1.3 子查詢的分類
分類方式1:
我們按內(nèi)查詢的結(jié)果返回一條還是多條記錄,將子查詢分為單行子查詢、多行子查詢。分類方式2:
我們按內(nèi)查詢是否被執(zhí)行多次,將子查詢劃分為 相關(guān)(或關(guān)聯(lián))子查詢 和 不相關(guān)(或非關(guān)聯(lián))子查詢 。
- 子查詢從數(shù)據(jù)表中查詢了數(shù)據(jù)結(jié)果,如果這個(gè)數(shù)據(jù)結(jié)果只執(zhí)行一次,然后這個(gè)數(shù)據(jù)結(jié)果作為主查詢的條件進(jìn)行執(zhí)行,那么這樣的子查詢叫做不相關(guān)子查詢。
- 同樣,如果子查詢需要執(zhí)行多次,即采用循環(huán)的方式,先從外部查詢開始,每次都傳入子查詢進(jìn)行查詢,然后再將結(jié)果反饋給外部,這種嵌套的執(zhí)行方式就稱為相關(guān)子查詢。
2. 單行子查詢
2.1 單行比較操作符
| 操作符 | 含義 |
|---|---|
| = | 等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| != | 不等于 |
2.2 代碼示例
題目:查詢工資大于2023號(hào)員工工資的員工的信息
SELECT * FROM emp WHERE salary > (SELECT salary FROM emp WHERE eid = 2023)
2.3 HAVING 中的子查詢
- 首先執(zhí)行子查詢。
- 向主查詢中的HAVING 子句返回結(jié)果。
題目:查詢最低工資大于50號(hào)部門最低工資的部門id和其最低工資
SELECT department_id, MIN(salary) FROM emp GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM emp WHERE department_id = 50);
2.4 注意的問題
- 子查詢中的空值問題
SELECT last_name, job_id FROM emp WHERE job_id = (SELECT job_id FROM emp WHERE last_name = '劉強(qiáng)東');
- 該子查詢不返回任何行,因?yàn)樽硬樵兎祷乜?/li>
- 非法使用子查詢
SELECT employee_id, last_name FROM emp WHERE salary = (SELECT MIN(salary) FROM emp GROUP BY department_id);
- 多行子查詢使用單行比較符
3. 多行子查詢
- 也稱為集合比較子查詢
- 內(nèi)查詢返回多行
- 使用多行比較操作符
3.1 多行比較操作符

體會(huì) ANY 和 ALL 的區(qū)別
3.2 代碼示例
題目1:返回其它job_id中比job_id為‘IT_PROG’部門任一工資低的員工的員工號(hào)、姓名、job_id 以及salary

題目2:返回其它job_id中比job_id為‘IT_PROG’部門所有工資都低的員工的員工號(hào)、姓名、job_id以及salary

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

說明:子查詢中使用主查詢中的列
4.2 代碼示例
題目:查詢員工中工資大于本部門平均工資的員工的last_name,salary和其department_id
方式1:略
方式2:在 FROM 中使用子查詢
SELECT last_name,salary,e1.department_id FROM employees e1,(SELECT department_id,AVG(salary) dept_avg_sal FROM employees GROUP BY department_id) e2 WHERE e1.`department_id` = e2.department_id AND e2.dept_avg_sal < e1.`salary`;
from型的子查詢:子查詢是作為from的一部分,子查詢要用()引起來,并且要給這個(gè)子查詢?nèi)e名,把它當(dāng)成一張“臨時(shí)的虛擬的表”來使用。
以上就是一文帶你了解MySQL中的子查詢的詳細(xì)內(nèi)容,更多關(guān)于MySQL 子查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL 配置優(yōu)化(多個(gè)參數(shù))
安裝MySQL后,配置文件my.cnf在 /MySQL安裝目錄/share/mysql目錄中,該目錄中還包含多個(gè)配置文件可供參考,有my-large.cnf ,my-huge.cnf, my-medium.cnf,my-small.cnf,分別對(duì)應(yīng)大中小型數(shù)據(jù)庫(kù)應(yīng)用的配置。win環(huán)境下即存在于MySQL安裝目錄中的.ini文件2016-05-05
使用mysql語句對(duì)分組結(jié)果進(jìn)行再次篩選方式
這篇文章主要介紹了使用mysql語句對(duì)分組結(jié)果進(jìn)行再次篩選方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
MySQL連表更新實(shí)現(xiàn)高效數(shù)據(jù)同步的實(shí)戰(zhàn)指南
在數(shù)據(jù)庫(kù)開發(fā)中,連表更新(JOIN UPDATE)是一種常見且強(qiáng)大的操作,它允許我們基于關(guān)聯(lián)表的數(shù)據(jù)來更新目標(biāo)表,本文將深入探討MySQL連表更新的語法、應(yīng)用場(chǎng)景、性能優(yōu)化及常見陷阱,幫助開發(fā)者掌握這一核心技能,需要的朋友可以參考下2026-02-02
詳解Mysql5.7自帶的壓力測(cè)試命令mysqlslap及使用語法
mysqlslap是一個(gè)診斷程序,旨在模擬MySQL服務(wù)器的客戶端負(fù)載并報(bào)告每個(gè)階段的時(shí)間。這篇文章主要介紹了Mysql5.7自帶的壓力測(cè)試命令mysqlslap的相關(guān)知識(shí),需要的朋友可以參考下2019-10-10

