sql join例項圖解

世有因果知因求果發表於2016-11-07

https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

1. inner join:

所有滿足join條件的兩個table對應的row,column都將在result set中出現。比如下面的例子條件是tj1.id=tj2.id2而滿足這個條件的row.

它的執行過程可以這樣理解:獲取tj1的第一行的id欄位為1,隨後比對tj2的id2欄位,發現有三條記錄出現,因此在結果集中就有了三條tj1.id=tj2.id2=1的記錄,而

tj1.id=1的記錄被複制了三份分別對應著tj2.id2=1的三條記錄。接下來去比對tj1.id第二條記錄2,在tj2.id2中又發現了2條記錄,因此結果集中就出現2條記錄。

繼續往下tj1.id第三條記錄3,在tj2.id2中只發現了1條記錄,因此只出現1條記錄。

2. left outer join

left outer join返回left table的所有row,並且附帶上符合join條件的right table對應的matching row. 

如果在right table中並沒有發現對應列和left table的join條件滿足matching,則返回null value

由於tj2表中有id2為8和9的兩列tj1無對應記錄存在因此以NULL填充.

執行的過程同樣是先拿出left table的第一行id來檢查得出right table的所有行中的id2為1的行,每找到這樣一行就將其連同left table 的id=1 value=first形成新的一行(具體結果集出現哪些欄位由select資訊來決定)

 

3. right outer join

返回所有的right table行,以及滿足matching條件的left table行資訊,如果左表沒有matching到右表對應的join條件時,則返回null.

執行過程依然是:針對右表的所有行,先取出第一行,再到左表中每一行檢視是否有匹配join條件的,如發現滿足,則將左表該行資訊+右表的這行資訊形成一行,直到左表掃描完畢。接下來繼續右表的第二行,依次進行!

4. full outer join

由於mysql不支援full outer join,我們只能使用left/right outer join + union來模擬操作了。full outer join返回rows from either table when the conditions are met and retunrs a null value when there is no match

5. cross join

cross join不需要任何join條件,簡單地返回row number1*row number2條記錄

6. equi/non-equi join

在上面的inner/outer join中,對應的join條件都是t1.x=t2.y這種等值條件,也可以使用任何其他的非等值判斷條件,比如t1.x>t2.y

7. self join

一個表和自己做inner/outer join

 

相關文章