我正在使用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';
現在這條件將首先應用?
我正在使用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';
現在這條件將首先應用?
將應用整個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視爲棄用。
正如蒂姆在他的回答中提到的那樣,整個標準被考慮在哪裏。我還向他評論說,我認爲你所要求的是來自其他部門的導師,他們的薪水比物理部門的任何人都高。如果你有三個物理學員,每個人的薪水都不同,那麼兩個人的薪水比最低薪酬的物理學要高,但所有三個人的薪水可能都比學校其他人高。
這將與子查詢更好地處理先找到最低的物理部門的工資,然後再尋找任何大於該值...
而且,你有它的方式,你將有一個由於沒有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'
這裏沒有優先權的問題。有一個評估順序問題,這不是一回事。 – EJP
@EJP,你能告訴我這些記錄將如何比較嗎?是否每個記錄都與's'或其他方式相關。 – BabyboB