Sql WHERE和have在语义上有什么区别?

Sql WHERE和have在语义上有什么区别?,sql,mysql,database,having,Sql,Mysql,Database,Having,让我们把GROUP BY放在一边一秒钟。在正常查询中(没有groupby),语义上的区别是什么?为什么它能工作?(将别名放在HAVING子句中,而不是WHERE)HAVING对汇总行进行操作-其中在应用GROUP BY之前对整个表进行操作。(您不能将分组依据放在一边,HAVING是一个保留用于分组依据的子句-省略分组依据不会改变幕后发生的隐式动作) 还需要注意的是,正因为如此,WHERE可以使用索引,而have不能。(在超普通的未分组的结果集中,理论上可以使用索引作为HAVING,但我从未见过实

让我们把
GROUP BY
放在一边一秒钟。在正常查询中(没有
groupby
),语义上的区别是什么?为什么它能工作?(将别名放在
HAVING
子句中,而不是
WHERE

HAVING
对汇总行进行操作-
其中
在应用
GROUP BY
之前对整个表进行操作。(您不能将
分组依据
放在一边,
HAVING
是一个保留用于
分组依据
的子句-省略
分组依据
不会改变幕后发生的隐式动作)


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

HAVING
对汇总行进行操作-
其中在应用
groupby
之前,
对整个表进行操作。(您不能将
分组依据
放在一边,
HAVING
是一个保留用于
分组依据
的子句-省略
分组依据
不会改变幕后发生的隐式动作)


还需要注意的是,正因为如此,
WHERE
可以使用索引,而
have
不能。(在超普通的未分组结果集中,理论上可以使用索引来表示
HAVING
,但我从未见过真正以这种方式实现的查询优化器)。

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


通过省略
GROUP By
子句,我相信您可以简单地告诉查询不要对任何结果进行分组。

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


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

非常广泛地说,
其中
过滤进入查询的数据(DB表),而
具有
过滤查询的输出


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

非常广泛地说,
WHERE
过滤进入查询的数据(DB表),而
have
则过滤查询的输出


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

这不是语义差异(或者至少我不理解这个语义)。这听起来像是一个实现细节。这不是语义上的区别(或者至少,我不理解这个语义)。这听起来像是一个实现细节。@ripper234:如果您查看该查询的查询分析器,以及一个分组查询,您会注意到它们奇怪地完全相同(除了加载实际的表达式值)-您仍在支付分组的“罚款”-O(n)迭代结果集中的每个元素以应用HAVING子句。@ripper234:不需要group by是group by运算符的MySQL扩展,相当于使用group by和非聚合列的子集。看看这篇文章,它解释了如果你有一个“部分”组,后面会发生什么:谢谢你提供的信息。现在看看这个相关的问题:@ripper234:如果你查看查询分析器中的查询和分组查询,你会发现它们奇怪地完全相同(除了加载实际的表达式值)-你仍然在支付分组的“罚款”-O(n)迭代结果集中的每个元素以应用HAVING子句。@ripper234:不需要group by是group by运算符的MySQL扩展,相当于使用group by和非聚合列的子集。看看这篇文章,它解释了如果你有一个“部分”组,后面会发生什么:谢谢你提供的信息。现在看看这个相关的问题: