雇员
**|employeeId| name |salary |address|**
---------------------------------------------
|1 |John |45000 |San Fransisco|
|2 |Michel |100000 |Attil|如果我想在Employee表中选择Max salaried person details,目前我必须编写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实体的所有属性表示兴趣。就像我们这种情况,我只是不想知道什么是最高工资。我其实对员工的细节很感兴趣。
发布于 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所能做的就是每个分组返回一个值。所有其他属性数据都必须由后续查询获得。
发布于 2018-09-30 14:35:40
您不需要对此进行子查询--如果您想要一行:
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子句指定要返回的特定行中的列。它没有指定要返回哪些行,只指定哪些列。
在没有JOIN或GROUP BY的简单GROUP BY中,WHERE子句确定要返回的行。WHERE子句只知道一个特定的行,所以它不知道最大值。这就是为什么需要额外的子查询。
https://stackoverflow.com/questions/52578794
复制相似问题