圖解SQL裏面的各種join

最近在網上看面經,再結合自己的一丟丟面試經驗,覺得有必要在博客裏總結一下這塊知識:
這裏我參考


先來看看在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)

最後這纔是完整的全家福↓↓↓
在這裏插入圖片描述
想了解更多,請移步→大佬博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章