2016-11-22 66 views
0
select max(salary) 
from employee 
WHERE salary NOT IN (select MAX(salary) from employee) 

上面的查詢返回第二高薪水。現在我知道還有其他方法可以找到第二高的薪水,但我無法理解上述查詢是如何工作的。這可能很容易,但是有人可以將其分解,這樣可以理解。這個子查詢是如何工作的?

+2

您需要了解的順序圖像,其中SQL執行。在這種情況下,where子句針對employee表中的一組記錄執行,從引擎正在處理的數據集(現在排除最高收入的員工的子集)中消除具有最高薪水的員工。然後select執行返回集合中剩餘最高工資的員工。 – xQbert

+0

@xQbert我認爲這不是很明顯。使用這種技術,*下一個*最高工資是多少? – Strawberry

+1

@strawberry這不是問題。 「請將其分解,以便可以理解」,而不是如何獲得第三高。這個問題甚至說,他知道還有其他方法可以找到它,但是這個具體的例子就是OP試圖理解 – xQbert

回答

1

'去哪兒' 的條件聚合函數

之前執行對於員工表的詳細clearification
這裏有工資像10000,15000,20000

FIRST WHERE salary NOT IN (select MAX(salary) from employee) =20000 GET執行和存儲
20000進行比較

然後從最大值LIKE 20000 != 20000一個接一個地檢查

再檢查其他MAX值15000 != 20000

所以15000將返回

要了解更多關於SQL的執行順序見下文

enter image description here

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) 

發現這並不是最高的頂薪!

select max(salary)....

+2

如果兩個或兩個以上的人配合最高的工資,這兩個查詢是不相同的。 – Linkan

+0

@Linkan好點 – e4c5

1

您需要了解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執行順序被概括爲:

  1. FROM
  2. JOINS
  3. WHERE
  4. GROUP BY
  5. HAVING
  6. 選擇
  7. ORDER BY
+0

如果說Brian還有87,000的薪水,查詢仍然會選擇45,000。這是因爲它排除了所有薪水最高的人。 – Linkan

+0

非常好的一點! – xQbert

0

說員工有如下記錄

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)因此,結果是第二大值。