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