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

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

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

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


当前回答

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

然而,当使用GROUP BY时:

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

其他回答

在聚合查询中(使用聚合函数的任何查询),Where子句中的谓词在生成聚合中间结果集之前求值,

Having子句中的谓词在聚合结果集生成后应用于聚合结果集。这就是为什么聚合值的谓词条件必须放在Having子句中,而不是放在Where子句中,以及为什么可以在Having子句中使用Select子句中定义的别名,而不能在Where子句中使用。

HAVING在使用聚合(例如GROUP BY)时使用。

SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;

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 BY不使用时,WHERE和HAVING子句本质上是等价的。

然而,当使用GROUP BY时:

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

来自这里的资源

从这里。

SQL标准要求HAVING 中的列必须只引用 中使用的GROUP BY子句或列 聚合函数

而不是应用于数据库行的WHERE子句