(復(fù)合題)建立如下數(shù)據(jù)庫(kù)表: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語(yǔ)句中,錯(cuò)誤的是 ( )。
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'是錯(cuò)誤的。
在這個(gè)SQL語(yǔ)句中,使用了GROUP BY子句來(lái)按照deptid分組,并計(jì)算每個(gè)組的平均工資。然后使用HAVING子句來(lái)篩選出job為'clerk'的組。
然而,這個(gè)SQL語(yǔ)句是錯(cuò)誤的,因?yàn)樵赟ELECT子句中只選擇了deptid和avg(sal),沒(méi)有選擇job列。根據(jù)SQL語(yǔ)法的規(guī)定,如果在SELECT后面使用了GROUP BY子句,那么SELECT子句中的列必須要么是對(duì)某列的聚合函數(shù) [例如avg(sal)],要么是在GROUP BY子句中已列出的列。在這個(gè)SQL語(yǔ)句中,job列既不是聚合函數(shù),也不是在GROUP BY子句中列出的列,所以會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。
正確的SQL語(yǔ)句應(yīng)該是: SELECT deptid, avg(sal), job FROM employee GROUP BY deptid, job HAVING job='clerk';
(備注:配圖中的 deptid 即 deptno, employee 即 emp)
這樣就可以同時(shí)選擇deptid、avg(sal)和job列,并按照deptid和job分組,然后篩選出job為'clerk'的組。
特殊情況備注:
有人說(shuō)改成" select deptno,job,avg(sal) from emp group by deptno HAVING job='clerk'; " 后可以執(zhí)行, 是的,我試了可以執(zhí)行 但是要特別警惕,這個(gè)執(zhí)行結(jié)果
沒(méi)有業(yè)務(wù)意義,因?yàn)檫@個(gè)結(jié)果不是20號(hào)部門的clerk員工 的平均工資,這個(gè)是從聚合結(jié)果拿到各部門的deptno, avg(sal) ,然后去拿job, 這個(gè)時(shí)候按照分組聚合不知道怎么拿job,
于是默認(rèn)拿取每組的第一行job的值過(guò)來(lái),然后在這個(gè)select對(duì)group by分組聚合結(jié)果做select拿取后的結(jié)果集的基礎(chǔ)上把 job='clerk' 的結(jié)果顯示出來(lái);
可能的誤區(qū):有的小伙伴,可能會(huì)像我一樣,一開始看到這個(gè)句子,誤以為是分組后把每組的job='clerk'的結(jié)果篩選出來(lái)后,
然后在進(jìn)行avg(sal)的聚合運(yùn)算,其實(shí)不是的,這個(gè)sql句子執(zhí)行后就是個(gè)很奇葩的結(jié)果,沒(méi)有業(yè)務(wù)意義。
想實(shí)現(xiàn)查看各部門的clerk員工的平均工資可以按照上面我給出的解析里的句子來(lái)做:
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 ; 的結(jié)果如圖所示:
2,select deptno,job,avg(sal) from emp group by deptno HAVING job='clerk'; 的奇葩結(jié)果如圖所示:
3,所以總結(jié)一下,having一般情況是跟的聚合條件篩選 ,
另外 他還有一個(gè)特殊情況的用途, 就是在select對(duì)group by分組聚合結(jié)果做select拿取后的結(jié)果集的基礎(chǔ)上再做字段值篩選(例如having job='clerk' )
備注:本文的示例數(shù)據(jù)來(lái)自CDA認(rèn)證一級(jí)教材 《精益業(yè)務(wù)數(shù)據(jù)分析》,給出一個(gè)鏈接,感興趣可以實(shí)操試試
CDA學(xué)習(xí)之關(guān)于MySQL建表后批量導(dǎo)入數(shù)據(jù)的示例說(shuō)明(以CDA一級(jí)考試教材中的emp員工表導(dǎo)入為例)
http://www.3lll3.cn/discuss/post/details/64f980b7a7006e15447fa39c








暫無(wú)數(shù)據(jù)