mysql中的聚合函数

d6kp6zgx  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(395)

我理解为什么在查询的having部分必须使用聚合函数,因为我不理解下面两个查询返回不同值的原因,即每个函数返回的是什么:

SELECT col1 FROM tbl
HAVING col1 > AVG(col1);

SELECT col1 FROM tbl
HAVING col1 > SELECT(AVG(col1) FROM tbl);
bwleehnv

bwleehnv1#

此查询具有聚合函数:

SELECT col1
FROM tbl
HAVING col1 > AVG(col1);

因此,它是一个聚合查询,没有 group by 它返回一行。问题是:什么是价值 col1HAVING 条款。
嗯,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 版本可能是您想要的,并将在任何数据库中工作。

sxissh06

sxissh062#

在第一个查询中,虽然mysql在语法上没有抛出错误,但在逻辑上它没有什么意义。note:this query 将在sql server中抛出错误,尽管语法正确

SELECT col1 FROM tbl
    HAVING col1 > AVG(col1);

第二个查询为子查询中的整个表生成col1的完整平均值,并将此值与col1进行比较

SELECT col1 FROM tbl
    HAVING col1 > SELECT(AVG(col1) FROM tbl);

这就是为什么你得到了两种不同类型的输出

相关问题