CDA持证人阿涛哥

2023-10-25   阅读量: 263

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员工表导入为例)

https://www.cda.cn/discuss/post/details/64f980b7a7006e15447fa39c



添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
0.0000 0 0 关注作者 收藏

评论(0)


暂无数据

推荐课程