好吧,我正在学习,bit由bit,关于什么HAVING
意味着什么。HAVING在别名之间是否存在性能差异vs不使用HAVING
现在,我的问题是,如果这两个查询有区别的性能特点:
无需
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
好吧,我正在学习,bit由bit,关于什么HAVING
意味着什么。HAVING在别名之间是否存在性能差异vs不使用HAVING
现在,我的问题是,如果这两个查询有区别的性能特点:
无需
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)预计会更快。
确保首先运行主查询,然后应用过滤器 - 因此它基本上可以处理由(query minus having)返回的数据集。
第一个查询应该更可取,因为它根本不会选择这些记录。
HAVING用于包含GROUP BY或返回包含聚集函数结果的单个行的查询。例如,SELECT SUM(scores) FROM t HAVING SUM(scores) > 100
可以返回一行,也可以不返回任何一行。
SQL标准认为第二个查询无效,并且某些数据库系统不接受第二个查询。
如果这是真的,那么我再次被问到为什么我不能在where子句中使用别名。这是某人(MySQL的作者?)的设计决定,这迫使我写更复杂的查询或失去性能。 – ripper234 2010-11-27 12:17:04
返回结果集后分配别名。这就是为什么他们可以使用条款但不在where条款中。在SQL服务器中,您可以使用派生列,但我不知道Mysql中有任何此类选项。 – 2010-11-27 12:24:48