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;
我正在与 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;