最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中的復合查詢使用解讀

 更新時間:2025年12月26日 08:41:04   作者:前似錦  
本文詳細介紹了MySQL復合查詢的核心玩法,包括單表查詢、多表聯(lián)查、子查詢和合并查詢,通過實際的員工管理系統(tǒng)數(shù)據(jù),展示了如何使用各種查詢語句來滿足復雜的業(yè)務需求

在實際開發(fā)中,僅用單表查詢顯然無法滿足復雜業(yè)務需求。今天我們就以經(jīng)典的員工管理系統(tǒng)(EMP員工表、DEPT部門表、SALGRADE工資級別表)為例,聊聊 MySQL 復合查詢的核心玩法 —— 從單表查詢到多表聯(lián)查、子查詢,再到合并查詢,每一步都附上真實查詢結(jié)果,幫你直觀理解。

一、先回顧:單表查詢的基礎(chǔ)操作(以EMP表為例)

先明確EMP表基礎(chǔ)數(shù)據(jù)(對應圖片中表內(nèi)容):

empnoenamejobmgrhiredatesalcommdeptno
7369SMITHCLERK79021980-12-17800NULL20
7499ALLENSALESMAN76981981-02-20160030030
7521WARDSALESMAN76981981-02-22125050030
7566JONESMANAGER78391981-04-022975NULL20
7654MARTINSALESMAN76981981-09-281250140030
7698BLAKEMANAGER78391981-05-012850NULL30
7782CLARKMANAGER78391981-06-092450NULL10
7788SCOTTANALYST75661987-04-193000NULL20
7839KINGPRESIDENTNULL1981-11-175000NULL10
7844TURNERSALESMAN76981981-09-081500030
7876ADAMSCLERK77881987-05-231100NULL20
7900JAMESCLERK76981981-12-03950NULL30
7902FORDANALYST75661981-12-033000NULL20
7934MILLERCLERK77821982-01-231300NULL10

1. 帶條件的篩選

SELECT * FROM EMP 
WHERE (sal>500 OR job='MANAGER') 
AND ename LIKE 'J%';

查詢結(jié)果

empnoenamejobmgrhiredatesalcommdeptno
7566JONESMANAGER78391981-04-022975NULL20
7900JAMESCLERK76981981-12-03950NULL30

2. 排序與計算字段

(1)按部門號升序、工資降序排列

SELECT * FROM EMP 
ORDER BY deptno, sal DESC;

查詢結(jié)果(節(jié)選核心字段):

empnoenamesaldeptno
7839KING500010
7782CLARK245010
7934MILLER130010
7788SCOTT300020
7902FORD300020
7566JONES297520
7876ADAMS110020
7369SMITH80020
7698BLAKE285030
7499ALLEN160030
7844TURNER150030
7521WARD125030
7654MARTIN125030
7900JAMES95030

(2)計算年薪(工資 ×12 + 獎金,獎金為空則按 0 算)并排序

SELECT ename, sal*12+IFNULL(comm,0) AS '年薪' 
FROM EMP 
ORDER BY 年薪 DESC;

查詢結(jié)果

ename年薪
KING60000
SCOTT36000
FORD36000
JONES35700
BLAKE34200
CLARK29400
ALLEN19500
TURNER18000
MARTIN16400
MILLER15600
WARD15500
ADAMS13200
JAMES11400
SMITH9600

3. 聚合與分組查詢

(1)查每個部門的平均工資、最高工資

SELECT deptno, FORMAT(AVG(sal),2) AS avg_sal, MAX(sal) AS max_sal 
FROM EMP 
GROUP BY deptno;

查詢結(jié)果

deptnoavg_salmax_sal
102,916.675000
202,175.003000
301,566.672850

(2)篩選平均工資 < 2000的部門

SELECT deptno, AVG(sal) AS avg_sal 
FROM EMP 
GROUP BY deptno 
HAVING avg_sal<2000;

查詢結(jié)果

deptnoavg_sal
301566.6667

二、多表查詢:跨表關(guān)聯(lián)數(shù)據(jù)

先明確關(guān)聯(lián)表基礎(chǔ)數(shù)據(jù):

DEPT部門表

deptnodnameloc
10ACCOUNTINGNEW YORK
20RESEARCHDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON

SALGRADE工資級別表

gradelosalhisal
17001200
212011400
314012000
420013000
530019999

