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

时间:2018-09-30 14:27:16

标签: mysql sql

员工

**|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实体的所有属性表现出兴趣。就像我们这里的情况一样,我只是不想找到最高薪水,而我实际上对那个员工的详细信息感兴趣。 / p>

  1. 为什么MySQL(MAX)没有这样做?
  2. 如果我们谈论MAX的单一责任,那么目前它做得很好而且足够。但是为什么他们在做完MAX()之后允许选择某些属性,这实际上使我感到困惑?因为我怎么能期望所选结果可能是任意随机值,而不属于MAX所选实体。(如上述 [Query 2]结果 employeeId 1 >与最高工资100000
  3. 没有关系
  4. 不是给出一些随机结果,而是给出MAX选定实体的实际属性的结果有什么危害? (因为它可能是 100000作为最高薪金 2作为employeeId ))

2 个答案:

答案 0 :(得分:0)

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

select *
from Employee 
order by salary desc
limit 1;

此查询:

Select MAX(salary), employeeId
From Employee;

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

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

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

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

在没有SELECTJOIN的简单GROUP BY中,WHERE子句确定要返回的行。 WHERE子句只知道特定的行,因此它不具有最大值。这就是为什么需要一个附加子查询的原因。

答案 1 :(得分:0)

我绝对喜欢为什么要问..他们让我思考。

为什么MySQL(MAX)没有这样做? max是一个标量值,每个分组将返回1,并且仅返回1个结果。如果由于要返回employeeEID而有多个记录被返回,则结果将不再是缩放器。假设多名员工的工资相同

如果我们谈论MAX的“单一责任”,那么目前它做得很好而且足够。但是为什么他们在做完MAX()之后允许选择某些属性,这实际上使我感到困惑?因为我怎么能期望所选结果可能是任意随机值,而不属于MAX ly所选实体。(如上述[Query 2]结果中,employeeId 1与最高薪水100000无关)

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

不是给出一些随机结果,而是给出结果是MAX ly所选实体的实际属性的危害是什么? (因为最高工资可能是100000,而employeeId是2)

因此,在我看来,由于SQL操作的顺序以及max的性质是每个分组的定标器值,以及需要进行分组以表现和保持生命周期; max可以做的就是每个分组返回一个值。所有其他属性数据必须由后续查询获得。