MySQL子查詢與HAVING/SELECT的結(jié)合使用
前言
本節(jié)將為大家?guī)鞰ySQL子查詢?cè)?code>HAVING/SELECT字句中使用、及相關(guān)子查詢和WITH/EXISTS字句的講解?
一、在HAVING/SELECT字句中使用子查詢
??HAVING字句
查詢部門編號(hào)、員工人數(shù)、平均工資,并且要求這些部門的平均工資高于公司平均薪資。
SELECT deptno,COUNT(deptno) cnt,AVG(sal) avgsal FROM emp GROUP BY deptno HAVING avgsal> ( SELECT AVG(sal) FROM emp );
查詢出所有部門中平均工資最高的部門名稱及平均工資
SELECT e.deptno,d.dname,ROUND(AVG(sal),2) avgsal
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY e.deptno
HAVING avgsal>
(
#查詢出所有部門平均工資中最高的薪資
SELECT MAX(avgsal) FROM
(SELECT AVG(sal) avgsal FROM emp GROUP BY deptno) AS temp
)
??SELECT字句
查詢出公司每個(gè)部門的編號(hào)、名稱、位置、部門人數(shù)、平均工資
#1多表查詢 SELECT d.deptno,d.dname,d.loc,COUNT(e.deptno),AVG(e.sal) FROM emp e,dept d WHERE e.deptno=d.deptno GROUP BY e.deptno; #2 SELECT d.deptno,d.dname,d.loc,temp.cnt,temp.avgsal FROM dept d,(SELECT deptno,COUNT(deptno) cnt,AVG(sal) avgsal FROM emp GROUP BY deptno) temp WHERE d.deptno=temp.deptno; #3 關(guān)聯(lián)子查詢 SELECT d.deptno,d.dname,d.loc, (SELECT COUNT(deptno) FROM emp WHERE deptno=d.deptno GROUP BY deptno) cnt, (SELECT AVG(sal) FROM emp WHERE deptno=d.deptno GROUP BY deptno) avgsal FROM dept d;

二、相關(guān)子查詢
?如果子查詢的執(zhí)行依賴外部查詢,通常情況下都是因?yàn)樽硬樵冎械谋碛玫搅送獠康谋?,并進(jìn)行了條件關(guān)聯(lián),因此每執(zhí)行一次外部查詢,子查詢都要重新計(jì)算一次,這樣的子查詢就成為關(guān)聯(lián)子查詢。相關(guān)子查詢按照一行接一行的順序指針,主查詢的每一行都指向一次子查詢。

?查詢需求
查詢員工中工資大于本部門平均工資的員工的部門編號(hào)、姓名、薪資
SELECT e.deptno,e.ename,e.sal FROM emp e WHERE e.sal>(SELECT AVG(sal) FROM emp WHERE deptno=e.deptno );

三、WITH/EXISTS、NOT EXISTS字句
??WITH字句
查詢每個(gè)部門的編號(hào)、名稱、位置、部門平均工資、人數(shù)
-- 多表查詢 SELECT d.deptno,d.dname,d.loc,AVG(e.sal) avgsal ,COUNT(e.deptno) cnt FROM dept d,emp e WHERE d.deptno=e.deptno GROUP BY e.deptno; -- 子查詢 SELECT d.deptno,d.dname,d.loc,temp.avgsal,temp.cnt FROM dept d,( SELECT deptno,AVG(sal) avgsal,COUNT(deptno) cnt FROM emp GROUP BY deptno )temp WHERE d.deptno=temp.deptno; -- 使用with WITH temp AS( SELECT deptno,AVG(sal) avgsal,COUNT(deptno) cnt FROM emp GROUP BY deptno ) SELECT d.deptno,d.dname,d.loc,temp.avgsal,temp.cnt FROM dept d,temp WHERE d.deptno=temp.deptno;
查詢每個(gè)部門工資最高的員工編號(hào)、姓名、職位、雇傭日期、工資、部門編號(hào)、部門名稱,顯示的結(jié)果按照部門編號(hào)進(jìn)行排序
-- 相關(guān)子查詢 SELECT e.empno,e.ename,e.job,e.hiredate,e.sal,e.deptno,d.dname FROM emp e,dept d WHERE e.deptno=d.deptno AND e.sal=(SELECT MAX(sal) FROM emp WHERE deptno=e.deptno) ORDER BY e.deptno; -- 表子查詢 SELECT e.empno,e.ename,e.job,e.hiredate,e.sal,e.deptno,d.dname FROM emp e,dept d,(SELECT deptno,MAX(sal) maxsal FROM emp GROUP BY deptno) temp WHERE e.deptno=d.deptno AND e.sal=temp.maxsal AND e.deptno = temp.deptno ORDER BY e.deptno;


