MySQL子查詢與HAVING/SELECT的結合使用
本節將為大家帶來MySQL子查詢在HAVING/SELECT字句中使用、及相關子查詢和WITH/EXISTS字句的講解?
一、在HAVING/SELECT字句中使用子查詢??HAVING字句查詢部門編號、員工人數、平均工資,并且要求這些部門的平均工資高于公司平均薪資。
SELECT deptno,COUNT(deptno) cnt,AVG(sal) avgsal FROM emp GROUP BY deptnoHAVING avgsal>(SELECT AVG(sal) FROM emp);查詢出所有部門中平均工資最高的部門名稱及平均工資
SELECT e.deptno,d.dname,ROUND(AVG(sal),2) avgsalFROM emp e,dept dWHERE e.deptno=d.deptnoGROUP BY e.deptnoHAVING avgsal>( #查詢出所有部門平均工資中最高的薪資 SELECT MAX(avgsal) FROM (SELECT AVG(sal) avgsal FROM emp GROUP BY deptno) AS temp)查詢出公司每個部門的編號、名稱、位置、部門人數、平均工資
#1多表查詢SELECT d.deptno,d.dname,d.loc,COUNT(e.deptno),AVG(e.sal)FROM emp e,dept dWHERE e.deptno=d.deptnoGROUP BY e.deptno;#2SELECT d.deptno,d.dname,d.loc,temp.cnt,temp.avgsalFROM dept d,(SELECT deptno,COUNT(deptno) cnt,AVG(sal) avgsal FROM emp GROUP BY deptno) tempWHERE d.deptno=temp.deptno;#3 關聯子查詢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) avgsalFROM dept d;?如果子查詢的執行依賴外部查詢,通常情況下都是因為子查詢中的表用到了外部的表,并進行了條件關聯,因此每執行一次外部查詢,子查詢都要重新計算一次,這樣的子查詢就成為關聯子查詢。相關子查詢按照一行接一行的順序指針,主查詢的每一行都指向一次子查詢。
查詢員工中工資大于本部門平均工資的員工的部門編號、姓名、薪資
SELECT e.deptno,e.ename,e.salFROM emp eWHERE e.sal>(SELECT AVG(sal) FROM emp WHERE deptno=e.deptno );查詢每個部門的編號、名稱、位置、部門平均工資、人數
-- 多表查詢SELECT d.deptno,d.dname,d.loc,AVG(e.sal) avgsal ,COUNT(e.deptno) cntFROM dept d,emp eWHERE d.deptno=e.deptnoGROUP BY e.deptno;-- 子查詢SELECT d.deptno,d.dname,d.loc,temp.avgsal,temp.cntFROM dept d,(SELECT deptno,AVG(sal) avgsal,COUNT(deptno) cntFROM empGROUP BY deptno)tempWHERE d.deptno=temp.deptno;-- 使用withWITH temp AS(SELECT deptno,AVG(sal) avgsal,COUNT(deptno) cntFROM empGROUP BY deptno)SELECT d.deptno,d.dname,d.loc,temp.avgsal,temp.cntFROM dept d,tempWHERE d.deptno=temp.deptno;查詢每個部門工資最高的員工編號、姓名、職位、雇傭日期、工資、部門編號、部門名稱,顯示的結果按照部門編號進行排序
-- 相關子查詢SELECT e.empno,e.ename,e.job,e.hiredate,e.sal,e.deptno,d.dnameFROM emp e,dept dWHERE e.deptno=d.deptnoAND 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.dnameFROM emp e,dept d,(SELECT deptno,MAX(sal) maxsal FROM emp GROUP BY deptno) tempWHERE e.deptno=d.deptnoAND e.sal=temp.maxsalAND e.deptno = temp.deptnoORDER BY e.deptno;在SQL中提供了一個exixts結構用于判斷子查詢是否有數據返回。如果子查詢中有數據返回,exists結構返回true,否則返回false。
查詢公司管理者的編號、姓名、工作、部門編號
-- 多表查詢SELECT DISTINCT e.empno,e.ename,e.job,e.deptnoFROM emp e JOIN emp mgrON e.empno=mgr.mgr;-- 使用EXISTSSELECT e.empno,e.ename,e.job,e.deptnoFROM emp eWHERE EXISTS (SELECT * FROM emp WHERE e.empno=mgr);查詢部門表中,不存在于員工表中的部門信息
-- 多表查詢SELECT e.deptno,d.deptno,d.dname,d.locFROM emp e RIGHT JOIN dept dON e.deptno=d.deptnoWHERE e.deptno IS NULL;-- 使用EXISTSSELECT d.deptno,d.dname,d.locFROM dept dWHERE NOT EXISTS (SELECT deptno FROM emp WHERE deptno=d.deptno);?? 子查詢允許結構化的查詢,這樣就可以把一個查詢語句的每個部分隔開。??子查詢提供了另一種方法來執行有些需要復雜的join和union來實現的操作。??在許多人看來,子查詢可讀性較高。 而實際上,這也是子查詢的由來。
到此這篇關于MySQL子查詢與HAVING/SELECT的結合使用的文章就介紹到這了,更多相關MySQL子查詢與HAVING/SELECT內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章:
