>员工
**|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 实体的所有属性表现出兴趣。就像我们的情况一样,我只是不想找到最高工资是多少。我实际上对员工的详细信息感兴趣。
- 为什么MySQL (MAX(不这样做?
- 如果我们谈论MAX的单一责任,目前它做得很好,足够了。但是为什么他们允许在执行 MAX(( 后选择一些属性,这实际上让我感到困惑?因为我怎么能期望所选结果可以是任何随机值,它不属于 MAX ly 所选实体。(如上[查询 2] 结果所示,employeeId 1与最高工资 100000无关(
- 与其给出一些随机结果,不如给出 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
子句指定要返回特定行中的哪些列。 它不指定要返回的行,只指定要返回哪些列。
在没有JOIN
或GROUP BY
的简单SELECT
中,WHERE
子句确定返回的行。WHERE
子句只知道特定行,因此它不知道最大值。 这就是需要附加子查询的原因。