一文帶你了解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 子查詢的基本使用
- 子查詢的基本語(yǔ)法結(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)樽硬樵冎械谋碛玫搅送獠康谋恚⑦M(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中流程控制函數(shù)/統(tǒng)計(jì)函數(shù)/分組查詢用法解析
這篇文章主要介紹了MySql中流程控制函數(shù)/統(tǒng)計(jì)函數(shù)/分組查詢用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Mysql給普通分頁(yè)查詢結(jié)果加序號(hào)實(shí)操
這篇文章主要介紹了Mysql給普通分頁(yè)查詢結(jié)果加序號(hào)實(shí)操,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09解決Win7 x64安裝解壓版mysql 5.7.18 winx64出現(xiàn)服務(wù)無法啟動(dòng)問題
這篇文章主要介紹了解決Win7 x64安裝解壓版mysql 5.7.18 winx64出現(xiàn)服務(wù)無法啟動(dòng)問題,需要的朋友可以參考下2017-05-05MySQL更新某個(gè)字段拼接固定字符串的實(shí)現(xiàn)
在MySQL中,我們經(jīng)常需要對(duì)數(shù)據(jù)庫(kù)中的某個(gè)字段進(jìn)行更新操作,本文就來介紹一下MySQL更新某個(gè)字段拼接固定字符串的實(shí)現(xiàn),感興趣的可以了解一下2025-04-04Mysql如何在linux中實(shí)現(xiàn)定時(shí)備份
這篇文章主要介紹了Mysql如何在linux中實(shí)現(xiàn)定時(shí)備份,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09MySQL ERROR 2013 (HY000)錯(cuò)誤解決方法
這篇文章主要介紹了MySQL ERROR 2013 (HY000)錯(cuò)誤解決方法,錯(cuò)誤提示全文ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104,需要的朋友可以參考下2015-01-01