have子句和where子句用法的区别



可能重复:
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 = 1WHERE 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

最新更新