mysql group by和having实例详解

发布时间:2020-06-29编辑:脚本学堂
通过具体的例子,为大家介绍having与group by的用法,有需要的朋友,不妨参考下了。

1、首先,来看Group by子句
group by 分组。mysql允许我们按照某一列将数据进行分组。

举一个例子,例如:有一个单位,包括5个部门,我们为每个部门的员工建立了一条数据,包括员工编号(id),名字(name),age(age),工资(salary),所属部门(dept)....。如果想要查找每个部门包括多少个员工,用where子句比较麻烦,此时就该group by出场了。
示例:

select count(*) from employee group by dept;

可以查询出每个部门有多少人。

2、having子句的条件:

不是记录的每列都可以作为条件,这要看具体情况而定。sql标准要求having子句的条件必须引用group by子句的列或是聚合函数。
但是mysql支持扩展,having可以涉及select清单中的列,和外部子查询中的列。

having的功能和where相同,where的语法完全适用于having子句。
它们的不同点:
(1)
having是对组进行过滤。
where是对行进行过滤。

(2)
用到having子句,就不得不提聚合函数(sum(),avg(),max(),min(),count()),where、having和聚合函数有一个执行先后顺序:where > 聚合函数 > having。下面举个例子来说明这个问题。
例1:

select count(*) from employee where salary>3000;

执行时会首先将salary<3000的员工排除掉,然后进行计数。

例2:

select dept from employee group by dept having sum(salary)>100000;

执行时会先进行分组,然后聚合函数sum()会统计,哪个部门的工资总额大于100000,然后这个数值 再作为having的条件进行判断。

说明:一个思维误区:
要查找5个部门中工资最高的员工,执行语句:

select id,name,salary from employee group by dept having salary=max(salary);

我的思路是先按照部门进行分组,然后以salary最高作为条件来查找这个员工。
显然这个想法是错误的,用having子句是用来过滤分组的,即要留下哪个分组或者排除哪个分组,而不是直接得到某一行结果。

正确的sql语句

select id,name,salary form employee group by dept order by salary desc;

最后,再为大家举几个例子。

在SQL HAVING子句用于限制有条件的一个SQL语句的输出,通过一个SQL总在你列的SELECT列表中使用的功能。

不能指定一个SQL凡有人对在SELECT列表哪些SQL聚合函数用于列条款的标准。
例如,下面的SQL语句将产生一个错误:

SELECT Employee, SUM (Hours)
FROM EmployeeHours
WHERE SUM (Hours) > 24
GROUP BY Employee

HAVING子句的SQL是用来做正是这一点,到指定的聚合功能,在您的查询中使用条件:

SELECT Employee, SUM (Hours)
FROM EmployeeHours
GROUP BY Employee
HAVING SUM (Hours) > 24

上面的SQL语句将选择所有员工和他们各自的时间总和,只要这个数字是24以上。
在SQL HAVING子句可以看到如下的输出结果:
Employee Hours
John Smith 25
Tina Crown 27

有关mysql having与group by子句的介绍就是这些了,希望对大家有所帮助。