繁体   English   中英

该子查询如何工作?

[英]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执行的顺序概括为:

  1. 加盟
  2. 哪里
  3. 通过...分组
  4. HAVING
  5. 选择
  6. 订购

集合函数之前执行“哪里”条件

为了更清晰
在员工表中这里的工资像10000,15000,20000

WHERE salary NOT IN (select MAX(salary) from employee) =20000 GET执行并
20000用于比较

然后从MAX值中一一检查像20000 != 20000

然后检查其他最大值15000 != 20000

所以15000将返回

要了解有关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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM