SQL 查询性能 - SELECT 和 WHERE 中的相同计算

SQL query performance - same calculation in SELECT and WHERE

我正在与 MySQL 合作。假设我有一个 table test(id, x)——数据类型并不重要——以及以下查询

SELECT id
FROM test
WHERE F(x) <= 1000;

此外,我们假设 F 是一个 "more or less complex" 函数。现在,如果我将查询更改为:

会有什么影响
SELECT id, F(x)
FROM test
WHERE F(x) <= 1000;

也就是说,我不仅需要 F(x) 的结果用于 WHERE 条件,还需要作为 SELECT 子句中的输出。我可以安全地假设 MySQL 足够聪明,每行只计算一次吗?

(如果需要信息,在我的具体情况下,我使用 MySQL 空间函数 ST_WITHIN、ST_GEOMFROMTEXT 等处理地理坐标)

聚合不能用在 WHERE 中,而是用在 HAVING 中。并且您需要添加一个 GROUP BY 子句。

SELECT id, F(x) as fx
FROM test
HAVING fx <= 1000;

如果条件引用聚合函数,请将该条件放在 HAVING 子句中。否则,使用 WHERE 子句。

您可以使用 HAVING,但建议您使用 GROUP BY。

SQL标准说WHERE在返回行之前限制结果集,HAVING在带完所有行之后限制结果集。所以 WHERE 更快。

我认为使用派生的 table 是一个很好的解决方案:

SELECT t1.id, t1.res
FROM (
  SELECT id, F(x) as res
  FROM test
) AS t1
WHERE t1.res <= 1000;