內連接:
inner join 或者 join
外連接
1、左連接 left join 或 left outer join
2、右連接 right join 或 right outer join
3、完全外連接 full join 或 full outer join
圖示理解
全連接
創建person表和card表
CREATE DATABASE testJoin;CREATE TABLE person (id INT,name VARCHAR(20),cardId INT
);CREATE TABLE card (id INT,name VARCHAR(20)
);
插入數據
INSERT INTO card VALUES (1, '飯卡'), (2, '建行卡'), (3, '農行卡'), (4, '工商卡'), (5, '郵政卡');
SELECT * FROM card;
+------+-----------+
| id | name |
+------+-----------+
| 1 | 飯卡 |
| 2 | 建行卡 |
| 3 | 農行卡 |
| 4 | 工商卡 |
| 5 | 郵政卡 |
+------+-----------+INSERT INTO person VALUES (1, '張三', 1), (2, '李四', 3), (3, '王五', 6);
SELECT * FROM person;
+------+--------+--------+
| id | name | cardId |
+------+--------+--------+
| 1 | 張三 | 1 |
| 2 | 李四 | 3 |
| 3 | 王五 | 6 |
+------+--------+--------+
分析兩張表,person
表并沒有為 cardId
字段設置一個在 card
表中對應的 id 外鍵。如果設置了的話,person
中 cardId
字段值為 6 的行就插不進去,因為該 cardId
值在 card
表中并沒有。
inner join 查詢
要查詢這兩張表中有關系的數據,可以使用 INNERJOIN
( 內連接 ) 將它們連接在一起。
-- INNER JOIN: 表示為內連接,將兩張表拼接在一起。
-- on: 表示要執行某個條件(連接條件)。
SELECT * FROM person INNER JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 張三 | 1 | 1 | 飯卡 |
| 2 | 李四 | 3 | 3 | 農行卡 |
+------+--------+--------+------+-----------+
--card 的整張表被連接到了右邊。
內連查詢,其實就是兩張表中的數據通過某個字段相對應,查詢出相關記錄數據。
inner去掉也是一樣的。
left join 查詢
完整顯示左邊的表 ( person ) ,右邊的表如果符合條件就顯示,不符合則補 NULL 。
SELECT * FROM person LEFT JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 張三 | 1 | 1 | 飯卡 |
| 2 | 李四 | 3 | 3 | 農行卡 |
| 3 | 王五 | 6 | NULL | NULL |
+------+--------+--------+------+-----------+
right join 查詢
完整顯示右邊的表 ( card ) ,左邊的表如果符合條件就顯示,不符合則補 NULL 。
SELECT * FROM person RIGHT JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 張三 | 1 | 1 | 飯卡 |
| 2 | 李四 | 3 | 3 | 農行卡 |
| NULL | NULL | NULL | 2 | 建行卡 |
| NULL | NULL | NULL | 4 | 工商卡 |
| NULL | NULL | NULL | 5 | 郵政卡 |
+------+--------+--------+------+-----------+
full join 查詢
MySQL 不支持這種語法的全外連接:
SELECT * FROM person FULL JOIN card on person.cardId = card.id;
這樣會報錯:
ERROR 1054 (42S22): Unknown column 'person.cardId' in 'on clause'
MySQL的全連接是通過left join和right join合在一起。
SELECT * FROM person LEFT JOIN card on person.cardId = card.id
UNION
SELECT * FROM person RIGHT JOIN card on person.cardId = card.id;
+------+--------+--------+------+-----------+
| id | name | cardId | id | name |
+------+--------+--------+------+-----------+
| 1 | 張三 | 1 | 1 | 飯卡 |
| 2 | 李四 | 3 | 3 | 農行卡 |
| 3 | 王五 | 6 | NULL | NULL |
| NULL | NULL | NULL | 2 | 建行卡 |
| NULL | NULL | NULL | 4 | 工商卡 |
| NULL | NULL | NULL | 5 | 郵政卡 |
+------+--------+--------+------+-----------+
參考
一天學會MySQL
某Github