目錄
1、各種連接的解讀說明:
1.1、各種連接的含義和說明
| 連接 | 語法 | 作用 |
|---|---|---|
| 左外連接 | left join | 返回左表中所有的記錄以及右表中連接字段相等的記錄 |
| 右外連接 | right join | 返回右表中所有的記錄以及左表中連接字段相等的記錄。 |
| 全外連接 | full join | 返回兩個表中的行:left join + right join(重合部分的相等數據只保留一份) |
| 自連接 | ||
| 笛卡爾積 | cross join(不帶 WHERE 子句) | 結果是笛卡爾積,就是第一個表的行數乘以第二個表的行數。 |
| 內連接 | inner join | 又叫等值連接,只返回兩個表中連接字段相等的行。 |
| 自然連接 | natrual join | 和內連接很類似,區別在於結果的重復列上: 自然連接重復列只保存一列(列去重),內連接重復列都保存(列不去重) |
1.1.1 所有連接分類
說明:
- 等值連接和不等連接的區別:都是內連接,等值連接有on條件,不等連接沒有on條件

1.1.2 left join 和 left outer join 區別
簡單來說就是沒有區別,只是寫法不同。( sql-92 標准中應為 LEFT Outer Join,而 SQLServer 中兩種都支持的。 )
參考: 請說明 left join 和 left outer join 的區別 - CSDN 論壇
1.2、神圖參考

1.4、一些參考說明
- 基本概念理解參考: 數據庫的連接(內連接,外連接,笛卡爾積) - goasleep 的博客 - CSDN 博客
- 關於自然連接的去重可以參考: 笛卡爾積,自然連接,外連接 - 白小羊的博客 - CSDN 博客
- 概念區分參考: 【概念區分】笛卡爾積,自然連接,內連接,外連接 (左,右,全) - lawrence.li - 博客園
很好的一篇文章,解決列很多問題。- 笛卡爾積存在的意義是什么?
- ”cross join 笛卡爾積 “和” full join 全連接 “和 "inner join 內連接" 的區別在哪里?
- 既然” 連接條件 “可以寫在 where 字句里面,為什么還要用 on 關鍵字?
- 自然連接和內連接有什么關系嗎?
2、on 和 where 條件的區別
2.1 on 和 where 條件的區別 (只對外連接有區別)
前提說明:數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶。
- on 條件是在生成臨時表時使用的條件,它不管 on 中的條件是否為真,都會返回左邊表中的記錄。
- where 條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有 left join 的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
即
- 如果條件中同時有on和where 條件:
- SQL的執行實際是兩步
- 第一步:根據on條件得到一個臨時表
- 第二步:根據where 條件對上一步的臨時表進行過濾,得到最終返回結果。
- SQL的執行實際是兩步
- 如果條件中只有on:
- 那么得到的臨時表就是最終返回結果
主要內容來自: sql (join on 和 where 的執行順序) - higirle - 博客園 ,具體demo也可以看原文。
2.2 具體連接的區別
2.2.1 對於內連接沒區別
因為內連接生成的臨時表中只會保留符合on條件的數據,所以數據在 on 和 where 條件中過濾沒區別。
2.2.2 對於外連接(左連接,右連接,全連接)有區別
而外連接生成的臨時表中會保留不符合on條件的數據,對於這些數據,在 on 和 where 條件中過濾就區別了。
2.3 多張(>=3)表連接更顯 on 和 where 條件的區別
sql 語句中 join on 和 where 用法的區別和聯系 - 一個破名想半年的個人空間 - OSCHINA
注:文中的一個觀點和說明很神奇。
總結下:如果是多張表連接,那么在生成臨時表的過程中過濾數據和對生成后的臨時表過濾數據就有明顯區別了。
這種情況下: inner join on 比直接 where 的查詢效率要高
