我不理解为什么两个查询返回不同值的原因,即为什么在查询的一部分中必须使用聚合函数。每个函数返回什么:
SELECT col1 FROM tbl
HAVING col1 > AVG(col1);
SELECT col1 FROM tbl
HAVING col1 > SELECT(AVG(col1) FROM tbl);
答案 0 :(得分:1)
此查询具有汇总功能:
SELECT col1
FROM tbl
HAVING col1 > AVG(col1);
因此,它是一个没有group by
的聚合查询,它返回一行。问题是:col1
子句中HAVING
的值是什么。
好吧,MySQL已经扩展了SQL以允许这种语法。它从不确定的行中获取col1
的任意值。因此,它可以将col1
的某些值与平均值进行比较。那可能不是您想要的。注意:这种语法在几乎所有其他数据库中都会失败。
第二个查询:
SELECT col1
FROM tbl
HAVING col1 > SELECT(AVG(col1) FROM tbl);
对于外部引用tbl
没有聚合。因此,它使用了另一个MySQL扩展。在这种情况下,HAVING
等效于WHERE
:
SELECT col1
FROM tbl
WHERE col1 > (SELECT AVG(col1) FROM tbl);
(请注意,括号是固定的。)
这就是您想要的。 WHERE
版本可能是您想要的,并且可以在任何数据库中使用。
答案 1 :(得分:0)
在第一个查询中,尽管在语法上在mysql中不会引发错误,但是从逻辑上讲它意味着更少。注意:此查询将通过语法正确在SQL Server中引发错误
SELECT col1 FROM tbl
HAVING col1 > AVG(col1);
第二个查询为子查询中的整个表生成col1的完整平均值,并将该值与col1进行比较
SELECT col1 FROM tbl
HAVING col1 > SELECT(AVG(col1) FROM tbl);
这就是为什么您得到两种不同类型的输出
的原因