为什么这个查询适用于HAVING而不适用于WHERE(没有GROUP BY)

时间:2013-06-08 15:55:48

标签: mysql sql

在下面的查询中,我使用xy作为二维平面中对象的坐标,并尝试将结果限制为仅在半径范围内的对象来自原产地的80个单位。

SELECT *,POW(x - 0,2) + POW(y - 0,2) AS distanceSquared
FROM objects

WHERE distanceSquared < 6400

此处的查询由于某种原因不起作用,而mysql说unknown column distanceSquared in where clause。但是,当我用WHERE替换HAVING时,它的效果非常好。为什么?据我所知,HAVING仅适用于在分组后使用聚合功能的列。

1 个答案:

答案 0 :(得分:3)

变量distanceSquaredselect语句中定义。

where条款不知道这些变量,但having条款可以。

如果没有group byhaving就像MySQL中的where子句一样。

这在MySQL中似乎是一种相当普遍的做法。您也可以将其表达为:

select o.*
from (SELECT *,POW(x - 0,2) + POW(y - 0,2) AS distanceSquared
      FROM objects
     ) o
WHERE distanceSquared < 6400;

但是,在MySQL中,子查询是实例化的,这意味着实际创建并保存了数据。这使得这样的查询性能低于没有子查询的性能。大多数其他数据库都会正确地优化它,并且不会有性能损失。

使用having子句而不使用group by也是MySQL扩展。该查询应该被解释为将返回一行的聚合查询。然后,having子句将对该聚合进行操作。