首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MAX()不选择各自的最大值行详细信息?

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

Stack Overflow用户
提问于 2018-09-30 14:27:15
回答 2查看 60关注 0票数 1

雇员

代码语言:javascript
复制
**|employeeId|  name    |salary |address|**
---------------------------------------------
|1          |John   |45000  |San Fransisco|
|2          |Michel |100000 |Attil|

如果我想在Employee表中选择Max salaried person details,目前我必须编写2个查询,其中一个是内部查询。

查询1)

代码语言:javascript
复制
Select *
From Employee 
Where salary = (Select MAX(salary) From Employee)

查询2)

代码语言:javascript
复制
Select MAX(salary), employeeId
From Employee

结果:

代码语言:javascript
复制
**|MAX(salary)|      employeeId|**
-------------------------------
|100000|             1|

如果MySQL MAX函数设计了这样一种方式来一次选择最大工资和最高工资雇员id (因为目前max无法保证这一点),我就会编写非常瘦的查询:(因为大多数要求不会仅仅停留在查找实体属性的最大值时,它们总是对max实体的所有属性表示兴趣。就像我们这种情况,我只是不想知道什么是最高工资。我其实对员工的细节很感兴趣。

  1. 为什么MySQL不这么做?
  2. 如果我们谈论MAX的单一责任,目前它做得很好,已经足够了。但是,为什么他们允许在执行MAX()之后选择一些属性,这实际上使我感到困惑。因为我怎么能期望所选的结果可能是任意随机值,它不属于MAX选择的实体。(如上面的查询2结果中所示,employeeId 1与Max way 100000无关)
  3. 与其给出一些随机的结果,给出的结果是最大选择的实体的实际性质的危害是什么?(可以是100000作为最高工资,2可能是employeeId)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-30 15:18:39

我绝对喜欢问问题..。他们让我思考。

为什么MySQL (最大)不这样做? max是一个标量值,它将在每个分组中返回1,并且只返回1个结果。如果由于要返回employeID而返回多个记录,则结果将不再是缩放器。如果多名员工的工资相同

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

这很可能与发动机的操作顺序有关。from子句,where子句.有..。然后选择orderby。由于组by发生在选择值之前,将不同的值添加到from中,因为它们与最大值“绑定”将使组变得不准确。记录之间的基数会变得混乱,而对后续查询的计算将变得不准确。

没有给出一些随机的结果,给出的结果是最大选择实体的实际性质的危害是什么?(最高工资为100000英镑,employeeId为2英镑)

因此,在我看来,由于SQL操作的顺序,以及max是每个分组的标度值的性质,以及需要通过分组进行分组,并保持carnality;max所能做的就是每个分组返回一个值。所有其他属性数据都必须由后续查询获得。

票数 1
EN

Stack Overflow用户

发布于 2018-09-30 14:35:40

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

代码语言:javascript
复制
select *
from Employee 
order by salary desc
limit 1;

此查询:

代码语言:javascript
复制
Select MAX(salary), employeeId
From Employee;

是畸形的。令人高兴的是,最近版本的MySQL将为该查询生成一个错误(与几乎所有其他数据库一样)。MAX()是一个聚合函数。更好地将此查询解释为:

代码语言:javascript
复制
Select MAX(salary), ANY(employeeId)
From Employee;

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

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

在没有JOIN或GROUP BY的简单GROUP BY中,WHERE子句确定要返回的行。WHERE子句只知道一个特定的行,所以它不知道最大值。这就是为什么需要额外的子查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52578794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档