在SQL SELECT语句中,HAVING和WHERE的区别是什么?

编辑:我已经把Steven的答案标记为正确答案,因为它包含了链接上的关键信息:

当GROUP BY没有被使用时,HAVING就像一个WHERE子句

我在WHERE中看到的情况没有GROUP BY,这就是我的困惑开始的地方。当然,在你知道这一点之前,你不能在问题中指定它。


当前回答

HAVING子句被添加到SQL中,因为WHERE关键字不能用于聚合函数。

查看w3schools链接获取更多信息

语法:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value

这样的查询:

SELECT column_name, COUNT( column_name ) AS column_name_tally
  FROM table_name
 WHERE column_name < 3
 GROUP 
    BY column_name
HAVING COUNT( column_name ) >= 3;

...可以使用派生表重写(并省略HAVING),如下所示:

SELECT column_name, column_name_tally
  FROM (
        SELECT column_name, COUNT(column_name) AS column_name_tally
          FROM table_name
         WHERE column_name < 3
         GROUP 
            BY column_name
       ) pointless_range_variable_required_here
 WHERE column_name_tally >= 3;

其他回答

的搜索条件 group或在SELECT语句中使用的聚合函数。

WHERE和HAVING子句的区别:

WHERE子句和HAVING子句之间的主要区别是,WHERE用于行操作,HAVING用于列操作。

为什么我们需要HAVING从句?

我们知道,聚合函数只能在列上执行,所以不能在WHERE子句中使用聚合函数。因此,我们在HAVING子句中使用聚合函数。

WHERE子句用于比较基表中的值,而HAVING子句可用于过滤查询结果集中的聚合函数的结果 点击这里!

当GROUP BY不使用时,WHERE和HAVING子句本质上是等价的。

然而,当使用GROUP BY时:

WHERE子句用于从结果中筛选记录。的 在进行任何分组之前进行筛选。 HAVING从句是 用于从一个组中过滤值(即,检查后的条件 已经执行了分组聚合)。

WHERE子句不适用于聚合函数 意思是:你不应该这样使用 附赠:表名

SELECT name  
FROM bonus  
GROUP BY name  
WHERE sum(salary) > 200  

不要用WHERE从句,而要用HAVING..

如果不使用GROUP BY子句,HAVING子句就相当于WHERE子句

SELECT name  
FROM bonus  
GROUP BY name  
HAVING sum(salary) > 200