为什么"标记<max(marks)"不起作用

Har*_*rry 2 mysql sql

我想知道小组查询的工作情况

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

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

SELECT * FROM Students
WHERE marks < MAX(marks)
Run Code Online (Sandbox Code Playgroud)

但这很好

SELECT * FROM Students
WHERE marks < (SELECT MAX(marks) FROM Students)
Run Code Online (Sandbox Code Playgroud)

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

sir*_*ide 5

简短的回答是SQL的设计方式.更长的答案要求我们查看您的第一个查询的含义以及为什么最终不太有意义.

可以想象一个SQL,您可以将整个表的聚合与行值进行比较.但是,如果你有一个GROUP BY?你MAX会是整张桌子还是仅仅是团体?如果您希望它针对不同的分组,或者针对整个表而不是针对组,该怎么办?

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

另一种看待它的方法是:聚合在a之后发生GROUP BY(即使GROUP BY是隐含的).但该WHERE条款在之前执行GROUP BY.所以它无法访问聚合.

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