mysql中 group by,having总结
1、group by:按照某个字段或者某些字段进行分组。
2、having:对分组之后的数据再次进行过滤。
3、分组函数一般都会和group by联合使用。
4、当一条sql语句没有group by的时候,整张表的数据会自成一组数据。
5、当一条sql语句中有group by的时候,select后面只可以跟 参与分组的字段和分组函数。
6、
现在有一张员工信息表如下:

员工表
1)找出每个工作岗位的最高薪资。
select job, max(sal) as sal from emp group by job;

每个工作岗位的最高薪资
2)查询薪资高于平均薪资的员工
select ename ,sal from emp where sal > avg(sal);

错误提示
估计很多人都会写成上面的sql语句,上面的错误提示是:错误的使用分组函数。这里有一条重要的结论:分组函数不可以直接使用在where后面。
原因:分组函数是在group by后面执行,group by又在where后面执行,所以where后面不可以直接使用分组函数。
sql语句的执行顺序:
1、from
2、where
3、group by
4、having
5、select
6、order by
所以sql语句可以这样写:select ename ,sal from emp where sal > (select avg(sal) from emp);

薪资大于平均薪资的员工
3)找出每个工作岗位的平均薪资
select job , avg(sal) from emp group by job;

每个工作岗位的平均薪资
4)找出每个部门不同工作岗位的最高薪资(多个字段进行分组查询)
select deptno ,job,max(sal) from emp group by deptno,job;

每个部门不同工作岗位的最高薪资 每个部门不同工作岗位的最高薪资
二:having和where的使用
1)查询每个部门的最高薪资,并且展示只大于2900的
select deptno , max(sal) from emp group by deptno having max(sal) > 2900;

使用having我们可以查询需要的结果,但是不建议这样使用,因为效率不高。
原因:我们是将所有的数据进行了分组,然后在所有的数据里面查找了薪资最高的,最后去除了低于2900的。我们不如直接使用where将低于2900的直接去除,这样就不用将低于2900的数据在进行分组和去查找最高薪资了。
select deptno,max(sal) from emp where sal > 2900 group by deptno;

结果都是一样的,但是使用where的效率要高于having。
这里有很重要的一条提高sql效率的总结:能在前面提前过滤的数据,就要提前过滤掉,不要再最后再进行过滤。将无用的数据进行查询比较会降低sql的效率。
相关推荐
-
「nginx」十、nginx的location配置详解2026-07-04 00:51:45 -

最清晰的mysql体系架构图 ,助你深度掌握MySQL开发管理,赢在大数据时代
最清晰的mysql体系架构图 ,助你深度掌握MySQL开发管理,赢在大数据时代2026-07-04 00:21:47 -
PHP读取Excel内的图片2026-07-03 00:07:41 -
mysql:Otter跨机房数据同步(单向)2026-07-03 00:02:48 -

在windows10系统下搭建IIS+PHP+MYSQL+phpMyAdmin服务器运行环境
在windows10系统下搭建IIS+PHP+MYSQL+phpMyAdmin服务器运行环境2026-07-02 00:15:08