MySQL子查詢與HAVING/SELECT的結(jié)合使用
前言
本節(jié)將為大家?guī)鞰ySQL子查詢在HAVING/SELECT
字句中使用、及相關(guān)子查詢和WITH/EXISTS
字句的講解?
一、在HAVING/SELECT字句中使用子查詢
??HAVING字句
查詢部門編號、員工人數(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字句
查詢出公司每個部門的編號、名稱、位置、部門人數(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í)行依賴外部查詢,通常情況下都是因為子查詢中的表用到了外部的表,并進(jìn)行了條件關(guān)聯(lián),因此每執(zhí)行一次外部查詢,子查詢都要重新計算一次,這樣的子查詢就成為關(guān)聯(lián)子查詢。相關(guān)子查詢按照一行接一行的順序指針,主查詢的每一行都指向一次子查詢。
?查詢需求
查詢員工中工資大于本部門平均工資的員工的部門編號、姓名、薪資
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字句
查詢每個部門的編號、名稱、位置、部門平均工資、人數(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;
查詢每個部門工資最高的員工編號、姓名、職位、雇傭日期、工資、部門編號、部門名稱,顯示的結(jié)果按照部門編號進(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中提供了一個exixts結(jié)構(gòu)用于判斷子查詢是否有數(shù)據(jù)返回。如果子查詢中有數(shù)據(jù)返回,exists結(jié)構(gòu)返回true,否則返回false。
查詢公司管理者的編號、姓名、工作、部門編號
-- 多表查詢 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é)
?? 子查詢允許結(jié)構(gòu)化的查詢,這樣就可以把一個查詢語句的每個部分隔開。??子查詢提供了另一種方法來執(zhí)行有些需要復(fù)雜的join和union來實現(xiàn)的操作。??在許多人看來,子查詢可讀性較高。 而實際上,這也是子查詢的由來。
到此這篇關(guān)于MySQL子查詢與HAVING/SELECT的結(jié)合使用的文章就介紹到這了,更多相關(guān)MySQL子查詢與HAVING/SELECT內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Unity連接MySQL并讀取表格數(shù)據(jù)的實現(xiàn)代碼
本文給大家介紹Unity連接MySQL并讀取表格數(shù)據(jù)的實現(xiàn)代碼,實例化的同時調(diào)用MySqlConnection,傳入?yún)?shù),這里的傳入?yún)?shù)個人認(rèn)為是CMD里面的直接輸入了,string格式直接類似手敲到cmd里面,完整代碼參考下本文2021-06-06MySQL實戰(zhàn)文章(非常全的基礎(chǔ)入門類教程)
半個月時間把MySQL重新鞏固了一遍,梳理了一篇幾萬字超硬核文章,想學(xué)習(xí)mysql的朋友可以看看2023-05-05MySQL 性能優(yōu)化的最佳20多條經(jīng)驗分享
今天,數(shù)據(jù)庫的操作越來越成為整個應(yīng)用的性能瓶頸了,這點對于Web應(yīng)用尤其明顯。關(guān)于數(shù)據(jù)庫的性能,這并不只是DBA才需要擔(dān)心的事,而這更是我們程序員需要去關(guān)注的事情。2010-07-07MySQL實現(xiàn)數(shù)據(jù)插入操作的示例詳解
使用MySQL插入數(shù)據(jù)時,可以根據(jù)需求場景選擇合適的插入語句。本文通過給出每個使用場景下的實例來說明數(shù)據(jù)插入的實現(xiàn)過程和方法,希望對大家有所幫助2023-02-02Mysql中find_in_set()函數(shù)用法詳解以及使用場景
前幾天在sql查詢的時候,想要判斷數(shù)據(jù)庫中表的某一列中的值是否在List集合中,接觸到了find_in_set的使用,用起來方便快捷,下面這篇文章主要給大家介紹了關(guān)于Mysql中find_in_set()函數(shù)用法詳解以及使用場景的相關(guān)資料,需要的朋友可以參考下2023-03-03