Mysql中的復(fù)合查詢?cè)斀?/h1>
更新時(shí)間:2025年04月09日 09:19:02 作者:貓咪-9527
這篇文章主要介紹了Mysql中的復(fù)合查詢的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
1. 基本查詢簡(jiǎn)單回顧
條件篩選
使用 AND、OR、LIKE 等條件操作符進(jìn)行多條件篩選。
排序
使用 ORDER BY 對(duì)查詢結(jié)果進(jìn)行排序,支持多個(gè)字段排序(如按部門號(hào)升序,工資降序)。
聚合函數(shù)與分組
使用 GROUP BY 對(duì)數(shù)據(jù)進(jìn)行分組,并使用聚合函數(shù)(如 AVG(), MAX(), COUNT())進(jìn)行匯總。
子查詢
用于動(dòng)態(tài)選擇數(shù)據(jù),如查詢工資高于平均工資的員工。
內(nèi)嵌查詢
查詢工資最高的員工、顯示員工的年薪等。
- 查詢工資高于500或崗位為MANAGER的雇員,同時(shí)還要滿足他們的姓名首字母為大寫的
select *from emp where ename like 'j%' and (sal>500 or job='MANAGER');

使用年薪進(jìn)行降序排序:
select ename ,job,sal*12+ifnull(comm,0) sarn from emp order by sarn desc;

顯示工資最高的員工的名字和工作崗位:
方案一:
select ename ,job ,sal from emp where sal in(select max(sal) from emp );

方案二:
select ename ,job ,sal from emp order by sal desc limit 1;

顯示工資高于平均工資的員工信息:
select ename ,job ,sal from emp where sal>(select avg(sal) from emp);

顯示每個(gè)部門的平均工資和最高工資:
select deptno,format(avg(sal),2),max(sal) from emp group by deptno;

顯示平均工資低于2000的部門號(hào)和它的平均工資:
select deptno ,avg(sal) avgsal from emp group by deptno having avgsal<2000;

顯示每種崗位的雇員總數(shù),平均工資:
select job ,count(*) from emp group by job;

2. 多表查詢
聯(lián)接查詢
通過表之間的關(guān)系字段(如 deptno)進(jìn)行聯(lián)合查詢,常用的連接方式包括內(nèi)連接(INNER JOIN)等。
跨表查詢
通過連接多個(gè)表(如 EMP 和 DEPT)來獲取聯(lián)合結(jié)果。
使用 GROUP BY 和聚合函數(shù)
計(jì)算每個(gè)部門的平均工資和最高工資等。
連接條件
可以通過多個(gè)條件進(jìn)行查詢,顯示特定條件下的數(shù)據(jù)。
將第一張表的每一條數(shù)據(jù)和第二章表的每一條數(shù)據(jù)相結(jié)合,不加過濾條件得到的結(jié)果被稱為笛卡爾積

笛卡爾積:

顯示部門為10的員工和部門的全部信息
select * from emp,dept where emp.deptno=dept.deptno and emp.deptno=10;

顯示部門為10的員工姓名,部門名和工資
select ename,sal,dname from emp,dept
where emp.deptno=dept.deptno and emp.deptno=10;

顯示員工的姓名,工資,及工資級(jí)別
select ename ,sal,grade from emp,salgrade where sal between losal and hisal;

3. 自連接(Self-Join)
表的別名
自連接時(shí)需要使用別名來區(qū)分同一表的不同實(shí)例。
示例
查找員工的上級(jí)(使用 mgr 字段指向經(jīng)理的 empno)。
應(yīng)用場(chǎng)景
員工與其上級(jí)、領(lǐng)導(dǎo)層次的關(guān)系查詢。
將兩張相同的表做笛卡爾積
- 顯示員工及員工領(lǐng)導(dǎo)的個(gè)人信息
select * from emp e1, emp e2 where e1.empno=e2.mgr;

4. 子查詢
單行子查詢
子查詢只返回一行結(jié)果,通常用于 =、< 等條件。
多行子查詢
子查詢返回多行結(jié)果,常配合 IN、ALL、ANY 等關(guān)鍵字使用。
多列子查詢
返回多個(gè)列的數(shù)據(jù),適用于多條件的篩選。
FROM 子查詢
將子查詢作為臨時(shí)表使用,來簡(jiǎn)化復(fù)雜查詢。
嵌套查詢
通過將查詢嵌套在其他查詢語句中,增加查詢靈活性。
4.1單行子查詢
- 顯示SMITH同一部門的員工
select *from emp where
deptno =(select deptno from emp where ename='SMITH');

4.2多行子查詢
返回多行記錄的子查詢
in關(guān)鍵字;查詢和10號(hào)部門的工作崗位相同的雇員的名字,崗位,工資,部門號(hào),但是不包含10自己的
select ename ,job,sal,deptno from emp where
job in(select job from emp where deptno =10)and deptno<>10;

