<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

      SQL 子查詢到底難在哪?一篇文章講透單行子查詢,附實(shí)戰(zhàn)案例

      0
      分享至



      很多人學(xué) SQL 時,最開始覺得 SELECT、WHERE、ORDER BY 都挺順手,結(jié)果一碰到子查詢,馬上開始犯迷糊。

      其實(shí)子查詢一點(diǎn)都不神秘,你可以把它理解成:

      先算出一個結(jié)果,再拿這個結(jié)果去篩數(shù)據(jù)。

      這篇文章,我們就用最常見的員工表 emp 來講清楚:

      • 什么是子查詢
      • 為什么子查詢比“分兩步查”更實(shí)用
      • 什么是不相關(guān)子查詢
      • 什么是單行子查詢
      • 3 個高頻案例實(shí)戰(zhàn)
      • 常見報錯與避坑建議

      如果你正好在學(xué)數(shù)據(jù)庫,這篇建議收藏。

      一、什么是子查詢?

      先看一個非常典型的需求:

      查詢工資高于 CLARK 的所有員工信息。

      很多初學(xué)者會怎么做?

      寫法 1:分兩步查

      先查出 CLARK 的工資:

      SELECT salFROM empWHERE ename = 'CLARK';

      運(yùn)行結(jié)果:

      2450

      再查工資大于 2450 的員工:

      SELECT *FROM empWHERE sal > 2450;

      運(yùn)行結(jié)果示意:

      EMPNO ENAME  JOB       MGR   HIREDATE    SAL   COMM  DEPTNO7839  KING   PRESIDENT NULL  1981-11-17  5000  NULL  107566  JONES  MANAGER   7839  1981-04-02  2975  NULL  207788  SCOTT  ANALYST   7566  1987-04-19  3000  NULL  207902  FORD   ANALYST   7566  1981-12-03  3000  NULL  207698  BLAKE  MANAGER   7839  1981-05-01  2850  NULL  30

      這種方式能不能查出來?當(dāng)然能。

      但問題也很明顯:

      1. 需要執(zhí)行兩條 SQL;
      2. 第一步的結(jié)果要人工接到第二步里;
      3. 如果 CLARK 的工資變了,第二條 SQL 里的數(shù)值也得跟著改。

      這就是很多人寫 SQL 時效率不高的根源。

      二、子查詢?yōu)槭裁锤糜茫?/p>

      還是剛才那個需求,我們直接合并成一條 SQL:

      SELECT *FROM empWHERE sal > (SELECT salFROM empWHERE ename = 'CLARK');

      這條 SQL 的意思很直接:

      • 先執(zhí)行括號里的查詢,拿到 CLARK 的工資;
      • 再執(zhí)行外層查詢,找出工資比它高的人。
      這就是子查詢

      也就是說:

      一條 SQL 語句中嵌套了另一條 SELECT 語句,這種結(jié)構(gòu)就叫子查詢。
      三、子查詢的執(zhí)行順序

      子查詢最重要的一個原則:

      先執(zhí)行子查詢,再執(zhí)行外層查詢。

      比如下面這句:

      SELECT *FROM empWHERE sal > (SELECT salFROM empWHERE ename = 'CLARK');

      實(shí)際執(zhí)行邏輯相當(dāng)于:

      第一步:執(zhí)行子查詢

      SELECT salFROM empWHERE ename = 'CLARK';

      得到:

      2450
      第二步:把結(jié)果帶回外層查詢

      SELECT *FROM empWHERE sal > 2450;

      所以你會發(fā)現(xiàn),子查詢本質(zhì)上并不玄學(xué),它只是把原來兩步操作寫進(jìn)了一條 SQL。

      四、什么是不相關(guān)子查詢?

      很多教程一上來就講“相關(guān)子查詢、不相關(guān)子查詢”,把人繞暈。

      其實(shí)判斷方法很簡單:

      如果子查詢單獨(dú)拿出來能獨(dú)立運(yùn)行,那它通常就是不相關(guān)子查詢。

      比如:

      SELECT salFROM empWHERE ename = 'CLARK';

      這條語句本身就能獨(dú)立執(zhí)行,也能得到正常結(jié)果。

      所以放到外層查詢里后,它屬于:

      不相關(guān)子查詢

      也就是說,子查詢不依賴外層查詢的數(shù)據(jù)。

      五、不相關(guān)子查詢還可以分兩類1. 單行子查詢

      子查詢返回一行結(jié)果

      比如:

      SELECT salFROM empWHERE ename = 'CLARK';

      結(jié)果只有一行:2450

      或者:

      SELECT AVG(sal)FROM emp;

      平均工資也只會返回一個值。

      這類就是單行子查詢。

      2. 多行子查詢

      子查詢返回多行結(jié)果。

      比如:

      SELECT salFROM empWHERE deptno = 10;

      如果 10 號部門有多個人,那就會返回多條記錄。

      這類就是多行子查詢。

      六、單行子查詢到底怎么寫?3 個案例直接吃透

      下面直接上實(shí)戰(zhàn)。

      案例 1:查詢工資高于平均工資的員工姓名和工資

      這個題其實(shí)是在考你兩件事:

      1. 員工姓名和工資從哪張表查;
      2. 平均工資怎么作為條件嵌進(jìn)去。
      SQL 寫法

      SELECT ename, salFROM empWHERE sal > (SELECT AVG(sal)FROM emp);
      運(yùn)行邏輯

      先執(zhí)行:

      SELECT AVG(sal) FROM emp;

      假設(shè)運(yùn)行結(jié)果:

      2073.21

      再執(zhí)行外層:

      SELECT ename, salFROM empWHERE sal > 2073.21;
      結(jié)果示意

      ENAME  SALJONES  2975BLAKE  2850CLARK  2450SCOTT  3000KING   5000FORD   3000
      這個題的關(guān)鍵點(diǎn)
      • AVG(sal) 返回的是一個值,所以這是單行子查詢
      • 外層用 > 沒問題,因?yàn)橛疫呏挥幸粋€結(jié)果
      案例 2:查詢與 CLARK 同部門、且工資比 CLARK 低的員工姓名和工資

      這個題比前一個多了一個條件:

      • 同部門
      • 工資更低

      所以可以寫兩個單行子查詢。

      SQL 寫法

      SELECT ename, salFROM empWHERE deptno = (SELECT deptnoFROM empWHERE ename = 'CLARK'AND sal < (SELECT salFROM empWHERE ename = 'CLARK');
      拆解一下更容易理解第一步:查 CLARK 的部門號

      SELECT deptnoFROM empWHERE ename = 'CLARK';

      結(jié)果:

      10
      第二步:查 CLARK 的工資

      SELECT salFROM empWHERE ename = 'CLARK';

      結(jié)果:

      2450
      第三步:組合條件

      SELECT ename, salFROM empWHERE deptno = 10AND sal < 2450;
      結(jié)果示意

      ENAME  SALMILLER 1300
      這類題怎么想最快?

      遇到這種題,建議你先把自然語言拆成條件:

      與 CLARK 同部門,并且比 CLARK 工資低

      直接拆成:

      • deptno = CLARK 的 deptno
      • sal < CLARK 的 sal

      然后每個“CLARK 的某個字段”都可以交給子查詢?nèi)ゲ椤?/p>

      這個思路一旦養(yǎng)成,寫 SQL 會快很多。

      案例 3:查詢與 SCOTT 職務(wù)相同、且入職時間早于 SCOTT 的員工信息

      這題查的是:

      • 職務(wù)相同
      • 入職時間更早
      SQL 寫法

      SELECT *FROM empWHERE job = (SELECT jobFROM empWHERE ename = 'SCOTT'AND hiredate < (SELECT hiredateFROM empWHERE ename = 'SCOTT');
      運(yùn)行邏輯拆解先查 SCOTT 的職務(wù)

      SELECT jobFROM empWHERE ename = 'SCOTT';

      結(jié)果:

      ANALYST
      再查 SCOTT 的入職日期

      SELECT hiredateFROM empWHERE ename = 'SCOTT';

      結(jié)果:

      1987-04-19
      最終組合查詢

      SELECT *FROM empWHERE job = 'ANALYST'AND hiredate < '1987-04-19';
      結(jié)果示意

      EMPNO ENAME JOB      MGR  HIREDATE    SAL  COMM DEPTNO7902  FORD  ANALYST  7566 1981-12-03  3000 NULL 20
      七、為什么很多人一寫子查詢就報錯?

      子查詢本身不難,真正難的是結(jié)果集和運(yùn)算符要匹配。

      1. 單行子查詢要配單值運(yùn)算符

      像這些:

      它們默認(rèn)右邊應(yīng)該是一個值。

      比如:

      SELECT ename, salFROM empWHERE sal > (SELECT AVG(sal)FROM emp);

      這是對的,因?yàn)?AVG(sal) 只返回一個值。

      2. 如果子查詢返回多行,就不能亂用 =

      比如這句就可能報錯:

      SELECT *FROM empWHERE deptno = (SELECT deptnoFROM empWHERE job = 'MANAGER');

      因?yàn)榻?jīng)理可能不止一個,對應(yīng)多個部門號。

      這時候數(shù)據(jù)庫通常會報類似錯誤:

      ORA-01427: single-row subquery returns more than one row

      意思就是:

      單行子查詢居然返回了多行

      這種情況就要考慮改用:

      • IN
      • ANY
      • ALL

      不過這已經(jīng)屬于多行子查詢的范圍了。

      八、子查詢和硬編碼相比,優(yōu)勢到底在哪?

      很多人一開始不理解,覺得直接寫死數(shù)字不是更快嗎?

      比如:

      SELECT *FROM empWHERE sal > 2450;

      確實(shí)短,但問題在于它不靈活。

      子查詢的優(yōu)勢主要有 3 點(diǎn):1. 動態(tài)獲取條件值

      不需要手動查完再填寫。

      2. 降低維護(hù)成本

      源數(shù)據(jù)變了,SQL 不用跟著改。

      3. 邏輯更完整

      整條 SQL 自己就能表達(dá)完整業(yè)務(wù)意圖,別人接手也更容易看懂。

      九、寫子查詢時的 4 個實(shí)戰(zhàn)建議建議 1:先讀懂題,再寫 SQL

      很多 SQL 寫不出來,不是語法不會,而是題意沒拆明白。

      比如題目里說:

      • 同部門
      • 同職務(wù)
      • 高于平均工資
      • 早于某人入職時間

      這些其實(shí)都是條件關(guān)鍵詞。

      把條件一句句拆開,SQL 就自然出來了。

      建議 2:先單獨(dú)運(yùn)行子查詢

      不要一上來就整條 SQL 一把梭。

      先把子查詢跑通,確認(rèn)它到底返回什么,再往外拼。

      比如:

      SELECT sal FROM emp WHERE ename = 'CLARK';

      你先確認(rèn)結(jié)果確實(shí)只有一行,再去寫:

      WHERE sal > (子查詢)

      這樣最穩(wěn)。

      建議 3:字段類型要對應(yīng)

      例如:

      • sal 對應(yīng)工資,數(shù)值類型
      • hiredate 對應(yīng)日期類型
      • job 對應(yīng)字符串類型

      不要拿日期字段去和工資字段比較,這種低級錯誤非常常見。

      建議 4:復(fù)雜 SQL 適當(dāng)換行

      SQL 不是越擠越厲害,清晰最重要。

      比如:

      SELECT *FROM empWHERE job = (SELECT jobFROM empWHERE ename = 'SCOTT'AND hiredate < (SELECT hiredateFROM empWHERE ename = 'SCOTT');

      這種排版明顯比一行糊到底更適合排查問題。

      十、補(bǔ)一個完整測試腳本,拿去就能練

      如果你想自己在數(shù)據(jù)庫里練習(xí),可以參考下面這組語句。

      1. 查詢 CLARK 工資

      SELECT salFROM empWHERE ename = 'CLARK';

      運(yùn)行結(jié)果:

      2450
      2. 查詢工資高于 CLARK 的員工

      SELECT *FROM empWHERE sal > (SELECT salFROM empWHERE ename = 'CLARK');

      運(yùn)行結(jié)果示意:

      KINGJONESSCOTTFORDBLAKE
      3. 查詢工資高于平均工資的員工

      SELECT ename, salFROM empWHERE sal > (SELECT AVG(sal)FROM emp);

      運(yùn)行結(jié)果示意:

      JONES 2975BLAKE 2850CLARK 2450SCOTT 3000KING  5000FORD  3000
      4. 查詢與 CLARK 同部門且工資低于 CLARK 的員工

      SELECT ename, salFROM empWHERE deptno = (SELECT deptnoFROM empWHERE ename = 'CLARK'AND sal < (SELECT salFROM empWHERE ename = 'CLARK');

      運(yùn)行結(jié)果示意:

      MILLER 1300
      5. 查詢與 SCOTT 職務(wù)相同且比他更早入職的員工

      SELECT *FROM empWHERE job = (SELECT jobFROM empWHERE ename = 'SCOTT'AND hiredate < (SELECT hiredateFROM empWHERE ename = 'SCOTT');

      運(yùn)行結(jié)果示意:

      FORD ANALYST 1981-12-03
      十一、總結(jié):單行子查詢其實(shí)就這 3 步

      如果你看到一道子查詢題,總是沒思路,就按這個套路來:

      第一步:看外層要查什么

      比如查姓名、工資、員工全部信息。

      第二步:看條件依賴誰

      比如“比 CLARK 高”“和 SCOTT 一樣”“高于平均工資”。

      第三步:把條件里的“參照值”交給子查詢

      比如:

      • CLARK 的工資
      • CLARK 的部門
      • SCOTT 的職務(wù)
      • 全公司的平均工資

      你會發(fā)現(xiàn),所謂子查詢,本質(zhì)上就是:

      把條件中的動態(tài)值先查出來,再參與外層過濾。

      掌握這一點(diǎn),單行子查詢基本就不會卡了。

      特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關(guān)推薦
      熱點(diǎn)推薦
      從攤位被擋到全網(wǎng)撐腰,長沙后湖這個煎餅攤前隊(duì)伍越排越長,女?dāng)傊饔袀€樸素簡單的愿望

      從攤位被擋到全網(wǎng)撐腰,長沙后湖這個煎餅攤前隊(duì)伍越排越長,女?dāng)傊饔袀€樸素簡單的愿望

      瀟湘晨報
      2026-04-25 21:02:19
      首組2-2!尼克斯大勝老鷹進(jìn)天王山 唐斯20+10+10布倫森19分

      首組2-2!尼克斯大勝老鷹進(jìn)天王山 唐斯20+10+10布倫森19分

      醉臥浮生
      2026-04-26 08:52:23
      伊朗政權(quán)秋后算賬,絞死更多抗議者

      伊朗政權(quán)秋后算賬,絞死更多抗議者

      一種觀點(diǎn)
      2026-04-25 19:08:26
      色情片并不可怕,但它會偷走你的“勁”,讓你做什么都索然無味

      色情片并不可怕,但它會偷走你的“勁”,讓你做什么都索然無味

      知識圈
      2026-04-26 09:35:01
      中國最危險的“淀粉崇拜”!不吃米飯哪有力氣?這套農(nóng)耕廢物邏輯害慘了現(xiàn)代人

      中國最危險的“淀粉崇拜”!不吃米飯哪有力氣?這套農(nóng)耕廢物邏輯害慘了現(xiàn)代人

      知識圈
      2026-04-25 20:46:53
      10年前,易建聯(lián)花1000萬在洛杉磯買下豪宅,如今出售市值多少?

      10年前,易建聯(lián)花1000萬在洛杉磯買下豪宅,如今出售市值多少?

      阿庫財經(jīng)
      2026-04-24 14:26:45
      俄朝圖們江上第二座橋已建成,將于6月通車

      俄朝圖們江上第二座橋已建成,將于6月通車

      名人茍或
      2026-04-26 07:02:25
      霍爾木茲海峽,傳來大消息!伊朗總統(tǒng),最新發(fā)聲!比特幣跳水,超9.9萬人爆倉!

      霍爾木茲海峽,傳來大消息!伊朗總統(tǒng),最新發(fā)聲!比特幣跳水,超9.9萬人爆倉!

      證券時報e公司
      2026-04-25 22:11:02
      這是啥劇情!一個二輪秀,剛被魚腩拋棄,季后賽場均22分

      這是啥劇情!一個二輪秀,剛被魚腩拋棄,季后賽場均22分

      球毛鬼胎
      2026-04-26 14:28:02
      白宮晚宴槍手27日受審!45年前里根在同一酒店遇刺受重傷,兇手已出獄還發(fā)新歌

      白宮晚宴槍手27日受審!45年前里根在同一酒店遇刺受重傷,兇手已出獄還發(fā)新歌

      紅星新聞
      2026-04-26 13:39:37
      南方多省電價突然飆升,廣東4月多次逼近1元/度!什么原因?專家:霍爾木茲海峽局勢致燃料成本大幅攀升,工業(yè)生產(chǎn)旺盛拉高用電需求

      南方多省電價突然飆升,廣東4月多次逼近1元/度!什么原因?專家:霍爾木茲海峽局勢致燃料成本大幅攀升,工業(yè)生產(chǎn)旺盛拉高用電需求

      每日經(jīng)濟(jì)新聞
      2026-04-25 20:30:11
      世界首次五百強(qiáng)斷崖差距: 日149家,美151家,中國3家,現(xiàn)在呢

      世界首次五百強(qiáng)斷崖差距: 日149家,美151家,中國3家,現(xiàn)在呢

      杰絲聊古今
      2026-04-26 08:48:46
      日本坦克炸膛,“中國制造”什么情況?其實(shí)不奇怪!

      日本坦克炸膛,“中國制造”什么情況?其實(shí)不奇怪!

      新民周刊
      2026-04-26 09:05:58
      森林狼力克掘金3-1,道蘇姆一戰(zhàn)封神!這一戰(zhàn),不得不承認(rèn)7個現(xiàn)實(shí)

      森林狼力克掘金3-1,道蘇姆一戰(zhàn)封神!這一戰(zhàn),不得不承認(rèn)7個現(xiàn)實(shí)

      毒舌NBA
      2026-04-26 11:34:09
      掘金主帥:我不喜歡麥克丹尼爾斯的行為,但這就是他的為人

      掘金主帥:我不喜歡麥克丹尼爾斯的行為,但這就是他的為人

      懂球帝
      2026-04-26 12:45:19
      白宮晚宴傳出5到8聲槍響!95后槍手帶多件武器,1特工被槍擊,穿防彈衣幸免于難

      白宮晚宴傳出5到8聲槍響!95后槍手帶多件武器,1特工被槍擊,穿防彈衣幸免于難

      紅星新聞
      2026-04-26 11:31:31
      日本魔笛現(xiàn)役老師前20人排名!看看有沒有你pick的選手

      日本魔笛現(xiàn)役老師前20人排名!看看有沒有你pick的選手

      吃瓜黨二號頭目
      2026-04-26 10:17:12
      史上最大規(guī)?;瘋呀?jīng)開始!一個堅持了30年的信仰,進(jìn)入倒計時

      史上最大規(guī)模化債,已經(jīng)開始!一個堅持了30年的信仰,進(jìn)入倒計時

      柏年說政經(jīng)
      2026-04-25 10:00:08
      世界羽聯(lián)會員大會投票通過“15分制”改革,將于2027年實(shí)行

      世界羽聯(lián)會員大會投票通過“15分制”改革,將于2027年實(shí)行

      懂球帝
      2026-04-25 22:23:26
      連續(xù)三天嫖娼一次嫖倆,花800元?dú)У粢皇峙窈门疲麍D什么?

      連續(xù)三天嫖娼一次嫖倆,花800元?dú)У粢皇峙窈门疲麍D什么?

      街上的行人很刺眼
      2026-04-25 10:55:49
      2026-04-26 14:43:00
      侃故事的阿慶
      侃故事的阿慶
      幾分鐘看完一部影視劇,詼諧幽默的娓娓道來
      625文章數(shù) 8291關(guān)注度
      往期回顧 全部

      科技要聞

      漲價浪潮下,DeepSeek推動AI“價格戰(zhàn)”

      頭條要聞

      特朗普2年內(nèi)遭遇4次刺殺威脅 第一個任期也曾險遭襲擊

      頭條要聞

      特朗普2年內(nèi)遭遇4次刺殺威脅 第一個任期也曾險遭襲擊

      體育要聞

      那一刻開始,兩支球隊(duì)的命運(yùn)悄然改變了

      娛樂要聞

      《八千里路云和月》大結(jié)局意難平

      財經(jīng)要聞

      DeepSeek V4背后,梁文鋒的轉(zhuǎn)身

      汽車要聞

      預(yù)售19.38萬元起 哈弗猛龍PLUS七座版亮相

      態(tài)度原創(chuàng)

      時尚
      旅游
      健康
      教育
      軍事航空

      IU的臉,真的有自己的時間線

      旅游要聞

      下一站|一天體驗(yàn)越南三大特色

      干細(xì)胞如何讓燒燙傷皮膚"再生"?

      教育要聞

      麻省理工公開課19:吉爾伯特教授線性代數(shù)課-

      軍事要聞

      伊朗總統(tǒng):不會在壓力、威脅下進(jìn)行談判

      無障礙瀏覽 進(jìn)入關(guān)懷版 主站蜘蛛池模板: 无码国产精品一区二区免费式影视| 大方县| 黄网在线观看免费网站| 成人午夜视频在线| 18禁无遮挡啪啪无码网站| 亚洲 制服 丝袜 无码| 中文字幕久久六月色综合| 日本久久高清一区二区三区毛片| 夜夜干影院| 亚洲综合国产| 极品无码国模国产在线观看| 精品伊人久久久久7777人| 国产精品一区二区久久岳| 性色av无码专区一ⅴa亚洲| 国产天堂亚洲国产碰碰| 伊人啪啪| 日本无遮挡真人祼交视频| 欧美福利网| 成人1区2区| 亚洲男人第一无码av网| 福利视频一区二区在线| 无码精品人妻一区二区三区中| 亚洲国产精品一区二区久久hs| 久久久中日ab精品综合| 国产丝袜视频一区二区三区| 久久久婷婷成人综合激情| 岛国av在线| 中国亚洲女人69内射少妇| 狠狠撸狠狠插| www.色人妻.com| 亚洲日韩第2页| 狠狠人妻久久久久久综合麻豆| 亚洲小视频| 亚洲国产成人一区二区| 乱女乱妇熟女熟妇综合网| 亚洲精品美女久久777777| 农村老熟妇乱子伦视频| 亚洲精品动漫免费二区| WWW.四虎成人影院.CN| 永久免费bbbbbb视频| 日本丰满少妇xxxx|