在下面的查询中,我使用x
和y
作为二维平面中对象的坐标,并尝试将结果限制为仅在半径范围内的对象来自原产地的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
仅适用于在分组后使用聚合功能的列。
答案 0 :(得分:3)
变量distanceSquared
在select
语句中定义。
where
条款不知道这些变量,但having
条款可以。
如果没有group by
,having
就像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
子句将对该聚合进行操作。