all關(guān)鍵字;顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號(hào)
select ename,sal,deptno from emp
where sal > all(select sal from emp where deptno =30);

any關(guān)鍵字;顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(hào)(包含自己部門的員工)
select ename,sal,deptno from emp
where sal>any(select sal from emp where deptno=30);

4.3多列子查詢
單行子查詢是指子查詢只返回單列,單行數(shù)據(jù);多行子查詢是指返回單列多行數(shù)據(jù),都是針對(duì)單列而言的,而多列子查詢則是指查詢返回多個(gè)列數(shù)據(jù)的子查詢語句
查詢和SMITH的部門和崗位完全相同的所有雇員,不含SMITH本人
select * from emp where
(deptno,job)=(select deptno,job from emp where ename='SMITH')
and ename<>'SMITH';

4.4在from中使用子查詢
在mysql中每一次的查詢結(jié)果都是一個(gè)子表。
顯示每個(gè)高于自己部門平均工資的員工的姓名、部門、工資、平均工資
select ename,deptno,sal,asal from emp t1,(select deptno dt,avg(sal) asal
from emp group by dt)t2 where t1.sal>t2.asal and t1.deptno=t2.dt;

查找每個(gè)部門工資最高的人的姓名、工資、部門、最高工資
select ename,sal,emp.deptno,msal
from emp ,(select deptno,max(sal)msal from emp group by deptno)
emp2 where sal=msal and emp.deptno=emp2.deptno ;

顯示每個(gè)部門的信息(部門名,編號(hào),地址)和人員數(shù)量
select *from dept,
(select deptno,count(deptno) from emp group by deptno)dept2
where dept.deptno=dept2.deptno;

5. 合并查詢
UNION
將多個(gè) SELECT 查詢結(jié)果合并,去除重復(fù)記錄。
UNION ALL
將多個(gè) SELECT 查詢結(jié)果合并,不去除重復(fù)記錄。
應(yīng)用場(chǎng)景
如查詢職位為 MANAGER 或工資高于某數(shù)值的員工。
5.1UNION
該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),會(huì)自動(dòng)去掉結(jié)果集中的重復(fù)行。
- 將工資大于2500或職位是MANAGER的人找出來

5.2UNION ALL
該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),不會(huì)去掉結(jié)果集中的重復(fù)行。

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
-
為mysql數(shù)據(jù)庫添加添加事務(wù)處理的方法
開始首先說明一下,mysql數(shù)據(jù)庫默認(rèn)的數(shù)據(jù)庫引擎是MyISAM,是不支持事務(wù)的,單數(shù)如果你添加了數(shù)據(jù)執(zhí)行語句是不會(huì)出錯(cuò)的,單數(shù)不管用,即便是回滾事務(wù),記錄也是插入進(jìn)去了,所有首先我們要做的第一步是更改數(shù)據(jù)庫引擎 2011-07-07
-
詳解Mysql數(shù)據(jù)庫平滑擴(kuò)容解決高并發(fā)和大數(shù)據(jù)量問題
本文主要介紹了Mysql數(shù)據(jù)庫平滑擴(kuò)容解決高并發(fā)和大數(shù)據(jù)量問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2022-05-05
-
mysql數(shù)據(jù)庫單表最大存儲(chǔ)依據(jù)詳解
這篇文章主要為大家介紹了mysql數(shù)據(jù)庫單表最大存儲(chǔ)的依據(jù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪 2022-07-07
-
在 Windows 10 上安裝 解壓縮版 MySql(推薦)
這篇文章主要介紹了在 Windows 10 上安裝 解壓縮版 MySql(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下 2016-12-12
-
MySQL的CONCAT函數(shù)實(shí)現(xiàn)方案
本文系統(tǒng)分析MySQL中的CONCAT字符串拼接函數(shù),從基礎(chǔ)語法、與CONCAT_WS的本質(zhì)區(qū)別、典型應(yīng)用場(chǎng)景到高級(jí)優(yōu)化策略,重點(diǎn)探討CONCAT的空值處理機(jī)制,感興趣的朋友跟隨小編一起看看吧 2025-11-11
-
Mysql鎖內(nèi)部實(shí)現(xiàn)機(jī)制之C源碼解析
數(shù)據(jù)庫之所以要加鎖,因?yàn)閿?shù)據(jù)庫是一個(gè)多用戶使用的共享資源。當(dāng)多個(gè)用戶并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性 2022-08-08
-
MySQL中VARCHAR和TEXT的區(qū)別小結(jié)
MySQL中VARCHAR和TEXT用于存儲(chǔ)字符串,VARCHAR可變長度存儲(chǔ)在行內(nèi),適合短文本;TEXT存儲(chǔ)在溢出頁,適合大文本,下面就來具體的了解一下兩者的區(qū)別,感興趣的可以了解一下 2025-09-09
最新評(píng)論
1. 基本查詢簡(jiǎn)單回顧
條件篩選 | 使用 AND、OR、LIKE 等條件操作符進(jìn)行多條件篩選。 |
排序 | 使用 ORDER BY 對(duì)查詢結(jié)果進(jìn)行排序,支持多個(gè)字段排序(如按部門號(hào)升序,工資降序)。 |
聚合函數(shù)與分組 | 使用 GROUP BY 對(duì)數(shù)據(jù)進(jìn)行分組,并使用聚合函數(shù)(如 AVG(), MAX(), COUNT())進(jìn)行匯總。 |
子查詢 | 用于動(dòng)態(tài)選擇數(shù)據(jù),如查詢工資高于平均工資的員工。 |
內(nèi)嵌查詢 | 查詢工資最高的員工、顯示員工的年薪等。 |
- 查詢工資高于500或崗位為MANAGER的雇員,同時(shí)還要滿足他們的姓名首字母為大寫的
select *from emp where ename like 'j%' and (sal>500 or job='MANAGER');

