为什么 MAX() 不会选择相应的最大值行详细信息?



>员工

**|employeeId|  name    |salary |address|**
---------------------------------------------
|1          |John   |45000  |San Fransisco|
|2          |Michel |100000 |Attil|

如果我想在员工表中选择最大受薪人员详细信息,目前我必须编写 2 个查询,其中一个是内部查询。

查询 1(

Select *
From Employee 
Where salary = (Select MAX(salary) From Employee)

查询 2(

Select MAX(salary), employeeId
From Employee

结果:

**|MAX(salary)|      employeeId|**
-------------------------------
|100000|             1|

如果MySQL MAX函数设计了这样一种一次性选择最高工资和最大受薪员工ID的方法,(因为目前MAX不会保证这一点(,我会写非常薄的查询:(由于大多数要求不会仅仅停留在查找实体属性的最大值上,因此它们始终会对 MAX 实体的所有属性表现出兴趣。就像我们的情况一样,我只是不想找到最高工资是多少。我实际上对员工的详细信息感兴趣。

  1. 为什么MySQL (MAX(不这样做?
  2. 如果我们谈论MAX的单一责任,目前它做得很好,足够了。但是为什么他们允许在执行 MAX(( 后选择一些属性,这实际上让我感到困惑?因为我怎么能期望所选结果可以是任何随机值,它不属于 MAX ly 所选实体。(如上[查询 2] 结果所示,employeeId 1最高工资 100000无关(
  3. 与其给出一些随机结果,不如给出 MAX ly 所选实体的实际属性的结果有什么害处?(因为它可能是100000 作为最高工资2 作为员工 ID(

我非常喜欢为什么问题......它们让我思考。

为什么MySQL (MAX(不这样做?max 是一个标量值,它将返回 1,每个分组仅返回 1 个结果。如果由于返回 employeeloyeID 而返回了多条记录,则结果将不再是缩放器。 假设多个员工的薪水相同

如果我们谈论MAX的单一责任,目前它做得很好,足够了。但是为什么他们允许在执行 MAX(( 后选择一些属性,这实际上让我感到困惑?因为我怎么能期望所选结果可以是任何随机值,它不属于 MAX ly 所选实体。(如上 [查询 2] 结果所示,employeeId 1 与最高工资 100000 无关(

这可能与引擎中的操作顺序有关。 从子句,where 子句由...有...然后选择排序者。 由于分组依据发生在选择值之前,因此将不同的值添加到 from 中,因为它们与最大值"并列"会使分组不准确。 记录之间的基数会变得混乱,后续查询的数学运算将变得不准确。

与其给出一些随机结果,不如给出 MAX ly 所选实体的实际属性的结果有什么害处?(因为它可能是 100000 作为最高工资和 2 作为员工 ID(

因此,在我看来,由于SQL操作的顺序,以及max的性质是每个分组的缩放器值,以及需要分组以行为和维护; max所能做的就是为每个分组返回一个值。 所有其他属性数据必须由后续查询获取。

你不需要一个子查询 - 如果你想要一行:

select *
from Employee 
order by salary desc
limit 1;

此查询:

Select MAX(salary), employeeId
From Employee;

格式不正确。 令人高兴的是,最新版本的MySQL将为此查询生成错误(几乎所有其他数据库也是如此(。MAX()是一个聚合函数。 此查询最好解释为:

Select MAX(salary), ANY(employeeId)
From Employee;

唉,ANY()不是公认的聚合函数。 关键是salary是最高工资。employeeId是表中某行中的任意员工 ID。

您似乎对 SQL 查询中不同子句的作用感到困惑。SELECT子句指定要返回特定行中的哪些列。 它不指定要返回行,只指定要返回哪些列。

在没有JOINGROUP BY的简单SELECT中,WHERE子句确定返回的行。WHERE子句只知道特定行,因此它不知道最大值。 这就是需要附加子查询的原因。

最新更新