having的⽤法以及与where区别介绍
having⼦句可以让我们筛选成组后的各种数据,having⼦句在查询过程中慢于聚合语句(sum,min,max,avg,count).⽽where⼦句在查询过程中则快于聚合语句(sum,min,max,avg,count)。
SQL实例:
复制代码代码如下:
SELECT region, SUM(population), SUM(area) FROM bbc GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字⾯含义。分完组后,然后⽤聚合函数对每组中
的不同字段(⼀或多条记录)作运算。
复制代码代码如下:
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在这⾥,我们不能⽤where来筛选超过1000000的地区,因为表中不存在这样⼀条记录。
mysql中的where和having⼦句都可以实现过滤记录的功能,但他们的⽤法还是有⼀些区别的,看⼀例⼦:
⽤group by和having⼦句联合来查出不重复的记录,sql如下:
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email
然后看这个,就容易理解了
select uid,email,count(*) as ct from `edm_user081217` GROUP BY email HAVING ct > 1
先⽤group by 对email进⾏分组,在⽤having来过滤⼤于1的,这样查出来的就是重复的记录了.
Select city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
作⽤的对象不同。WHERE ⼦句作⽤于表和视图,HAVING ⼦句作⽤于组。
WHERE 在分组和聚集计算之前选取输⼊⾏(因此,它控制哪些⾏进⼊聚集计算),⽽ HAVING 在分组和聚集之后选取分组的⾏。因此,WHERE ⼦句不能包含聚集函数;因为试图⽤聚集函数判断那些⾏输⼊给聚集运算是没有意义的。相
反,HAVING ⼦句总是包含聚集函数。(严格说来,你可以写不使⽤聚集的 HAVING ⼦句,但这样做只是⽩费劲。同样的条件可以更有效地⽤于 WHERE 阶段。)
在前⾯的例⼦⾥,我们可以在 WHERE ⾥应⽤城市名称限制,因为它不需要聚集。这样⽐在 HAVING ⾥增加限制更加⾼效,因为我们避免了为那些未通过 WHERE 检查的⾏进⾏分组和聚集计算
having⼀般跟在group by之后,执⾏记录组选择的⼀部分来⼯作的。
where则是执⾏所有数据来⼯作的。
group by的用法及原理详解再者having可以⽤聚合函数,如having sum(qty)>1000