使用年薪進(jìn)行降序排序:
select ename ,job,sal*12+ifnull(comm,0) sarn from emp order by sarn desc;

顯示工資最高的員工的名字和工作崗位:
方案一:
select ename ,job ,sal from emp where sal in(select max(sal) from emp );

方案二:
select ename ,job ,sal from emp order by sal desc limit 1;

顯示工資高于平均工資的員工信息:
select ename ,job ,sal from emp where sal>(select avg(sal) from emp);

顯示每個(gè)部門的平均工資和最高工資:
select deptno,format(avg(sal),2),max(sal) from emp group by deptno;

顯示平均工資低于2000的部門號(hào)和它的平均工資:
select deptno ,avg(sal) avgsal from emp group by deptno having avgsal<2000;

顯示每種崗位的雇員總數(shù),平均工資:
select job ,count(*) from emp group by job;

2. 多表查詢
聯(lián)接查詢 | 通過表之間的關(guān)系字段(如 deptno)進(jìn)行聯(lián)合查詢,常用的連接方式包括內(nèi)連接(INNER JOIN)等。 |
跨表查詢 | 通過連接多個(gè)表(如 EMP 和 DEPT)來獲取聯(lián)合結(jié)果。 |
使用 GROUP BY 和聚合函數(shù) | 計(jì)算每個(gè)部門的平均工資和最高工資等。 |
連接條件 | 可以通過多個(gè)條件進(jìn)行查詢,顯示特定條件下的數(shù)據(jù)。 |
將第一張表的每一條數(shù)據(jù)和第二章表的每一條數(shù)據(jù)相結(jié)合,不加過濾條件得到的結(jié)果被稱為笛卡爾積

笛卡爾積:

顯示部門為10的員工和部門的全部信息
select * from emp,dept where emp.deptno=dept.deptno and emp.deptno=10;

顯示部門為10的員工姓名,部門名和工資
select ename,sal,dname from emp,dept where emp.deptno=dept.deptno and emp.deptno=10;

顯示員工的姓名,工資,及工資級(jí)別
select ename ,sal,grade from emp,salgrade where sal between losal and hisal;

3. 自連接(Self-Join)
表的別名 | 自連接時(shí)需要使用別名來區(qū)分同一表的不同實(shí)例。 |
示例 | 查找員工的上級(jí)(使用 mgr 字段指向經(jīng)理的 empno)。 |
應(yīng)用場(chǎng)景 | 員工與其上級(jí)、領(lǐng)導(dǎo)層次的關(guān)系查詢。 |
將兩張相同的表做笛卡爾積
- 顯示員工及員工領(lǐng)導(dǎo)的個(gè)人信息
select * from emp e1, emp e2 where e1.empno=e2.mgr;

4. 子查詢
單行子查詢 | 子查詢只返回一行結(jié)果,通常用于 =、< 等條件。 |
多行子查詢 | 子查詢返回多行結(jié)果,常配合 IN、ALL、ANY 等關(guān)鍵字使用。 |
多列子查詢 | 返回多個(gè)列的數(shù)據(jù),適用于多條件的篩選。 |
FROM 子查詢 | 將子查詢作為臨時(shí)表使用,來簡(jiǎn)化復(fù)雜查詢。 |
嵌套查詢 | 通過將查詢嵌套在其他查詢語句中,增加查詢靈活性。 |
4.1單行子查詢
- 顯示SMITH同一部門的員工
select *from emp where deptno =(select deptno from emp where ename='SMITH');

4.2多行子查詢
返回多行記錄的子查詢
in關(guān)鍵字;查詢和10號(hào)部門的工作崗位相同的雇員的名字,崗位,工資,部門號(hào),但是不包含10自己的
select ename ,job,sal,deptno from emp where job in(select job from emp where deptno =10)and deptno<>10;

