掘金日新计划 · 8 月更文挑战第47天--mysql高级查询(二)

93 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第47天,点击查看活动详情

基础数据

image.png

1.统计平均工资大于2000的部门(having使用)

错误查询方式:

查询语句
SELECT deptno from t_emp WHERE AVG(sal)>2000 GROUP BY deptno
查询结果
image.png 报错原因:
因为where的优先级高于group by,平均工资还没算出来就进行分组,会报错

正确查询方式:

正确查询语句
SELECT deptno from t_emp GROUP BY deptno HAVING AVG(sal)>2000
查询结果:
image.png

2.group by 数字

查询语句
SELECT deptno,sal,COUNT(*) from t_emp GROUP BY 1
查询结果 image.png 总结
group by 1表示的是对查询结果的depno字段进行分组

3.分组结果统计(WITH ROLLUP)

查询语句
SELECT deptno,COUNT(*),AVG(sal) from t_emp GROUP BY deptno WITH ROLLUP
查询结果: image.png

4.查询结果进行连接group_concat

查询每个部门工资大于2000的员工并且统计数量 查询语句:
SELECT GROUP_CONCAT(ename),deptno,COUNT(*) from t_emp WHERE sal>2000 GROUP BY deptno
查询结果: image.png

5.连接查询

前置数据:

部门表:t_dept image.png 薪资等级表:t_salgrade
image.png 员工表:t_emp image.png 查询要求:查询员工工号,薪水,员工名字,员工所属部门,薪资等级信息
查询语句:
SELECT e.empno, e.sal, e.ename, d.dname, s.grade FROM t_emp e JOIN t_dept d ON e.deptno = d.deptno JOIN t_salgrade s ON e.sal BETWEEN s.losal AND s.hisal 查询结果:

image.png

6.子查询和连接查询效率问题

查询要求:查询和SMITH同部门的员工
子查询
SELECT * from t_emp where deptno=( SELECT deptno from t_emp where ename = "SMITH") and ename!="SMITH" 查询结果: image.png 连接查询:
SELECT e2.empno,e2.ename,e2.deptno from t_emp e1 JOIN t_emp e2 on e1.deptno= e2.deptno where e1.ename="SMITH" and e2.ename!="SMITH"
查询结果:
image.png