熱線電話:13121318867

登錄
2023-10-25 閱讀量: 864
CDA學習模擬題之SQL句子select deptid,avg(sal) from employee group by deptid HAVING job='clerk

(復合題)建立如下數據庫表:create table department( departid int not null primary key, deptname varchar(20) not null ); create table employee( employeeid int not null, deptid int not null, ename varchar(20) not null,job varchar(10),sal decimal(10,2));

(2)以下 SQL語句中,錯誤的是 ( )。

A select avg(sal) from employee;

B select deptid,avg(sal) from employee group by depti

C select deptid,job,avg(sal) from employee group by deptid,job;

D select deptid,avg(sal) from employee group by deptid HAVING job='clerk


答案:D

解析:

select deptid,avg(sal) from employee group by deptid HAVING job='clerk'是錯誤的。

在這個SQL語句中,使用了GROUP BY子句來按照deptid分組,并計算每個組的平均工資。然后使用HAVING子句來篩選出job為'clerk'的組。

然而,這個SQL語句是錯誤的,因為在SELECT子句中只選擇了deptid和avg(sal),沒有選擇job列。根據SQL語法的規定,如果在SELECT后面使用了GROUP BY子句,那么SELECT子句中的列必須要么是對某列的聚合函數 [例如avg(sal)],要么是在GROUP BY子句中已列出的列。在這個SQL語句中,job列既不是聚合函數,也不是在GROUP BY子句中列出的列,所以會導致語法錯誤。


正確的SQL語句應該是: SELECT deptid, avg(sal), job FROM employee GROUP BY deptid, job HAVING job='clerk';

(備注:配圖中的 deptid 即 deptno, employee 即 emp

這樣就可以同時選擇deptid、avg(sal)和job列,并按照deptid和job分組,然后篩選出job為'clerk'的組。

image.png


特殊情況備注:

有人說改成" select deptno,job,avg(sal) from emp group by deptno HAVING job='clerk'; " 后可以執行, 是的,我試了可以執行 但是要特別警惕,這個執行結果

沒有業務意義,因為這個結果不是20號部門的clerk員工 的平均工資,這個是從聚合結果拿到各部門的deptno, avg(sal) ,然后去拿job, 這個時候按照分組聚合不知道怎么拿job,

于是默認拿取每組的第一行job的值過來,然后在這個select對group by分組聚合結果做select拿取后的結果集的基礎上把 job='clerk' 的結果顯示出來;


可能的誤區:有的小伙伴,可能會像我一樣,一開始看到這個句子,誤以為是分組后把每組的job='clerk'的結果篩選出來后,

然后在進行avg(sal)的聚合運算,其實不是的,這個sql句子執行后就是個很奇葩的結果,沒有業務意義。


想實現查看各部門的clerk員工的平均工資可以按照上面我給出的解析里的句子來做:

SELECT deptid, avg(sal), job FROM employee GROUP BY deptid, job HAVING job='clerk';


1,select deptno,job,avg(sal) from emp group by deptno ; 的結果如圖所示:

image.png


2,select deptno,job,avg(sal) from emp group by deptno HAVING job='clerk'; 的奇葩結果如圖所示:

image.png


3,所以總結一下,having一般情況是跟的聚合條件篩選 ,

另外 他還有一個特殊情況的用途, 就是在select對group by分組聚合結果做select拿取后的結果集的基礎上再做字段值篩選(例如having job='clerk' )


備注:本文的示例數據來自CDA認證一級教材 《精益業務數據分析》,給出一個鏈接,感興趣可以實操試試

CDA學習之關于MySQL建表后批量導入數據的示例說明(以CDA一級考試教材中的emp員工表導入為例)

http://www.ruiqisteel.com/discuss/post/details/64f980b7a7006e15447fa39c



0.0000
0
關注作者
收藏
評論(0)

發表評論

暫無數據
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码