mysql中having语句与where语句的用法与区别

转自 http://www.phpzixue.cn/detail338.shtml && http://www.enet.com.cn/article/2006/1123/A20061123303665.shtml && http://sqlzoo.cn/1_1.htm


在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上

SELECT SUM(population) FROM bbc 

这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有国家的总人口数。 

通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用(用另一句话来说明,即GROUP BY 必须由聚类函数配合使用;但是聚类函数并不需要GROUP BY配合,可单独使用)。 当你指定 GROUP BY region 时, 属于同一个region(地区)的一组数据将只能返回一行值. 也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值. 

HAVING子句可以让我们筛选成组后的各组数据. WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前. 而 HAVING子句在聚合后对组记录进行筛选。 

bbc表的部分记录

name region area population gdp
Yemen Middle East 536869 21500000 12255000000
Zambia Africa 752614 11000000 4950000000
Zimbabwe Africa 390759 12900000 6192000000

让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句,还采用第三节介绍的bbc表。 

SQL实例: 
一、显示每个地区的总人口数和总面积. 

SELECT region, SUM(population), SUM(area) 
FROM bbc 
GROUP BY region 

先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中 
的不同字段(一或多条记录)作运算。 

二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。 
SELECT region, SUM(population), SUM(area) 
FROM bbc 
GROUP BY region 
HAVING SUM(area)>1000000 

在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。 
相反,HAVING子句可以让我们筛选成组后的各组数据


====================================================================================================================================


我们在写sql语句的时候,经常会使用where语句,很少会用到having,其实在mysql中having子句也是设定条件的语句与where有相似之处但也有区别。 having子句在查询过程中慢于聚合语句(sum,min,max,avg,count).而where子句在查询过程中则快于聚合语句(sum,min,max,avg,count)。 
简单说来: 

where子句: 
select sum(num) as rmb from order where id>10 

//只有先查询出id大于10的记录才能进行聚合语句 

having子句: 
select reportsto as manager, count(*) as reports from employees 
group by reportsto having count(*) > 4 

以test库为例.having条件表达示为聚合语句。肯定的说having子句查询过程慢于聚合语句。 再换句说话说把上面的having换成where则会出错。统计分组数据时用到聚合语句。对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。 having就是来弥补where在分组数据判断时的不足。因为where要快于聚合语句。

你可能感兴趣的:(数据库/存储)