mysql中group by和having的用法

admin
admin
admin
374
文章
102
评论
2022年5月27日08:00:00
评论
3,595

group by是mysql中用来对by后面的单个或者多个字段进行分组的语法,可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表,用法比较灵活,常常和where或者having一起用。

一、group by的语法:

1、一般语法

select 字段 from 表名 group by 字段;

2、带有过滤条件having、wherer的用法

如果另外还有过滤条件的话,一般是where或者having,可以这样用:

select 字段 from 表名 where 条件 group by 字段;
select 字段 from 表名 group by 字段 having 条件;

注意:where 是先过滤,再分组;having 是分组后再过滤

Having子句(是对分组之后的数据进行过滤,所以使用having时必须用group by先分组),Having中的组函数可以不是select中的组函数

where子句和having子句都是用来筛选条件用的,不同的是,where子句只能对分组前的属性进行删选,而having子句只能对分组后的属性进行筛选。

3、group by经常会配合聚合函数一起用

比如常用的聚合函数:count() , sum() , avg() , max() , min(),可以这样用

select 字段,count(字段2),sum(字段3) from 表名 group by 字段;

4、select后面的字段必须包含在group by后面字段之内

select 字段1,字段2 from 表名 group 字段1,字段2,字段3

select后有聚合函数例外:

select 字段1,count(字段2),sum(字段3) from 表名 group by 字段1;

二、group by的用法实例:

下表有六个字段,分别为id、name(姓名)、dept(部门)、salary(工资)、edlevel(等级)、hiredate(聘用日期)

id name dept salary edlevel hiredate
1 张三 开发部 2000 3 2009-10-11
2 李四 开发部 2500 3 2009-10-01
3 王五 设计部 2600 5 2010-10-02
4 王六 设计部 2300 4 2010-10-03
5 马七 设计部 2100 4 2010-10-06
6 赵八 销售部 3000 5 2010-10-05
7 钱九 销售部 3100 7 2010-10-07
8 孙十 销售部 3500 7 2010-10-06

根据上面的表,分别说一下group by的几个用法:

1、group by的基本用法:

列出各个部门最高薪水的结果,sql语句如下:

SELECT DEPT,MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT

查询结果如下:
DEPT MAXIMUM
开发部 2500
设计部 2600
销售部 3500

这里就用到了聚合函数,max(salary)可以获取salary字段的最大值,根据部门字段dept进行分类,选出各个部门中salary的最大值。

列出每个部门的总的薪水

SELECT DEPT, sum(SALARY) AS total
FROM STAFF
GROUP BY DEPT

查询结果如下:
DEPT total
开发部 4500
设计部 7000
销售部 9600
将 WHERE 子句与 GROUP BY 子句一起使用,不过必须在GROUP BY子句之前指定 WHERE 子句,下面的例子也是一样的。

2、where group by的用法实例:

查询公司2010年入职的各个部门每个级别里的最高薪水

SELECT DEPT,EDLEVEL, MAX(SALARY) AS MAXIMUM
FROM staff
WHERE HIREDATE > ‘2010-01-01’
GROUP BY DEPT,EDLEVEL

查询结果如下:
DEPT EDLEVEL MAXIMUM
设计部 4 2300
设计部 5 2600
销售部 5 3000
销售部 7 3500

GROUP BY子句对DEPT和EDLEVEL的每个唯一组合各返回一行。

3、group by having的用法实例:

列出有2个以上雇员的部门的最高和最低薪水:

SELECT DEPT, MAX(SALARY) AS MAXIMUM,MIN(SALARY) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING COUNT(*)>2

查询结果如下:
DEPT MAXIMUM MINIMUM
设计部 2600 2100
销售部 3500 3000

HAVING COUNT(*) >2这个过滤条件会选出staff表里面DEPT字段出现次数超过2次的dept字段值。

列出雇员平均工资大于3000的部门的最高和最低薪水:

SELECT DEPT,MAX(SALARY) AS MAXIMUM,MIN(SALARY) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING AVG(SALARY)>3000

查询结果如下:
DEPT MAXIMUM MINIMUM
销售部 3500 3000

admin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: