现在,我的问题是这两个查询是否具有不同的性能特征:
没有
SELECT x + y AS z, t.* FROM t
WHERE
x = 1 and
x+y = 2
有
SELECT x + y AS z, t.* FROM t
WHERE
x = 1
HAVING
z = 2
是的,它应该有所不同 - (1) 预计会更快。
拥有将确保首先运行主查询,然后应用拥有过滤器 - 所以它基本上适用于(查询减去拥有)返回的数据集。
第一个查询应该更可取,因为它根本不选择那些记录。
HAVING 用于包含 GROUP BY 或返回包含聚合函数结果的单行的查询。例如SELECT SUM(scores) FROM t HAVING SUM(scores) > 100
返回一行,或者根本没有行。
SQL 标准认为第二个查询无效,并且不被某些数据库系统接受。