WHERE和HAVING之间的语义差异是什么?

时间:2010-11-27 09:52:15

标签: sql mysql database having

让我们把GROUP BY放在一边。在普通查询中(没有GROUP BY),语义差异是什么?为什么this answer有效? (在HAVING子句中添加别名而不是WHERE

3 个答案:

答案 0 :(得分:3)

HAVING对汇总行进行操作 - WHERE在应用GROUP BY之前在整个表格上运行。 (您不能将GROUP BY放在一边,HAVING是保留用于GROUP BY的子句 - 忽略GROUP BY不会改变后面发生的隐式操作场景)。

同样重要的是要注意,因此,WHERE可以使用索引而HAVING则不能。 (在超平凡的未分组结果集中,理论上你可以使用HAVING的索引,但我从未见过以这种方式实际实现的查询优化器。)

答案 1 :(得分:2)

MySQL评估查询,包括WHERE子句,然后使用HAVING子句对其进行过滤。这就是HAVING可以识别列别名的原因,而WHERE则不能。

通过省略GROUP BY条款,我相信您只是告诉查询不要将任何结果分组。

答案 2 :(得分:1)

非常广泛地,WHERE过滤进入查询的数据(数据库表),而HAVING过滤查询的输出。

WHERE子句中的语句只能引用表(和其他外部数据源),而HAVING子句中的语句只能引用查询生成的数据。