专业编程基础技术教程

网站首页 > 基础教程 正文

mysql中 group by,having总结

ccvgpt 2025-01-01 18:21:47 基础教程 6 ℃

1、group by:按照某个字段或者某些字段进行分组。

2、having:对分组之后的数据再次进行过滤。

mysql中 group by,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的效率。

Tags:

最近发表
标签列表