因此,它是一个聚合查询,没有 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 版本可能是您想要的,并将在任何数据库中工作。
2条答案
按热度按时间bwleehnv1#
此查询具有聚合函数:
因此,它是一个聚合查询,没有
group by
它返回一行。问题是:什么是价值col1
在HAVING
条款。嗯,mysql已经扩展了sql以允许这种语法。它取任意值
col1
从一个不确定的行。所以,它任意比较col1
达到平均水平。那可能不是你想要的。注意:这种语法在几乎任何其他数据库中都会失败。第二个查询:
没有外部引用的聚合
tbl
. 因此,它使用了不同的mysql扩展。在这种情况下HAVING
相当于WHERE
:(请注意,括号是固定的。)
这就是你想要的。这个
WHERE
版本可能是您想要的,并将在任何数据库中工作。sxissh062#
在第一个查询中,虽然mysql在语法上没有抛出错误,但在逻辑上它没有什么意义。note:this query 将在sql server中抛出错误,尽管语法正确
第二个查询为子查询中的整个表生成col1的完整平均值,并将此值与col1进行比较
这就是为什么你得到了两种不同类型的输出