0

在以下查询中,我使用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仅适用于在 group by 之后使用了聚合函数的列。

4

1 回答 1

3

变量distanceSquaredselect语句中定义。

where子句不知道这些变量,但having子句知道。

没有 no group byhavingjust 的行为就像whereMySQL 中的一个子句。

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

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

然而,在 MySQL 中,子查询是实例化的,这意味着数据实际上是创建和保存的。这使得这样的查询比没有子查询的查询性能低。大多数其他数据库会正确优化这一点,并且不会影响性能。

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

于 2013-06-08T16:00:43.623 回答