最近在網上看面經,再結合自己的一丟丟面試經驗,覺得有必要在博客裏總結一下這塊知識:
這裏我參考
目錄
先來看看在SQL中都有哪些常用的join?
1.INNER JOIN:內連接。
2.LEFT JOIN :左連接。
3.RIGHT JOIN :右連接。
4.FULL OUTER JOIN :外連接、全連接
在詳細說明這幾種join之前,有必要放兩個表輔助說明:
mysql> SELECT * FROM Table_A ORDER BY PK ASC;
+----+---------+
| PK | Value |
+----+---------+
| 1 | both ab |
| 2 | only a |
+----+---------+
2 rows in set (0.00 sec)
mysql> SELECT * from Table_B ORDER BY PK ASC;
+----+---------+
| PK | Value |
+----+---------+
| 1 | both ab |
| 3 | only b |
+----+---------+
2 rows in set (0.00 sec)
其中 PK 爲 1 的記錄在 Table_A 和 Table_B 中都有,2 爲 Table_A 特有,3 爲 Table_B 特有。
這兩個表知識拿出來具有代表性的簡單表,本來想自己寫兩個表,但是作圖技術堪憂,所有用了別人的表和圖
INNER JOIN
INNER JOIN 是內連接,什麼是內連接?
就是將表A和表B能夠關聯的數據連接起來並返回
類似於集合中的交集:看圖
例如:
SELECT A.PK AS A_PK, B.PK AS B_PK,
A.Value AS A_Value, B.Value AS B_Value
FROM Table_A A
INNER JOIN Table_B B
ON A.PK = B.PK;
查詢結果:
+------+------+---------+---------+
| A_PK | B_PK | A_Value | B_Value |
+------+------+---------+---------+
| 1 | 1 | both ab | both ab |
+------+------+---------+---------+
1 row in set (0.00 sec)
LEFT JOIN
接下來是左連接,這個自己也被問到過,感覺如果問到join,一定會問左連接和右連接的。那麼什麼是左連接?
其實左連接就是順着join左邊表的意,當然右邊的表就得遷就一下左邊的表嘍,什麼意思呢?通俗的來講,左連接只會影響右邊,就是返回左表全部並且將右表中與左表關聯的部分,看到這你可能還是聚德很繞,沒關係,沒有什麼是一張圖解決不了的,如果有那就來兩張嘍。
看圖:
查詢實例:
SELECT A.PK AS A_PK, B.PK AS B_PK,
A.Value AS A_Value, B.Value AS B_Value
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK;
查詢結果:
+------+------+---------+---------+
| A_PK | B_PK | A_Value | B_Value |
+------+------+---------+---------+
| 1 | 1 | both ab | both ba |
| 2 | NULL | only a | NULL |
+------+------+---------+---------+
2 rows in set (0.00 sec)
RIGHT JOIN
看了左連接,估計聰明的你已經大概清楚右連接了
這次當然得順着右表了,右連接只會影響左表,也就是返回右表的所有信息以及左表與右表關聯部分的信息。
看圖:
查詢示例:
SELECT A.PK AS A_PK, B.PK AS B_PK,
A.Value AS A_Value, B.Value AS B_Value
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK;
查詢結果:
+------+------+---------+---------+
| A_PK | B_PK | A_Value | B_Value |
+------+------+---------+---------+
| 1 | 1 | both ab | both ba |
| NULL | 3 | NULL | only b |
+------+------+---------+---------+
2 rows in set (0.00 sec)
FULL OUTER JOIN
外連接或者全連接,實際查詢語句中可以寫作 FULL OUTER JOIN 或 FULL JOIN。外連接查詢能返回左右表裏的所有記錄,其中左右表裏能關聯起來的記錄被連接後返回。
圖是這樣的:
查詢示例:
SELECT A.PK AS A_PK, B.PK AS B_PK,
A.Value AS A_Value, B.Value AS B_Value
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK;
查詢結果:
+------+---------+------+---------+
| PK | Value | PK | Value |
+------+---------+------+---------+
| 1 | both ab | 1 | both ba |
| 2 | only a | NULL | NULL |
| NULL | NULL | 3 | only b |
+------+---------+------+---------+
3 rows in set (0.00 sec)
mysql貌似是不支持全連接的呢^-^
以上就是我們sql中常用到的幾個join,看他們的全家福:
不,還沒完呢?
LEFT JOIN EXCLUDING INNER JOIN
返回左表有但右表沒有關聯數據的記錄集。
看圖:
查詢示例:
SELECT A.PK AS A_PK, B.PK AS B_PK,
A.Value AS A_Value, B.Value AS B_Value
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK
WHERE B.PK IS NULL;
查詢結果
+------+------+---------+---------+
| A_PK | B_PK | A_Value | B_Value |
+------+------+---------+---------+
| 2 | NULL | only a | NULL |
+------+------+---------+---------+
1 row in set (0.01 sec)
RIGHT JOIN EXCLUDING INNER JOIN
返回右表有但左表沒有關聯數據的記錄集。
圖:
查詢示例
SELECT A.PK AS A_PK, B.PK AS B_PK,
A.Value AS A_Value, B.Value AS B_Value
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL;
查詢結果
+------+------+---------+---------+
| A_PK | B_PK | A_Value | B_Value |
+------+------+---------+---------+
| NULL | 3 | NULL | only b |
+------+------+---------+---------+
1 row in set (0.00 sec)
FULL OUTER JOIN EXCLUDING INNER JOIN
返回左表和右表裏沒有相互關聯的記錄集。
圖:
查詢示例
SELECT A.PK AS A_PK, B.PK AS B_PK,
A.Value AS A_Value, B.Value AS B_Value
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL
OR B.PK IS NULL;
查詢結果
+------+--------+------+--------+
| PK | Value | PK | Value |
+------+--------+------+--------+
| 2 | only a | NULL | NULL |
| NULL | NULL | 3 | only b |
+------+--------+------+--------+
2 rows in set (0.00 sec)
最後這纔是完整的全家福↓↓↓
想了解更多,請移步→大佬博客