我最近在 PostgreSQL 测试套件中遇到了一个有趣的评论 :
-- HAVING is effectively equivalent to WHERE in this case
SELECT b, c FROM test_having
GROUP BY b, c HAVING b = 3 ORDER BY b, c;
这让我思考。当
HAVING
子句(或子子句)引用非聚合值时,它在功能上是否始终与 WHERE
完全相同?有没有事实并非如此的情况?鉴于唯一有效出现在 HAVING
子句中的非聚合引用是 GROUP BY
键列,乍一看似乎它无法过滤掉任何会改变查询最终结果的内容。但我是否遗漏了任何可能性?
结果将是相同的 - 所以你可能会说它“语义上”是相同的。 但是除非 DBMS 有非常聪明的优化器,否则在分组列上使用 HAVING 会浪费资源:
在此查询中(重新格式化您的查询):
SELECT
b
, c
FROM test_having
GROUP BY b, c
HAVING b = 3
ORDER BY b, c;
b
WHERE
之前使用 GROUP BY
进行过滤,则不会。ORDER BY b, c