1. 基礎(chǔ)多表聯(lián)查(等值連接)

(1)查 “員工名、工資、所屬部門名”

SELECT EMP.ename, EMP.sal, DEPT.dname 
FROM EMP, DEPT 
WHERE EMP.deptno = DEPT.deptno;

查詢結(jié)果(節(jié)選):

enamesaldname
SMITH800RESEARCH
ALLEN1600SALES
WARD1250SALES
JONES2975RESEARCH
MARTIN1250SALES
BLAKE2850SALES
CLARK2450ACCOUNTING
SCOTT3000RESEARCH
KING5000ACCOUNTING
TURNER1500SALES
ADAMS1100RESEARCH
JAMES950SALES
FORD3000RESEARCH
MILLER1300ACCOUNTING

(2)限定部門號為 10的員工

SELECT ename, sal, dname 
FROM EMP, DEPT 
WHERE EMP.deptno=DEPT.deptno 
AND DEPT.deptno=10;

查詢結(jié)果

enamesaldname
CLARK2450ACCOUNTING
KING5000ACCOUNTING
MILLER1300ACCOUNTING

2. 三表聯(lián)查(含工資級別表)

SELECT ename, sal, grade 
FROM EMP, SALGRADE 
WHERE EMP.sal BETWEEN losal AND hisal;

查詢結(jié)果

enamesalgrade
SMITH8001
ALLEN16003
WARD12502
JONES29754
MARTIN12502
BLAKE28504
CLARK24504
SCOTT30004
KING50005
TURNER15003
ADAMS11001
JAMES9501
FORD30004
MILLER13002

三、自連接:同一張表查上下級

-- 別名leader代表領(lǐng)導,worker代表員工
SELECT leader.empno, leader.ename 
FROM emp leader, emp worker 
WHERE leader.empno = worker.mgr 
AND worker.ename='FORD';

查詢結(jié)果

empnoename
7566JONES

四、子查詢:用查詢結(jié)果當條件 / 臨時表

1. 單行子查詢(返回一條結(jié)果)

SELECT ename, job 
FROM EMP 
WHERE sal = (SELECT MAX(sal) FROM EMP);

查詢結(jié)果

enamejob
KINGPRESIDENT

2. 多行子查詢(返回多條結(jié)果)

(1)查 “和 10 號部門崗位相同、但不屬于 10 號部門” 的員工

SELECT ename,job,sal,deptno 
FROM emp 
WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno=10) 
AND deptno<>10;

查詢結(jié)果

enamejobsaldeptno
JONESMANAGER297520
BLAKEMANAGER285030
SMITHCLERK80020
ADAMSCLERK110020
JAMESCLERK95030

(2)查 “工資比 30 號部門所有員工都高” 的員工

SELECT ename, sal, deptno 
FROM EMP 
WHERE sal > ALL(SELECT sal FROM EMP WHERE deptno=30);

查詢結(jié)果

enamesaldeptno
JONES297520
SCOTT300020
KING500010
FORD300020

3. from 子句子查詢(把子查詢當臨時表)

-- 先查各部門平均工資(臨時表tmp),再關(guān)聯(lián)員工表
SELECT ename, deptno, sal, FORMAT(tmp.avg_sal,2) AS dept_avg_sal
FROM EMP, 
(SELECT AVG(sal) avg_sal, deptno dt FROM EMP GROUP BY deptno) tmp
WHERE EMP.sal > tmp.avg_sal 
AND EMP.deptno=tmp.dt;

查詢結(jié)果

enamedeptnosaldept_avg_sal
KING1050002,916.67
JONES2029752,175.00
SCOTT2030002,175.00
FORD2030002,175.00
BLAKE3028501,566.67
ALLEN3016001,566.67

五、合并查詢:union/union all

1. union(自動去重)

SELECT ename, sal, job FROM EMP WHERE sal>2500 
UNION
SELECT ename, sal, job FROM EMP WHERE job='MANAGER';

查詢結(jié)果(無重復數(shù)據(jù)):

enamesaljob
JONES2975MANAGER
BLAKE2850MANAGER
SCOTT3000ANALYST
KING5000PRESIDENT
FORD3000ANALYST
CLARK2450MANAGER

2. union all(保留重復)

SELECT ename, sal, job FROM EMP WHERE sal>2500 
UNION ALL
SELECT ename, sal, job FROM EMP WHERE job='MANAGER';