??EXISTS/NOT EXISTS字句
在SQL中提供了一個(gè)exixts結(jié)構(gòu)用于判斷子查詢是否有數(shù)據(jù)返回。如果子查詢中有數(shù)據(jù)返回,exists結(jié)構(gòu)返回true,否則返回false。
查詢公司管理者的編號(hào)、姓名、工作、部門編號(hào)
-- 多表查詢 SELECT DISTINCT e.empno,e.ename,e.job,e.deptno FROM emp e JOIN emp mgr ON e.empno=mgr.mgr; -- 使用EXISTS SELECT e.empno,e.ename,e.job,e.deptno FROM emp e WHERE EXISTS (SELECT * FROM emp WHERE e.empno=mgr);
查詢部門表中,不存在于員工表中的部門信息
-- 多表查詢 SELECT e.deptno,d.deptno,d.dname,d.loc FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno WHERE e.deptno IS NULL; -- 使用EXISTS SELECT d.deptno,d.dname,d.loc FROM dept d WHERE NOT EXISTS (SELECT deptno FROM emp WHERE deptno=d.deptno);


四、總結(jié)
?? 子查詢?cè)试S結(jié)構(gòu)化的查詢,這樣就可以把一個(gè)查詢語句的每個(gè)部分隔開。??子查詢提供了另一種方法來執(zhí)行有些需要復(fù)雜的join和union來實(shí)現(xiàn)的操作。??在許多人看來,子查詢可讀性較高。 而實(shí)際上,這也是子查詢的由來。
到此這篇關(guān)于MySQL子查詢與HAVING/SELECT的結(jié)合使用的文章就介紹到這了,更多相關(guān)MySQL子查詢與HAVING/SELECT內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ubuntu下磁盤空間不足導(dǎo)致mysql無法啟動(dòng)的解決方法
昨天又遇到了MySQL數(shù)據(jù)庫無法重啟的問題,還以為是權(quán)限的原因,后來發(fā)現(xiàn)提示是因?yàn)榇疟P空間不足導(dǎo)致的,通過查找相關(guān)資料得以解決了,所以下面這篇文章主要介紹了ubuntu下磁盤空間不足導(dǎo)致mysql無法啟動(dòng)的解決方法,需要的朋友可以參考下。2017-03-03
Mysql中關(guān)于Incorrect string value的解決方案
在對(duì)mysql數(shù)據(jù)庫中插入數(shù)據(jù)的時(shí)候,直接插入中文是沒有問題的!但是用預(yù)編譯語句時(shí),用流對(duì)數(shù)據(jù)進(jìn)行處理總報(bào)incorrect string value這個(gè)異常。本篇文章教給你解決方法2021-09-09
mysql創(chuàng)建外鍵報(bào)錯(cuò)的原因及解決(can't?not?create?table)
這篇文章主要介紹了mysql創(chuàng)建外鍵報(bào)錯(cuò)的原因及解決方案(can't?not?create?table),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
MySQL單表與多表練習(xí)題目及答案總結(jié)大全
MySQL是一個(gè)強(qiáng)大的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),多表查詢是數(shù)據(jù)庫操作中的重要部分之一,多表查詢?cè)试S您從多個(gè)表中檢索和操作數(shù)據(jù),以滿足復(fù)雜的數(shù)據(jù)需求,這篇文章主要介紹了MySQL單表與多表練習(xí)題目及答案總結(jié)的相關(guān)資料,需要的朋友可以參考下2026-04-04
mysql中替代null的IFNULL()與COALESCE()函數(shù)詳解
這篇文章主要給大家介紹了關(guān)于mysql中替代null的IFNULL()與COALESCE()函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看看吧。2017-06-06

