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和非聚合列的子集。看看这篇文章,它解释了如果你有一个“部分”组,后面会发生什么:谢谢你提供的信息。现在看看这个相关的问题: