gpt4 book ai didi

mysql - 为什么 "marks < max(marks)"不起作用

转载 作者:行者123 更新时间:2023-11-29 01:29:21 27 4
gpt4 key购买 nike

我想知道组查询的工作

假设有一张表Student(id,name,marks)

现在如果我想输出除得分最高的学生之外的所有学生,为什么这个查询不起作用?

SELECT * FROM Students
WHERE marks < MAX(marks)

但这很好用

SELECT * FROM Students
WHERE marks < (SELECT MAX(marks) FROM Students)

编辑:请不要建议不同的方法来解决这个问题,我已经知道了。我的问题是为什么这不起作用,请仔细看标题

最佳答案

简短的回答是 SQL 就是这样设计的。较长的答案要求我们查看您的第一个查询的含义以及为什么最终没有意义。

可以想象一个 SQL,您可以在其中将整个表的聚合与行值进行比较。但是,如果您有一个 GROUP BY 怎么办?您的 MAX 是针对整张 table 还是只针对整个组?如果您希望它针对不同的分组,或者针对整个表格而不是针对该组怎么办?

现在让我们从底层操作的角度考虑一下。要实际计算行值和最大值,数据库引擎必须执行两个操作:一个是找到最大值,另一个是扫描表,将值与计算出的最大值进行比较。但是,在没有子查询的 WHERE 子句中,您只是逐行比较列中的值。添加到聚合中是一种不同类型的数据,无法通过逐行查看值来收集。

另一种看待它的方式是:聚合发生在 GROUP BY 之后(即使 GROUP BY 是隐式的)。但是 WHERE 子句在 GROUP BY 之前执行。所以它无法访问聚合。

出于所有这些原因,可能还有更多原因,SQL 旨在强制您在比较不同类型的值时要明确。您必须告诉它您正在显式计算最大值,然后使用它与行值进行比较。这是通过子查询完成的。

关于mysql - 为什么 "marks < max(marks)"不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21949587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com