select max(salary)
from employee
WHERE salary NOT IN (select MAX(salary) from employee)
上面的查詢返回第二高薪水。現在我知道還有其他方法可以找到第二高的薪水,但我無法理解上述查詢是如何工作的。這可能很容易,但是有人可以將其分解,這樣可以理解。這個子查詢是如何工作的?
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)
發現這並不是最高的頂薪!
select max(salary)....
您需要了解SQL執行的順序。在這種情況下,where子句針對employee表中的一組記錄執行,從引擎正在處理的數據集(現在不包含最高收入的員工的子集)中刪除薪水最高的員工。然後select執行返回集合中剩餘最高工資的員工。
John 45,000
Paul 26,000
George 87,000
Ringo 33,000
所以引擎標識喬治具有87000最高 ,並從數據集中消除它(注:有這個最高薪水的所有indivduals被排除不只是1,從而LINKAN指出,如果布萊恩工資87,000也會被淘汰)......留下以下內容。
因此where子句 WHERE salary NOT IN (select MAX(salary) from employee)
已完成其工作。
John 45,000
Paul 26,000
Ringo 33,000
發動機則看起來通過,並認爲約翰現在是最高的(max)存儲在reamining集,從而消除了其他2個回報: 和選擇完成它的工作:select max(salary)
45,000
所以在其中SQL執行順序被概括爲:
說員工有如下記錄
EmpId Salary
1 50000
2 40000
3 35000
4 30000
5 25000
6 20000
子查詢的WHERE子句返回以下結果這是
這意味着Salary NOT IN (50000)
,這將給你的結果
Max(Salary)
40000
Max(Salary)
50000
然後在where子句中已經使用Salary NOT IN (select MAX(salary) from employee)
因此,結果是第二大值。
您需要了解的順序圖像,其中SQL執行。在這種情況下,where子句針對employee表中的一組記錄執行,從引擎正在處理的數據集(現在排除最高收入的員工的子集)中消除具有最高薪水的員工。然後select執行返回集合中剩餘最高工資的員工。 – xQbert
@xQbert我認爲這不是很明顯。使用這種技術,*下一個*最高工資是多少? – Strawberry
@strawberry這不是問題。 「請將其分解,以便可以理解」,而不是如何獲得第三高。這個問題甚至說,他知道還有其他方法可以找到它,但是這個具體的例子就是OP試圖理解 – xQbert