SQL 意外 return
SQL unexpected return
所以基本上,我有一个简单的数据库,只有一个 table(它是一个测试数据库)。
table 有 4 列:
- ID
- 姓名
- 口语成绩
- 写作成绩
我想做的很简单(这就是我请求你帮助的原因):我想获得 name 和 average 平均分最高的学生。
我尝试了什么:
SELECT nom, MAX(avg)
FROM (
SELECT nom, (noteOrale + noteEcrit)/2 as avg
FROM etudiant
GROUP BY nom) AS Table;
尝试此查询后,它返回了 name 和 average 但 average 与名称不符。
谁能给我指点或解释一下哪里出了问题?谢谢
我只需要使用 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 by
和 limit
。不需要子查询:
SELECT nom, (noteOrale + noteEcrit)/2 as avg
FROM etudiant
ORDER BY avg DESC
LIMIT 1;
似乎也不需要 GROUP BY
,因为值都在一行上。
如果它们是多行,那么你需要GROUP BY
。
错误的是 returned 为 nom
的值是 indeterminate。 MAX()
聚合导致查询折叠所有行,并挑选出 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)
所以基本上,我有一个简单的数据库,只有一个 table(它是一个测试数据库)。 table 有 4 列:
- ID
- 姓名
- 口语成绩
- 写作成绩
我想做的很简单(这就是我请求你帮助的原因):我想获得 name 和 average 平均分最高的学生。
我尝试了什么:
SELECT nom, MAX(avg)
FROM (
SELECT nom, (noteOrale + noteEcrit)/2 as avg
FROM etudiant
GROUP BY nom) AS Table;
尝试此查询后,它返回了 name 和 average 但 average 与名称不符。
谁能给我指点或解释一下哪里出了问题?谢谢
我只需要使用 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 by
和 limit
。不需要子查询:
SELECT nom, (noteOrale + noteEcrit)/2 as avg
FROM etudiant
ORDER BY avg DESC
LIMIT 1;
似乎也不需要 GROUP BY
,因为值都在一行上。
如果它们是多行,那么你需要GROUP BY
。
错误的是 returned 为 nom
的值是 indeterminate。 MAX()
聚合导致查询折叠所有行,并挑选出 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)