查詢結(jié)果(JONES、BLAKE 重復出現(xiàn)):

enamesaljob
JONES2975MANAGER
BLAKE2850MANAGER
SCOTT3000ANALYST
KING5000PRESIDENT
FORD3000ANALYST
JONES2975MANAGER
BLAKE2850MANAGER
CLARK2450MANAGER

總結(jié)

MySQL 復合查詢是實際開發(fā)的核心技能,核心是理清表關(guān)系、靈活組合單表 / 多表 / 子查詢語法。

本文所有示例均基于真實員工管理表數(shù)據(jù),查詢結(jié)果可直接驗證,建議你復制 SQL 語句在本地數(shù)據(jù)庫中實操,更快掌握各類查詢技巧~

這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL中的CONCAT()函數(shù):輕松拼接字符串的利器

    MySQL中的CONCAT()函數(shù):輕松拼接字符串的利器

    這篇文章主要介紹了MySQL中的CONCAT()函數(shù):輕松拼接字符串的利器,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 解決windows下mysql8修改my.ini設置datadir后無法啟動問題

    解決windows下mysql8修改my.ini設置datadir后無法啟動問題

    在修改MySQL的my.ini文件以更改數(shù)據(jù)目錄后,可能會遇到無法啟動的問題,這通常是因為字符編碼被改變或新路徑權(quán)限不足,正確的做法是備份my.ini文件,確保使用ANSI字符編碼修改datadir,并確保新路徑有足夠的權(quán)限,特別是SYSTEM或NETWORKSERVICE權(quán)限
    2025-01-01
  • MySQL8中的存儲引擎以及文件解析

    MySQL8中的存儲引擎以及文件解析

    這篇文章主要介紹了MySQL8中的存儲引擎以及文件使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解一條sql語句在mysql中是如何執(zhí)行的

    詳解一條sql語句在mysql中是如何執(zhí)行的

    這篇文章主要介紹了一條sql語句在mysql中是如何執(zhí)行的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 關(guān)閉和打開本地的mysql實現(xiàn)方式

    關(guān)閉和打開本地的mysql實現(xiàn)方式

    這篇文章主要介紹了關(guān)閉和打開本地的mysql實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • MySQL數(shù)據(jù)庫誤刪恢復的超詳細教程

    MySQL數(shù)據(jù)庫誤刪恢復的超詳細教程

    MySQL誤刪數(shù)據(jù)庫,造成了數(shù)據(jù)的丟失,這是非常尷尬的,但是有許多方案可以用來嘗試恢復丟失的數(shù)據(jù)庫,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫誤刪恢復的超詳細教程,需要的朋友可以參考下
    2024-03-03
  • MySQL實戰(zhàn)之Insert語句的使用心得

    MySQL實戰(zhàn)之Insert語句的使用心得

    這篇文章主要給大家介紹了關(guān)于MySQL實戰(zhàn)之Insert語句的使用心得的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 解決mysql服務器在無操作超時主動斷開連接的情況

    解決mysql服務器在無操作超時主動斷開連接的情況

    這篇文章主要介紹了解決mysql服務器在無操作超時主動斷開連接的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • SQL行轉(zhuǎn)列與列轉(zhuǎn)行詳情

    SQL行轉(zhuǎn)列與列轉(zhuǎn)行詳情

    這篇文章主要介紹了SQL行轉(zhuǎn)列與列轉(zhuǎn)行,違章以SQL數(shù)據(jù)展開詳細內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-03-03
  • MYSQL批量UPDATE的兩種方式小結(jié)

    MYSQL批量UPDATE的兩種方式小結(jié)

    本文主要介紹了MYSQL批量UPDATE的兩種方式小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03

最新評論

荃湾区| 龙州县| 南岸区| 长岭县| 香河县| 深圳市| 岳普湖县| 定兴县| 正定县| 桃源县| 同仁县| 揭东县| 南投县| 青川县| 奇台县| 高淳县| 吉安市| 六枝特区| 高邑县| 文成县| 扶绥县| 武清区| 讷河市| 苍南县| 丹阳市| 杭州市| 繁峙县| 枞阳县| 康平县| 五原县| 定南县| 平顶山市| 桐柏县| 黑水县| 郧西县| 峡江县| 巫山县| 九龙城区| 宁晋县| 昌宁县| 虞城县|