GROUP BY在运行以下操作时不起作用:SELECT jobtitle,salary,COUNT(*)FROM emp



在为sql查询创建测试数据库和表后,我从教程中看到以下内容应该会显示表,但在运行时出现错误:

SELECT jobtitle, salary, COUNT(*) FROM employees GROUP BY salary;

错误1055(42000(:SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列"company.employees.name",该列在功能上不依赖于GROUP BY子句的列;这与sql_mode=only_full_group_by 不兼容

当我删除职务时,情况并非如此

为什么在运行我的查询时,jobtitle不是group by的有效表达式?

历史上,mysql与大多数其他sql服务器不同,在使用groupby时允许选择任意字段。在您的示例中,jobtitle将从某个任意的employees行返回,用于返回的工资。在两次查询之间,并不能保证给定的工资是相同的。

由于这是一个常见的错误来源,mysql已经不再允许这样做了,首先允许选择更严格的验证,然后将其作为默认值。这是由SQL_MODE系统变量控制的。通过在查询之前执行set session sql_mode=replace(@@sql_mode,'ONLY_FULL_GROUP_BY','');,可以恢复到旧的、糟糕的方式。

但最好遵守更严格的规则。你可以明确地告诉你的查询如何为每个薪水找到一个非任意的职位,比如:

SELECT MIN(jobtitle) AS jobtitle, salary, COUNT(*) FROM employees GROUP BY salary;

SELECT MAX(jobtitle) AS jobtitle, salary, COUNT(*) FROM employees GROUP BY salary;

或者,您可以简单地按两者进行分组,当某个工资有多个职称时,可能会为该工资返回多行:

SELECT jobtitle, salary, COUNT(*) FROM employees GROUP BY salary, jobtitle;

在查询中编写GROUPBY子句时需要注意的一件重要事情是:

  1. 只有出现在GROUPBY中的属性才能与SELECT关键字一起使用
  2. 聚合函数,如count、min、max、avg等。可以在SELECT关键字之后使用

因此,正确的查询将是,

从员工中选择职务、薪水、计数(*(按薪水、职务分组;

您的group by子句必须包含您在具有聚合函数的select语句中添加的所有属性。

所以你的查询应该是

SELECT jobtitle, salary, COUNT(*) FROM employees GROUP BY salary,jobtitle;

最新更新