这个子查询是如何工作的?

时间:2016-11-22 15:08:10

标签: mysql sql

select max(salary) 
from employee 
WHERE salary NOT IN (select MAX(salary) from employee)

上面的查询返回第二高薪。现在我知道还有其他方法可以找到第二高薪,但我无法理解上述查询是如何工作的。这可能很容易,但有人可以将其分解,以便可以理解。

4 个答案:

答案 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执行的顺序概括为:

  1. FROM
  2. JOINS
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. 选择
  7. ORDER BY

答案 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执行顺序的更多信息,请参阅下面的图像

enter image description here

答案 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

因此结果是第二大值。