1

让我们先GROUP BY搁置一会。在普通查询中(没有GROUP BY),语义上的区别是什么?为什么这个答案有效?(在子句中放置别名HAVING而不是WHERE

4

3 回答 3

3

HAVING对汇总行WHERE进行操作 - 在应用之前对整个表进行操作GROUP BY。(你不能把它放在GROUP BY一边,HAVING是一个保留使用的子句GROUP BY- 省略GROUP BY不会改变幕后发生的隐含动作)。

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

于 2010-11-27T09:58:17.237 回答
2

MySQL 评估查询直到并包括WHERE子句,然后用HAVING子句过滤它。这就是为什么HAVING可以识别列别名,而WHERE不能。

通过省略该GROUP BY子句,我相信您只是告诉查询不要对您的任何结果进行分组。

于 2010-11-27T09:59:07.357 回答
1

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

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

于 2010-11-27T10:20:53.220 回答