all關(guān)鍵字;顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號(hào)
select ename,sal,deptno from emp where sal > all(select sal from emp where deptno =30);

any關(guān)鍵字;顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(hào)(包含自己部門的員工)
select ename,sal,deptno from emp where sal>any(select sal from emp where deptno=30);

4.3多列子查詢
單行子查詢是指子查詢只返回單列,單行數(shù)據(jù);多行子查詢是指返回單列多行數(shù)據(jù),都是針對(duì)單列而言的,而多列子查詢則是指查詢返回多個(gè)列數(shù)據(jù)的子查詢語句
查詢和SMITH的部門和崗位完全相同的所有雇員,不含SMITH本人
select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH') and ename<>'SMITH';

4.4在from中使用子查詢
在mysql中每一次的查詢結(jié)果都是一個(gè)子表。
顯示每個(gè)高于自己部門平均工資的員工的姓名、部門、工資、平均工資
select ename,deptno,sal,asal from emp t1,(select deptno dt,avg(sal) asal from emp group by dt)t2 where t1.sal>t2.asal and t1.deptno=t2.dt;

查找每個(gè)部門工資最高的人的姓名、工資、部門、最高工資
select ename,sal,emp.deptno,msal from emp ,(select deptno,max(sal)msal from emp group by deptno) emp2 where sal=msal and emp.deptno=emp2.deptno ;

顯示每個(gè)部門的信息(部門名,編號(hào),地址)和人員數(shù)量
select *from dept, (select deptno,count(deptno) from emp group by deptno)dept2 where dept.deptno=dept2.deptno;

5. 合并查詢
UNION | 將多個(gè) SELECT 查詢結(jié)果合并,去除重復(fù)記錄。 |
UNION ALL | 將多個(gè) SELECT 查詢結(jié)果合并,不去除重復(fù)記錄。 |
應(yīng)用場(chǎng)景 | 如查詢職位為 MANAGER 或工資高于某數(shù)值的員工。 |
5.1UNION
該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),會(huì)自動(dòng)去掉結(jié)果集中的重復(fù)行。
- 將工資大于2500或職位是MANAGER的人找出來

5.2UNION ALL
該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),不會(huì)去掉結(jié)果集中的重復(fù)行。

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
為mysql數(shù)據(jù)庫添加添加事務(wù)處理的方法
開始首先說明一下,mysql數(shù)據(jù)庫默認(rèn)的數(shù)據(jù)庫引擎是MyISAM,是不支持事務(wù)的,單數(shù)如果你添加了數(shù)據(jù)執(zhí)行語句是不會(huì)出錯(cuò)的,單數(shù)不管用,即便是回滾事務(wù),記錄也是插入進(jìn)去了,所有首先我們要做的第一步是更改數(shù)據(jù)庫引擎2011-07-07
詳解Mysql數(shù)據(jù)庫平滑擴(kuò)容解決高并發(fā)和大數(shù)據(jù)量問題
本文主要介紹了Mysql數(shù)據(jù)庫平滑擴(kuò)容解決高并發(fā)和大數(shù)據(jù)量問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
mysql數(shù)據(jù)庫單表最大存儲(chǔ)依據(jù)詳解
這篇文章主要為大家介紹了mysql數(shù)據(jù)庫單表最大存儲(chǔ)的依據(jù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
在 Windows 10 上安裝 解壓縮版 MySql(推薦)
這篇文章主要介紹了在 Windows 10 上安裝 解壓縮版 MySql(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
MySQL的CONCAT函數(shù)實(shí)現(xiàn)方案
本文系統(tǒng)分析MySQL中的CONCAT字符串拼接函數(shù),從基礎(chǔ)語法、與CONCAT_WS的本質(zhì)區(qū)別、典型應(yīng)用場(chǎng)景到高級(jí)優(yōu)化策略,重點(diǎn)探討CONCAT的空值處理機(jī)制,感興趣的朋友跟隨小編一起看看吧2025-11-11
Mysql鎖內(nèi)部實(shí)現(xiàn)機(jī)制之C源碼解析
數(shù)據(jù)庫之所以要加鎖,因?yàn)閿?shù)據(jù)庫是一個(gè)多用戶使用的共享資源。當(dāng)多個(gè)用戶并發(fā)地存取數(shù)據(jù)時(shí),在數(shù)據(jù)庫中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性2022-08-08
MySQL中VARCHAR和TEXT的區(qū)別小結(jié)
MySQL中VARCHAR和TEXT用于存儲(chǔ)字符串,VARCHAR可變長度存儲(chǔ)在行內(nèi),適合短文本;TEXT存儲(chǔ)在溢出頁,適合大文本,下面就來具體的了解一下兩者的區(qū)別,感興趣的可以了解一下2025-09-09

