不带聚合的 HAVING 条件是否始终与 WHERE 完全相同?

问题描述 投票:0回答:2

我最近在 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
键列,乍一看似乎它无法过滤掉任何会改变查询最终结果的内容。但我是否遗漏了任何可能性?

sql postgresql
2个回答
0
投票

结果将是相同的 - 所以你可能会说它“语义上”是相同的。 但是除非 DBMS 有非常聪明的优化器,否则在分组列上使用 HAVING 会浪费资源:

在此查询中(重新格式化您的查询):

SELECT b , c FROM test_having GROUP BY b, c HAVING b = 3 ORDER BY b, c;

如果 
    b
  • 可以假设一百万个值,那么查询很可能会将 999,999 个桶分组太多,最后只会丢弃它们;如果您在
    WHERE
    之前使用
    GROUP BY
    进行过滤,则不会。
  • ORDER BY b, c
  • 是浪费时间;如何对结果行进行排序?
    
        

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.