使用SQL时,还不懂having和where的区别?你要的全都在这里!

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语句。
在编写SQL分组查询语句,正确地结合使用WHERE子句HAVING子句是进行数据筛选的关键。WHERE子句主要用于过滤行,即在数据分组前对数据集进行约束,而HAVING子句则用于在数据分组后对分组结果进行约束。 参考资源链接:[SQL查询教程:HAVING子句在数据筛选中的应用](https://wenku.csdn.net/doc/ge1mdokhrd?spm=1055.2569.3001.10343) 举个例子,假设我们有一个名为`sales`的销售数据表,其中包含`salesperson`(销售员)`amount`(销售额)两个字段。我们想要找出销售额超过平均值的销售员。 首先,我们需要计算所有销售的总金额销售员的数量,然后用这些信息来确定平均销售额。接下来,我们可以使用`GROUP BY`对销售员进行分组,并用`HAVING`子句筛选出那些销售总额高于平均值的销售员。 下面是具体的SQL查询示例: ```sql SELECT salesperson, SUM(amount) AS total_sales FROM sales GROUP BY salesperson HAVING SUM(amount) > (SELECT AVG(amount) FROM sales); ``` 在这个查询中,我们没有使用WHERE子句,因为我们的目标是在分组后筛选出满足条件的销售员。如果我们想要在分组前就对数据进行过滤,比如只考虑销售额超过1000的记录,我们则需要在`GROUP BY`之前使用WHERE子句,如下所示: ```sql SELECT salesperson, SUM(amount) AS total_sales FROM sales WHERE amount > 1000 GROUP BY salesperson HAVING SUM(amount) > (SELECT AVG(amount) FROM sales WHERE amount > 1000); ``` 在上述查询中,WHERE子句在数据分组前过滤出所有销售额超过1000的记录。之后,HAVING子句在分组后的结果上进一步筛选出那些总销售额超过平均值的销售员。 掌握如何结合WHERE子句HAVING子句,能够让你在编写SQL查询更加灵活高效。为了深入理解这一概念并掌握更多相关知识,我建议阅读《SQL查询教程:HAVING子句在数据筛选中的应用》。这本书详细讲解了HAVING子句的使用场景技巧,同也涵盖了WHERE子句与HAVING子句的区别,是数据库管理员开发人员提升SQL查询技能不可或缺的资源。 参考资源链接:[SQL查询教程:HAVING子句在数据筛选中的应用](https://wenku.csdn.net/doc/ge1mdokhrd?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值