mysql分组统计having_mysql group by和having实例详解

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子句的介绍就是这些了,希望对大家有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值