2016-06-10 42 views
0

我正在使用MySQL。我有一個名爲id,name,dept_name,salary作爲屬性的教師表。我已經寫了一個查詢「找到所有其薪水比物理系至少一個導師更大的教官」作爲where子句中的條件的優先順序是什麼?

select t.name, t.dept_name, t.salary 
from instructor t, instructor s 
where t.salary > s.salary and s.dept_name='physics'; 

現在這條件將首先應用?

+0

這裏沒有優先權的問題。有一個評估順序問題,這不是一回事。 – EJP

+0

@EJP,你能告訴我這些記錄將如何比較嗎?是否每個記錄都與's'或其他方式相關。 – BabyboB

回答

2

將應用整個WHERE條件,這意味着爲了使記錄出現在結果集中,它必須同時滿足薪水和部門要求。

您查詢看起來幾乎是正確的,但您可能要包括DISTINCT,以確保你不報告相同的教官不止一次在結果集中:

select distinct t.name, t.dept_name, t.salary 
from instructor t 
inner join instructor s 
    on t.salary > s.salary and s.dept_name='physics' 

你會發現,我有也用明確的inner join替換了隱式連接語法。您應該避免將逗號放入from條款中,因爲這是一種非常古老的學習方式,因此被現代RDBMS視爲棄用。

+0

「如果第一個條件(工資檢查)失敗,那麼MySQL可能會跳過檢查第二個條件。」 ---這是完全錯誤的。在mysql(和任何其他成熟的RDBMS)中沒有謂詞順序的概念 – zerkms

+0

@zerkms我不知道這是因爲在大多數編程語言中,邏輯的順序被保存在諸如「if」語句之類的東西中。知道評估的順序在很多情況下都是有用的。 –

+1

「知道評估的順序在很多情況下是有用的」---而不是DBMS。數據庫比你知道的更多,並且可以對如何評估查詢做出更好的決定。 – zerkms

0

正如蒂姆在他的回答中提到的那樣,整個標準被考慮在哪裏。我還向他評論說,我認爲你所要求的是來自其他部門的導師,他們的薪水比物理部門的任何人都高。如果你有三個物理學員,每個人的薪水都不同,那麼兩個人的薪水比最低薪酬的物理學要高,但所有三個人的薪水可能都比學校其他人高。

這將與子查詢更好地處理先找到最低的物理部門的工資,然後再尋找任何大於該值...

而且,你有它的方式,你將有一個由於沒有JOIN條件,所以笛卡兒比較。將教師表中的每條記錄與SECOND教師表中的每條記錄進行比較(包括與其比較的記錄)。

要解決此問題,下面的別名的第二個預先計算物理部門的最低工資一次,然後將這一個答案應用於所有其他不屬於物理系的教師工資。

select 
     t.name, 
     t.dept_name, 
     t.salary 
    from 
     instructor t, 
     (select min(ps.salary) PhysicsLowest 
      from instructor ps 
      where ps.dept_name='physics') as Phys 
    where 
      t.salary > Phys.PhysicsLowest 
     AND NOT t.dept_name = 'physics'