[英]How does this subquery work?
select max(salary)
from employee
WHERE salary NOT IN (select MAX(salary) from employee)
上面的查询返回第二高的薪水。 现在我知道还有其他方法可以找到第二高的薪水,但是我不明白上面的查询是如何工作的。 这可能很容易,但是有人可以将其分解以便可以理解。
这是一个可能非常缓慢和复杂的查询,它与以下查询相同:
SELECT salary FROM employee ORDER BY salary DESC limit 1,1
您的子查询找到了最高薪水,然后您正在做一个外部查询,以找到不是最高薪水的所有薪水,然后取最高薪水。
找到最高
select MAX(salary) from employee
查找最高薪水,如下所示:
WHERE NOT IN (select MAX(salary) from employee)
找到不是最高的最高薪水!!
选择max(salary)....
您需要了解SQL执行的顺序。 在这种情况下,where子句将针对employee表中的记录集执行,从而从引擎正在使用的数据集中删除薪水最高的员工(员工的子集现在不包括最高薪水)。 然后,选择将返回具有最高薪水的员工。
John 45,000
Paul 26,000
George 87,000
Ringo 33,000
因此,引擎将George识别为最高收入87,000,并将其从数据集中删除(注意:Linkan指出,所有具有该最高工资的个人不仅被排除在外,还不仅是1,如果Brian的工资为87,000,也将被淘汰) ...将以下内容保留在内存中。
因此,where子句“ WHERE salary NOT IN (select MAX(salary) from employee)
那里WHERE salary NOT IN (select MAX(salary) from employee)
已完成工作。
John 45,000
Paul 26,000
Ringo 33,000
然后,引擎进行浏览,发现John现在是重新定义集中的最高(max),因此消除了另外2个并返回:select完成了它的工作: select max(salary)
45,000
因此,SQL执行的顺序概括为:
说员工有以下记录
EmpId Salary
1 50000
2 40000
3 35000
4 30000
5 25000
6 20000
where子句中的子查询返回以下结果,即
Max(Salary)
50000
然后在where子句中使用Salary NOT IN (select MAX(salary) from employee)
,这意味着Salary NOT IN (50000)
,这将为您提供结果
Max(Salary)
40000
因此,结果是第二个最大值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.