我在下面有一个表格,我需要编写代码来提取预算大于平均预算的行。
+------+-----------------+--------+
| 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);
但它返回空集。有什么想法吗?
由于
答案 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 (我觉得它不丑)查询是一个很好的解决方案。