让我们把GROUP BY
放在一边。在普通查询中(没有GROUP BY
),语义差异是什么?为什么this answer有效? (在HAVING
子句中添加别名而不是WHERE
)
答案 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
子句中的语句只能引用查询生成的数据。