(復合題)建立如下數據庫表: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'的組。
特殊情況備注:
有人說改成" 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 ; 的結果如圖所示:
2,select deptno,job,avg(sal) from emp group by deptno HAVING job='clerk'; 的奇葩結果如圖所示:
3,所以總結一下,having一般情況是跟的聚合條件篩選 ,
另外 他還有一個特殊情況的用途, 就是在select對group by分組聚合結果做select拿取后的結果集的基礎上再做字段值篩選(例如having job='clerk' )
備注:本文的示例數據來自CDA認證一級教材 《精益業務數據分析》,給出一個鏈接,感興趣可以實操試試
CDA學習之關于MySQL建表后批量導入數據的示例說明(以CDA一級考試教材中的emp員工表導入為例)
http://www.ruiqisteel.com/discuss/post/details/64f980b7a7006e15447fa39c








暫無數據