可能重复:
SQL:What';HAVING和WHERE有什么区别?
使用having
子句和where
子句有什么区别。谁能详细解释一下吗。
HAVING过滤分组元素,WHERE筛选未分组的元素。
示例1:
SELECT col1, col2 FROM table
WHERE col1 = @id
示例2:
SELECT SUM(col1), col2 FROM table
GROUP BY col2
HAVING SUM(col1) > 10
由于HAVING条件只能在分组发生后的第二个示例中应用,因此无法将其重写为WHERE子句。
示例3:
SELECT SUM(col1), col2 FROM table
WHERE col1 = @id
GROUP BY col2
HAVING SUM(col1) > 10
演示如何同时使用WHERE和HAVING:
表数据首先由col1 = @id
进行过滤然后对过滤后的数据进行分组则分组数据再次被CCD_ 4 过滤
WHERE filters rows before they are grouped in GROUP BY clause
while HAVING filters the aggregate values after GROUP BY takes place
HAVING
指定搜索SELECT
语句中使用的内容。
换句话说。
HAVING
适用于组。
WHERE
适用于行。
没有GROUP BY,没有区别(但HAVING看起来很奇怪)
通过分组
HAVING
用于骨料的测试条件(MAX、SUM、COUNT等)HAVING column = 1
与WHERE column = 1
相同(column
上没有聚合)- 不允许使用
WHERE COUNT(*) = 1
- 允许
HAVING COUNT(*) = 1
Having
用于Sum
等聚合。Where
适用于所有其他情况。
它们为组或聚合指定搜索条件。但区别在于HAVING只能与SELECT语句一起使用。HAVING通常用于GROUP BY子句中。当不使用GROUP BY时,HAVING的行为类似于WHERE子句。Having子句基本上只与查询中的GROUP BY函数一起使用,而WHERE子句在成为查询中GROUP BY函数的一部分之前应用于每一行。
正如其他人已经说过的,have与group by一起使用。原因是执行顺序-在group by之前执行,在之后执行
将其视为过滤发生在哪里的问题。
当您指定where
子句时,您可以将输入行筛选到聚合函数中(即:我只想获得居住在特定城市的人的平均年龄。)当您指定了having
约束时,您指定只想要平均值的某个子集。(我只想看看平均年龄在70岁或以上的城市。)
Having用于聚合函数,例如
SELECT *
FROM foo
GROUP BY baz
HAVING COUNT(*) > 8