首先了解JOIN的基本概念:
join 用於根據兩個或多個表中的列之間的關系,從這些表中查詢數據。
INNER JOIN:在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行。
LEFT JOIN 關鍵字會從左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。
RIGHT JOIN 關鍵字會右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中沒有匹配的行。
FULL JOIN 只要其中某個表存在匹配,FULL JOIN 關鍵字就會返回行。
通俗的解釋是INNER JOIN就類似於查詢多個表並且在WHERE之后加上聯接這些表的唯一限定條件,以下兩句SQL語句,返回相同的結果:
select * from tb_Course as c,tb_CourseType as ct where c.ctpID=ct.ID select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID
以此類推,LEFT JOIN 返回左表的所有行,也就是即使右表中無法找到對應左表記錄的數據,也會返回數據。RIGHT JOIN 類似。而FULL JOIN就是LEFT 和 RIGHT 的並集,只要存在匹配就返回行。
而本文需要解決或者驗證的問題是在進行多表查詢的時候,LEFT JOIN ,RIGHT JOIN 會不會有優先級。
為了方便,就拿最簡單的三表查詢進行檢驗。在三表查詢中,可能出現的情況也就是9種(暫時不考慮FULL JOIN)。
首先運行下面語句:
select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID
得到的結果如圖:
當在上面語句之后再JOIN一張表的時候:
select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID inner join tb_Teacher as t on t.CID=c.ID
得到的結果如圖:
由此得到猜想,第二條語句首先進行了第一個JOIN,然后將此結果進行第二次JOIN,也就是是按照從左到右的順序進行JOIN。而為了驗證此猜想,就要進行其他的檢驗。方法很簡單,依次按照先LEFT JOIN 后LEFT JOIN或者先RIGHT JOIN后LEFT JOIN的順序進行檢驗,當檢查完每個結果集時,是否遵循先前的猜想。