SQL 意外 return

SQL unexpected return

所以基本上,我有一个简单的数据库,只有一个 table(它是一个测试数据库)。 table 有 4 列:

我想做的很简单(这就是我请求你帮助的原因):我想获得 nameaverage 平均分最高的学生。

我尝试了什么:

SELECT nom, MAX(avg) 
    FROM ( 
        SELECT nom, (noteOrale + noteEcrit)/2 as avg 
        FROM etudiant 
        GROUP BY nom) AS Table; 

尝试此查询后,它返回了 nameaverageaverage 与名称不符。

谁能给我指点或解释一下哪里出了问题?谢谢

我只需要使用 limit 即可:

SELECT nom, avg
FROM (
    SELECT nom, (noteOrale + noteEcrit)/2 as avg 
    FROM etudiant 
    GROUP BY nom
) t
ORDER BY avg DESC
LIMIT 1

mysql 允许您使用聚合而不包括 group by 子句中的所有非聚合列——因此您的查询只是返回名称的任意值。

使用 order bylimit。不需要子查询:

    SELECT nom, (noteOrale + noteEcrit)/2 as avg 
    FROM etudiant 
    ORDER BY avg DESC
    LIMIT 1;

似乎也不需要 GROUP BY,因为值都在一行上。

如果它们是多行,那么你需要GROUP BY

错误的是 returned 为 nom 的值是 indeterminateMAX() 聚合导致查询折叠所有行,并挑选出 avg 的最高值。那部分工作。

但是为 nom 编辑的值 return 来自折叠组中的 一些 行,不一定是具有最高值 avg。该查询基本上告诉 MySQL 到 return 来自组中 任何 行的值 nom

其他数据库会在查询时抛出错误,错误消息类似于 "non-aggregate in SELECT list not in GROUP BY".

非标准 MySQL 特定扩展允许查询 运行。 (如果我们将 ONLY_FULL_GROUP_BY 包含在 sql_mode 中,则可以使 MySQL 更紧密地遵循标准,就像其他数据库一样。禁用扩展后,MySQL 的行为类似于其他数据库,return 错误。)

这就是您观察到的 "unexpected" 行为的原因。

(这回答了您提出的问题...解释出了什么问题。)

只列出所有行中两个字段的和等于两个字段的最大和的行。你不需要除以二。那只是缩放。

Select * from table
Where noteOrale + noteEcrit =
   (Select Max(noteOrale + noteEcrit)
    From table)

如果您还想在输出中计算出平均值,请将其添加到 select 子句中。

Select nom, noteOrale, noteEcrit,
    (noteOrale + noteEcrit)/2 Avg
from table
Where noteOrale + noteEcrit =
   (Select Max(noteOrale + noteEcrit)
    From table)