MySQL HAVING子句返回空集?

时间:2014-08-13 04:01:03

标签: mysql sql

我在下面有一个表格,我需要编写代码来提取预算大于平均预算的行。

+------+-----------------+--------+
| Code | Name            | Budget |
+------+-----------------+--------+
|   14 | IT              |  65000 |
|   37 | Accounting      |  15000 |
|   59 | Human Resources | 240000 |
|   77 | Research        |  55000 |
+------+-----------------+--------+

我知道这有效:

SELECT * FROM Departments WHERE Budget > (SELECT AVG(Budget) FROM Departments);

但这看起来很难看。 This post似乎建议having子句可以将查询简化为:

SELECT * FROM Departments HAVING Budget > AVG(Budget);

但它返回空集。有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

这是因为AVG()是聚合函数,应该使用GROUP BY或其他聚合函数。 如果没有,SELECT将返回单行。例如:

mysql> SELECT * FROM test;
+------+--------+
| code | budget |
+------+--------+
|   14 |  65000 |
|   37 |  15000 |
|   59 | 240000 |
|   77 |  55000 |
+------+--------+
4 rows in set (0.00 sec)

mysql> SELECT code, budget, AVG(budget) FROM test;
+------+--------+-------------+
| code | budget | AVG(budget) |
+------+--------+-------------+
|   14 |  65000 |  93750.0000 | we got one row.
+------+--------+-------------+
1 row in set (0.00 sec)

在这种情况下,HAVING budget > AVG(budget)表示65000 > 93750为false,因此返回空列表。

你的第一次豁免看起来并不像丑陋的' ;)

答案 1 :(得分:1)

在mySQL中,拥有SELECT *的聚合列将仅返回第一行。

SQL Fiddle显示:

SELECT *, AVG(BUDGET) FROM Departments;

将仅返回第一行和所有行的预算平均值。

然后,就像在第一行中,预算小于预算的平均值,它将不会返回任何行。

我相信你的 UGLY (我觉得它不丑)查询是一个很好的解决方案。