为什么以下SQL查询错误?

时间:2013-12-30 20:40:03

标签: mysql sql

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

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

应该是:

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

因为我运行了两个查询,他们给出了完全相同的答案!

5 个答案:

答案 0 :(得分:1)

它应该是:

select [dept name], ID, AVG(salary)
from instructor
group by [dept name]

现在显示表中定义的列会更有启发性,但是你不能在列名中包含空格,而不是用上面的括号括起来。

答案 1 :(得分:1)

MySQL将允许您不在您的组中包含非聚合列,这对我来说是一个可怕的想法。这可能导致一些非常不可预测的结果。这是文档的链接: Clicky!

答案 2 :(得分:1)

从这个特定点MySQL documentation开始:

  

在标准SQL中,包含GROUP BY子句的查询无法引用   选择列表中未在其中命名的非聚合列   GROUP BY子句。例如,此查询在标准SQL中是非法的   因为选择列表中的名称列不会出现在   GROUP BY ......

     

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

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

但是,请注意不完全相同。看看this example

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

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

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

检查this Fiddle

答案 3 :(得分:0)

您的声明“我知道每个非聚合函数必须出现在分组中,如果它出现在select中”是根据我的说法。我不是SQL大师,但这也是我的理解。如果您的语句不符合该条件,我原本期望标记语法错误。但是,如果它给出相同的结果,那么一种可能性是,您在ID字段的所有行中具有相同的值,或者在分组列表中缺少的任何字段。只需检查不同的值,然后查看。此外,明确使用“as”作为别名而不是空白可能会有所帮助。

答案 4 :(得分:0)

MySQL extends the use of GROUP BY因此您可以选择非聚合列,而不是在group by子句中命名:

SELECT   dept_name, ID, avg(salary)
FROM     instructor
GROUP BY dept_name;

以前的查询在MySQL中完全有效,而其他DBMS会因为group by子句中不存在ID而引发错误。

但是,如果每个dept_name都有多个ID,则MySQL返回的ID值将不确定。

您可以将MySQL配置为disable this extension

相关问题