select max(salary)
from employee
WHERE salary NOT IN (select MAX(salary) from employee)
上面的查询返回第二高薪。现在我知道还有其他方法可以找到第二高薪,但我无法理解上述查询是如何工作的。这可能很容易,但有人可以将其分解,以便可以理解。
答案 0 :(得分:1)
这是一个非常缓慢而复杂的查询,与此相同:
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(薪水)....
答案 1 :(得分:1)
您需要了解SQL执行的顺序。在这种情况下,where子句针对employee表中的记录集执行,从而消除了引擎正在使用的数据集中薪水最高的员工(现在员工的子集不包括最高薪水)。然后,select执行返回集合中剩余工资最高的员工。
John 45,000
Paul 26,000
George 87,000
Ringo 33,000
因此,引擎确定乔治拥有最高的87,000 并将其从数据集中删除(注意:所有具有此最高工资的个人不仅仅被排除在外,因此,如果布莱恩的薪水为87,000,它也将被淘汰)......将以下内容留在记忆中。 / p>
因此where子句
WHERE salary NOT IN (select MAX(salary) from employee)
已经完成了它的工作。
John 45,000
Paul 26,000
Ringo 33,000
引擎然后查看并发现John现在是重新定义集中的最高(最大),因此消除了其他2并返回:
并且选择完成了它的工作:select max(salary)
45,000
因此,SQL执行的顺序概括为:
答案 2 :(得分:1)
'在聚合函数
之前执行'where'条件更清晰 员工表中的工资类似于10000,15000,20000
FIRST WHERE salary NOT IN (select MAX(salary) from employee) =20000
GET执行和
存储用于比较的值20000
然后从MAX值LIKE 20000 != 20000
false
然后检查其他MAX值15000 != 20000
是否
所以15000将返回
要了解有关SQL执行顺序的更多信息,请参阅下面的图像
答案 3 :(得分:0)
假设员工有以下记录
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
因此结果是第二大值。