SQL Server提供了多种对数据进行过滤的方式,包括where、having等。虽然它们都能够实现类似的功能,但是你知道它们之间的区别吗?让我们共同探究一下吧。

一、使用场景不同

  • where可以用于select、update、delete和insert…into语句中。
  • having只能用于select语句中。
  • having子句对 group by 子句设置条件的方式与 where 和 select 的交互方式类似。where 搜索条件在进行分组操作之前应用;而 having 搜索条件在进行分组操作之后应用。
  • having 语法与 where 语法类似,但 having 可以包含聚合函数。having 子句可以引用选择列表中显示的任意项。

二、子句有区别

1、where子句

  • where子句中的条件表达式having都可以跟,而having子句中的有些表达式where不可以跟。
  • having子句可以用聚合函数(sum、count、avg、max和min),而where子句不可以。

2、having子句

  • having是先分组再筛选记录,where在聚合前先筛选记录,也就是说作用在group by子句和having子句前。
  • 而 having子句在聚合后对组记录进行筛选。

三、作用对象不同

  • where子句作用于表和视图,having 子句作用于组。
  • where在分组和聚集运算之前选取输入行(因此,它控制哪些行进入聚集运算),而 having在分组和聚集之后选取分组的行。
  • 因此,where 子句不能包含聚集函数;因为视图用聚集函数判断那些行输入给聚集运算是没有意义的。
  • 相反,having子句总是包含聚集函数。(严格说来,你可以写不使用聚集的 having 子句, 但这样做只是白费劲。同样的条件可以更有效地用于 where 阶段)

四、区别总结

  • having是在分组后对数据进行过滤。
  • where是在分组前对数据进行过滤。
  • having后面可以使用聚合函数。
  • where后面不可以使用聚合。

在查询过程中执行顺序:from>where>group by(含聚合)>having>order>select

所以聚合语句(sum,min,max,avg,count)要比having子句优先执行,而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。

五、例题分析

//一、显示每个地区的总人口数和总面积:
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(population)>1000000
//注:在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
//相反,HAVING子句可以让我们筛选成组后的各组数据。
//如果想根据sum后的字段进行排序可以在后面加上:order by sum(population) desc/asc
  • where语句在group by语句之前;SQL会在分组之前计算where语句。
  • having语句在group by语句之后;SQL会在分组之后计算having语句。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