mysql?子查詢的概述和分類及單行子查詢功能實(shí)現(xiàn)
子查詢引入
查詢的基本結(jié)構(gòu)已經(jīng)給大家了,子查詢里面也是有一些新的內(nèi)容,子查詢其實(shí)就是在查詢中嵌套另一個(gè)查詢,叫嵌套查詢可能大家更容易理解一點(diǎn)..,類似與FOR循環(huán)和FOR循環(huán)的嵌套,這一章是我們查詢的最難的部分,大家
難度是查詢的頂峰,多表查詢和子查詢是非常重要,SQL優(yōu)化里面主要還是針對(duì)查詢的優(yōu)化.
子查詢是mysql4.1里面引入的,現(xiàn)在java用的比較多的是8.0,數(shù)據(jù)庫(kù)和java企業(yè)都沒(méi)有動(dòng)力去更新,我們講課的向下兼容的,雖然現(xiàn)在是8.0,但是講的還是會(huì)涉及,當(dāng)我們現(xiàn)在有一個(gè)需求,查詢誰(shuí)的工資比a高,所以我們要先查詢abel的工資,然后再把這個(gè)工資放入查詢條件中進(jìn)行查詢.
首先我們看到了這個(gè)需求,誰(shuí)的工資比abel高,我們?nèi)绾尾挥米硬樵儊?lái)進(jìn)行.
SELECT last_name,salary FROM employees WHERE last_name='abel'
我們可以看到abel工資的11000,我們現(xiàn)在就查詢工資比11000高就行.
我們要和數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行2次交互,效率肯定是比較低的,我們就像能不能用一條語(yǔ)句來(lái)進(jìn)行.我們是不是可以用自連接來(lái)進(jìn)行
SELECT T1.last_name,T1.salary FROM employees T1 JOIN employees T2 ON T1.salary>T2.salary AND T2.last_name='abel'
這時(shí)我們利用自連接,把所有工資比abel高的字段篩選出來(lái).
方式2自連接肯定要比方式1塊
1雖然這個(gè)條件可以用多表查詢,但是其他類似的條件就不能用自連接
2:這個(gè)不容易想出來(lái),不夠直觀
那么我們就可以引入子查詢
子查詢介紹
我們先寫WHERE條件,因?yàn)檫@個(gè)條件不是一個(gè)值,我們需要用另一個(gè)查詢才能查詢出來(lái),所以我們直接把查詢條件改成另一個(gè)查詢結(jié)構(gòu)SELECT last_name,salary
FROM employees WHERE salary>( SELECT salary FROM employees WHERE last_name='abel')
注意這里的查詢條件只能出現(xiàn)一個(gè)值.由一個(gè)問(wèn)題需求引入一個(gè)查詢
首先我們談?wù)勔粋€(gè)名稱,一個(gè)稱謂,子查詢包括了外查詢,和內(nèi)查詢.
外面的查詢就叫外查詢,里面的就叫內(nèi)查詢,這是相對(duì)的叫法.
外查詢也被叫做主查詢,內(nèi)查詢也被叫子查詢.
接下來(lái)我們看看有什么具體的要求,
1子查詢是在主查詢之前一次查詢,
2子查詢的結(jié)果被外查詢使用
注意事項(xiàng)
1:子查詢要被括號(hào)包裹,由于子查詢比較復(fù)雜,用括號(hào)包裹會(huì)比較清晰
2子查詢要放在比較條件的右側(cè)
Ps,就是在比較符號(hào)的后面,如果在前面就是這樣
SELECT last_name,salary FROM employees WHERE ( SELECT salary FROM employees WHERE last_name='abel')<salary
我們會(huì)發(fā)現(xiàn)這樣也行,但是為什么要這樣呢,我們這是為了可讀性和美觀的考慮.頭短尾長(zhǎng)比較好.
3.單行操作費(fèi)對(duì)應(yīng)單行子查詢,多行操作符對(duì)應(yīng)多行子查詢.
子查詢分類
分類可以從不同的角度去分,第一個(gè)角度,
角度1: 出多個(gè)結(jié)果或者一個(gè)結(jié)
單行子查詢,,
查詢之后出一個(gè)結(jié)果的就是單行子查詢
多行子查詢
查詢之后出多個(gè)結(jié)果的就是單行子查詢
角度2內(nèi)查詢是否被執(zhí)行多次
相關(guān)查詢:
比如我們需要查詢部門工資大于本部門平均工資的員工信息
里面的子查詢會(huì)因?yàn)橥獠樵冇涗洸块T的不同返回的值而改變.也就是返回不同的平均值.
比如白和白生的就是黑的,
不相關(guān)查詢
比如需求我們要查詢工資大于公司的平均工資的員工.
里面的子查詢,或者說(shuō)內(nèi)查詢條件,不會(huì)跟隨外查詢記錄的改變而改變,
這里的就說(shuō)清楚了,因?yàn)槲覀兊淖硬樵冋Z(yǔ)句比較多,所以要寫的行數(shù)也比較多,所以我們先做一個(gè)分類,我們下面要講的就是單行子查詢和多行子查詢的案例.
我會(huì)把這兩個(gè)查詢的范圍都限制在不相關(guān)子查詢內(nèi)容,所以下面的相關(guān)子查詢把這個(gè)難度就調(diào)高起來(lái)
趁熱打鐵開(kāi)始吧
也就是里面只有一個(gè)數(shù)據(jù)供我們外部使用,
子查詢的編寫技巧:
1從里往外寫
2從外往里寫
單行子查詢
單行子查詢操作符號(hào)
= != > < <> <= >=
也就是我們之前的邏輯操作符號(hào)
情況1
”查詢工資大于149號(hào)員工工資的員工信息
由于我們不知道149號(hào)員工的工資,我們就要進(jìn)行子查詢.”
這里因?yàn)楸容^簡(jiǎn)單,所以我們技巧1和技巧2都可以
我們就先寫子查詢
SELECT employee_id FROM employees WHERE employee_id=149
再寫外查詢
沒(méi)問(wèn)題,我們就查詢出來(lái)了
題目2返回job_id與141號(hào)員工相同,salary比143員工多的員工姓名
SELECT employee_id,job_id,salary FROM employees WHERE job_id=( SELECT job_id FROM employees WHERE employee_id=141) AND salary>( SELECT salary FROM employees WHERE employee_id=143)
如果我們看見(jiàn)了一個(gè)查詢語(yǔ)句,我們可以把這個(gè)語(yǔ)句轉(zhuǎn)換為中文嗎,也就是要看出這個(gè)查詢語(yǔ)句來(lái)看出它的需求.這個(gè)能力也要有,我們現(xiàn)在主要是做需求.
題目返回公司工資最少的員工last_name,job_id和salary
SELECT last_name,job_id,salary FROM employees WHERE salary=( SELECT MIN(salary) FROM employees)
注意這里可能是好幾個(gè)員工,但是還是單行子查詢,因?yàn)槲覀儍?nèi)查詢只返回一條記錄
情況2
查詢與141號(hào)員工的manager_id和department_id相同的其他員工的employee_id,manager_id,department_id
我們先不用理過(guò)濾條件,查詢其他員工的
employee_id,manager_id,department_id還是會(huì)寫的把,我們就先寫外查詢 SELECT employee_id,manager_id,department_id FROM employees WHERE
然后補(bǔ)充內(nèi)查詢
SELECT employee_id,manager_id,department_id FROM employees WHERE manager_id =( SELECT manager_id FROM employees WHERE employee_id=141) AND department_id =( SELECT department_id FROM employees WHERE employee_id=141)
這是方式1:
方式1成對(duì)子查詢
我們還有一個(gè)方式2,可以一次性把兩個(gè)字段條件寫在一起
SELECT employee_id,manager_id,department_id FROM employees WHERE (manager_id,department_id) =( SELECT manager_id,department_id FROM employees WHERE employee_id=141)
結(jié)果是一致的,這叫我們的成對(duì)子查詢.效率上差別不大,上面的適用性比較高,所以這個(gè)不會(huì)寫也沒(méi)事,了解就可以了.適用場(chǎng)景太窄了
情況3,HAVING中的子查詢
題目:查詢最低工資大于50號(hào)部門最低工資的 部門id和其最低工資
SELECT MIN(salary) SELECT department_id,MIN(salary) FROM employees GROUP BY department_id HAVING MIN(salary)>( SELECT MIN(salary) FROM employees WHERE department_id=50)
因?yàn)槲迨?hào)部門工資是不確定的,所以我們要用到子查詢
這里不行要空值我們就可以用外查詢WHERE篩選掉
SELECT department_id,MIN(salary) FROM employees WHERE department_id IS NOT NULL GROUP BY department_id HAVING MIN(salary)>( SELECT MIN(salary) FROM employees WHERE department_id=50)
所以我們HAVING中我們也可以使用子查詢
情況4:CASE中的子查詢
顯示員工的employee_id,last_name和location.其中若員工department_id與location_id為1800的department_id相同則location為canada,其余為USA
這里我們還是先寫外查詢?cè)賹憙?nèi)查詢,
SELECT employee_id,last_name,( CASE department_id WHEN ( SELECT department_id FROM departments JOIN locations T3 ON T3.location_id=departments.location_id WHERE T3.location_id=1800) THEN 'canada' ELSE 'USA' END ) "location" FROM employees
情況5:子查詢中的空值問(wèn)題.
如果子查詢的結(jié)果是空值,那么不會(huì)報(bào)錯(cuò),返回的會(huì)是一個(gè)空表比如下面這種情況
SELECT last_name,job_id FROM employees WHERE job_id=(SELECT job_id FROM employees WHERE last_name=102)
情況6:非法使用子查詢
如果我們用單行操作符進(jìn)行多行操作,會(huì)出現(xiàn)什么情況
這時(shí)會(huì)直接報(bào)錯(cuò)
到此這篇關(guān)于mysql 子查詢的概述和分類及單行子查詢的文章就介紹到這了,更多相關(guān)mysql 子查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL升級(jí)PostgreSQL遇到的一些常見(jiàn)問(wèn)題及解決方案
MySQL是一款性能優(yōu)越、數(shù)據(jù)可靠性高的數(shù)據(jù)庫(kù)軟件,然而為了保證其長(zhǎng)期有效運(yùn)行,數(shù)據(jù)庫(kù)升級(jí)是非常重要的,下面這篇文章主要給大家介紹了關(guān)于MySQL升級(jí)PostgreSQL遇到的一些常見(jiàn)問(wèn)題及解決方案的相關(guān)資料,需要的朋友可以參考下2024-05-05解決MySQL server has gone away錯(cuò)誤的方案
在本篇文章里小編給大家分享的是一篇關(guān)于MySQL server has gone away錯(cuò)誤的解決辦法,有需要的朋友們可以參考下。2020-02-02mysql中secure_file_priv=不生效問(wèn)題及解決
這篇文章主要介紹了mysql中secure_file_priv=不生效問(wèn)題及解決方案,以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家,2024-01-01MySQL 多個(gè)%等模糊查詢功能實(shí)現(xiàn)
這篇文章主要介紹了MySQL 多個(gè)%等模糊查詢功能實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07MySQL從一個(gè)表中查出數(shù)據(jù)并插入到另一個(gè)表的詳細(xì)處理方案
這篇文章主要給大家介紹了關(guān)于MySQL從一個(gè)表中查出數(shù)據(jù)并插入到另一個(gè)表的詳細(xì)處理方案,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12Mysql version can not be less than 4.1 出錯(cuò)解決辦法
這篇文章主要介紹了Mysql version can not be less than 4.1 解決辦法的相關(guān)資料,需要的朋友可以參考下2016-10-10MySQL 查詢某個(gè)字段含有字母數(shù)字的值示例詳解
在本文中,我們?cè)敿?xì)介紹了如何在 MySQL 中查詢某個(gè)字段含有字母和數(shù)字的值,我們首先介紹了正則表達(dá)式的基礎(chǔ)知識(shí),然后通過(guò)五個(gè)具體示例展示了如何應(yīng)用這些知識(shí),通過(guò)這些示例,我們可以看到正則表達(dá)式在處理復(fù)雜字符串模式匹配時(shí)的強(qiáng)大功能,感興趣的朋友跟隨小編一起看看吧2024-05-05