【问题标题】:MySQL - ERROR 1054 (42S22): Unknown column 'sal' in 'having clause'MySQL - 错误 1054 (42S22):“有子句”中的未知列“sal”
【发布时间】:2016-10-13 04:02:46
【问题描述】:

我需要按部门统计工资高于平均水平的员工人数。

我的员工表:

+------+--------+-----------+------+------------+------+------+--------+
| eno  | ename  | job       | mgr  | hiredate   | sal  | comm | deptno |
+------+--------+-----------+------+------------+------+------+--------+
| 7369 | smith  | clerk     | 7902 | 1980-12-17 |  800 | NULL |     20 |
| 7499 | allen  | salesman  | 7698 | 1981-02-20 | 1600 |  300 |     30 |
| 7521 | ward   | salesman  | 7698 | 1981-02-22 | 1250 |  500 |     30 |
| 7566 | jones  | manager   | 7839 | 1981-04-02 | 2975 | NULL |     20 |
| 7654 | martin | salesman  | 7698 | 1981-10-28 | 1250 | 1400 |     30 |
| 7698 | blake  | manager   | 7839 | 1981-05-01 | 2850 | NULL |     30 |
| 7782 | clark  | manager   | 7839 | 1981-06-09 | 2450 | NULL |     10 |
| 7788 | scott  | analyst   | 7566 | 1982-12-09 | 3000 | NULL |     20 |
| 7839 | king   | president | NULL | 1981-11-17 | 5000 | NULL |     10 |
| 7844 | turner | salesman  | 7698 | 1981-10-08 | 1500 | NULL |     30 |
| 7876 | adams  | clerk     | 7788 | 1983-01-12 | 1100 | NULL |     20 |
| 7900 | james  | clerk     | 7698 | 1981-12-03 |  950 | NULL |     30 |
| 7902 | ford   | analyst   | 7566 | 1981-12-03 | 3000 | NULL |     20 |
| 7934 | miller | clerk     | 7782 | 1982-01-23 | 1300 | NULL |     10 |
+------+--------+-----------+------+------------+------+------+--------+

我正在尝试做的查询是

select deptno, count(*) from emp group by deptno having sal > avg(sal)

那是我得到错误的时候。

我也试过这个查询:

select deptno, count(*), avg(sal) from emp group by deptno

除了没有having子句之外基本相同,并且按预期工作。

-

select deptno, count(*) from emp where sal > avg(sal) group by deptno

此查询引发以下错误:

ERROR 1111 (HY000): Invalid use of group function

-

select deptno, count(*) from emp group by deptno where sal > avg(sal)

而这个使用了不正确的语法:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where sal > avg(sal)' at line 1

-

为什么会出现此错误?执行此查询的正确方法是哪一种?提前致谢。

插入脚本:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

CREATE TABLE IF NOT EXISTS `emp` (
  `eno` int(11) NOT NULL AUTO_INCREMENT,
  `ename` varchar(30) DEFAULT NULL,
  `job` varchar(30) DEFAULT NULL,
  `mgr` int(11) DEFAULT NULL,
  `hiredate` date DEFAULT NULL,
  `sal` int(11) DEFAULT NULL,
  `comm` int(11) DEFAULT NULL,
  `deptno` int(11) DEFAULT NULL,
  PRIMARY KEY (`eno`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10000 ;

INSERT INTO `emp` (`eno`, `ename`, `job`, `mgr`, `hiredate`, `sal`, `comm`, `deptno`) VALUES
(7369, 'smith', 'clerk', 7902, '1980-12-17', 800, NULL, 20),
(7499, 'allen', 'salesman', 7698, '1981-02-20', 1600, 300, 30),
(7521, 'ward', 'salesman', 7698, '1981-02-22', 1250, 500, 30),
(7566, 'jones', 'manager', 7839, '1981-04-02', 2975, NULL, 20),
(7654, 'martin', 'salesman', 7698, '1981-10-28', 1250, 1400, 30),
(7698, 'blake', 'manager', 7839, '1981-05-01', 2850, NULL, 30),
(7782, 'clark', 'manager', 7839, '1981-06-09', 2450, NULL, 10),
(7788, 'scott', 'analyst', 7566, '1982-12-09', 3000, NULL, 20),
(7839, 'king', 'president', NULL, '1981-11-17', 5000, NULL, 10),
(7844, 'turner', 'salesman', 7698, '1981-10-08', 1500, NULL, 30),
(7876, 'adams', 'clerk', 7788, '1983-01-12', 1100, NULL, 20),
(7900, 'james', 'clerk', 7698, '1981-12-03', 950, NULL, 30),
(7902, 'ford', 'analyst', 7566, '1981-12-03', 3000, NULL, 20),
(7934, 'miller', 'clerk', 7782, '1982-01-23', 1300, NULL, 10);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

【问题讨论】:

标签: mysql sql select group-by having


【解决方案1】:

尝试将聚合与表连接

select emp.depnto, count(*) from 
(select deptno,  avg(sal) avgsal from employees group by deptno) avg
INNER JOIN employees emp on avg.deptno = avg.depnto
WHERE emp.sal > avg.avgsal

编辑

也许我觉得很复杂。当整体平均水平的意思时,它只是

select depnto, count(*) from employees
where sal > (select avg(sal) from employees)
group by deptno

【讨论】:

  • 您的第二个解决方案是我一直在寻找的解决方案,但我仍然不知道为什么它不能使用“where sal > avg(sal)”并且它在其中使用另一个查询.如果您能解决这个问题,我将不胜感激。不过感谢您的解决方案。
  • 在 where 子句中您不能使用 avg 因为单行上有范围,稍后聚合将起作用。在 Have 子句中,范围是组,因此您只能访问表列和分组列上的聚合函数。因此,如果您想要不在行范围内的值(在有子句中的组)考虑它,则必须使用子选择:聚合的值决定了要聚合的行,这如何工作?
  • 你说得对,我从来没有这样想过。非常感谢您的见解,这真的很有帮助。再次感谢您的解决方案。
【解决方案2】:

没有必要使用 HAVING。试试 WHERE:

select deptno, count(*) from emp WHERE sal > avg(sal) group by deptno 

【讨论】:

  • 不起作用,我认为where子句必须在group by之前。您的查询抛出此错误:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where sal > avg(sal)' at line 1.
  • 如果您能解释一下何时使用Having 反对Where,我认为这会改善您的答案?
  • OH 抱歉 select deptno, count(*) from emp WHERE sal > avg(sal) group by deptno
  • @VanyaAvchyan 编辑您的答案,而不是发布更正的 cmets :-)
  • 也不起作用。 ERROR 1111 (HY000): Invalid use of group function
【解决方案3】:

你前面有逗号

select deptno, count(*) 
from emp 
group by deptno having sal >  (select avg(sal)from emp);

【讨论】:

  • 这是 Stack Overflow 上的打字错误,我的错;查询仍然不起作用。不过感谢您的关注。
  • 我已经更新了答案 -.- 提出了一个建议 .. 以及为什么不赞成 .. 答案是正确的
  • 我没有投反对票,我不知道为什么有人会投反对票。对此感到抱歉。
  • 有时有人......不回答..不评论但不投票..如果建议有用,请告诉我
  • 完全相同的错误:ERROR 1054 (42S22): Unknown column 'sal' in 'having clause'
【解决方案4】:

试试这个

SELECT deptno as Department , count(eno) as employeeCount from emp
where sal > (select avg(sal) from emp ) group by deptno

【讨论】:

  • ERROR 1242 (21000): Subquery returns more than 1 row
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 2023-03-20
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多