员工
**|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>
答案 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
子句指定特定行中要返回的列。它不指定要返回哪些行,而仅指定哪些列。
在没有SELECT
或JOIN
的简单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可以做的就是每个分组返回一个值。所有其他属性数据必须由后续查询获得。