(复合题)建立如下数据库表: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员工表导入为例)
https://www.cda.cn/discuss/post/details/64f980b7a7006e15447fa39c
暂无数据