Mysql 为什么下面的SQL查询是错误的?

Mysql 为什么下面的SQL查询是错误的?,mysql,sql,Mysql,Sql,我知道,如果每个非聚合函数出现在select中,则它必须出现在group by中。然而,这个查询仍然在mySQL中运行 如果是: /* erroneous query */ select dept name, ID, avg (salary) from instructor group by dept name; 因为我运行了两个查询,它们给出了完全相同的答案 应该是: /* erroneous query */ select dept name, ID, avg (salary) from

我知道,如果每个非聚合函数出现在select中,则它必须出现在group by中。然而,这个查询仍然在mySQL中运行

如果是:

/* erroneous query */
select dept name, ID, avg (salary)
from instructor
group by dept name;
因为我运行了两个查询,它们给出了完全相同的答案

应该是:

/* erroneous query */
select dept name, ID, avg (salary)
from instructor
group by dept name, **ID**;

现在,显示表中定义的列更具指导意义,但如果列不被包装在括号中,列名中就不能有空格。我在上面做过这样的操作。

您的陈述“我知道,如果每个非聚合函数出现在select中,它必须出现在group by中”,我认为是正确的。我不是SQL大师,但这也是我的理解。如果您的语句不满足该条件,我希望会标记语法错误。但是,如果它给出相同的结果,那么唯一的可能是ID字段或group by列表中缺少的任何字段的所有行中都有相同的值。只需检查不同的值即可。此外,明确地将“as”用作别名而不是空格可能会有所帮助

MySQL将允许您在分组中不包含非聚合列,这对我来说是个糟糕的主意。这可能会导致一些非常不可预测的结果。以下是文档的链接:

在这一点上:

在标准SQL中,包含GROUPBY子句的查询不能引用 选择列表中未在中命名的非聚合列 按子句分组。例如,此查询在标准SQL中是非法的 因为“选择”列表中的“名称”列不显示在 分组方式

MySQL扩展了GROUPBY的使用,以便选择列表可以引用 GROUP BY子句中未命名的未聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序和 分组。但是,这主要是在每个 未在GROUP BY中命名的未聚合列对于每个列都是相同的 小组

粗略地说,省略的列会自动添加

但是,请注意,并不完全相同。看一看

可能会给你一些不同的东西,比如:

SELECT name, address, MAX(age) FROM customers GROUP BY name, address;
选中。

MySQL,以便您可以选择在group by子句中未命名的非聚集列:

SELECT name, address, MAX(age) FROM customers GROUP BY name;
前面的查询在MySQL中是完全有效的,而其他DBMS将出现错误,因为GROUPBY子句中不存在ID

但是,如果每个部门名称有多个ID,MySQL返回的ID值将不确定


您可以将MySQL配置为。

部门名称(?)是否唯一?可能是因为按unqiue名称分组和按ID分组是相同的……我强烈建议您不要在列名中使用空格。这是没有好处的。而不是必须将所有查询都括起来以确保它们不会中断。你应该做的是用大写字母来写东西<代码>部门名称例如,易于阅读而不会弄乱数据库。对不起,我本来想写部门名称的。我只是想知道为什么ID需要被放入group by和dept_name中,因为信息的分组依据是dept_name?分组时,SELECT中的每一列都必须在group子句或集合中。想想看……好吧,SQLServer就是这样。如果MySQL中不是这样的话(即使它没有意义)然后,您不需要将ID放入GROUPOk,但通常情况下,即使ID etc被放入组中,它也是第一个函数,例如,在组中声明的dept_name,数据将被分组?@Andrew您可能不需要在mysql中进行分组,但是这不会使查询的逻辑中断更少,即使它不会引发错误。
SELECT name, address, MAX(age) FROM customers GROUP BY name;
SELECT   dept_name, ID, avg(salary)
FROM     instructor
GROUP BY dept_name;