汇总功能

时间:2018-08-04 09:40:29

标签: mysql sql subquery aggregate-functions having

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

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

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

2 个答案:

答案 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);

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

的原因