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

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

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

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


当前回答

WHERE用于对SQL返回的集合进行限制;它使用SQL内置的集合操作和索引,因此是过滤结果集的最快方式。尽可能使用WHERE。

have对于某些聚合过滤器是必要的。它在sql检索、组装和排序结果之后过滤查询。因此,它比WHERE慢得多,应该避免,除非在需要它的情况下。

SQL Server将允许您使用HAVING,即使WHERE更快。不要这样做。

其他回答

我遇到了一个问题,并发现了WHERE和HAVING之间的另一个区别。它对索引列的作用不同。

WHERE my_indexed_row = 123将显示行,并自动对其他索引行执行“ORDER ASC”。

HAVING my_indexed_row = 123显示从最老的“插入”行到最新的行,没有顺序。

我使用HAVING来约束基于聚合函数结果的查询。例如:select * in blahblahblah group by SOMETHING having count(SOMETHING)>0

从这里。

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

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

WHERE和HAVING子句的区别:

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

为什么我们需要HAVING从句?

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

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;