24 JOIN 表連線
前面小節介紹了表的設計三正規化和單表的查詢,本小節介紹如何將通過多個表進行關聯查詢資料,其中連表查詢包括 LEFT JOIN
、INNER JOIN
、RIGHT JOIN
。前面小節介紹過表的設計,其中有學生資訊表 student
、教師資訊表 teacher
、課程表 course
、學生選課關聯表 student_course
。
1.插入表測試資料
為了演示方便,分別清空學生資訊表 student
、教師資訊表 teacher
、課程表 course
、學生選課關聯表 student_course
資料,並分別插入測試資料。
1.1 清空表資料
分別清空學生資訊表 student
、教師資訊表 teacher
course
、學生選課關聯表 student_course
資料:
TRUNCATE TABLE student;
TRUNCATE TABLE teacher;
TRUNCATE TABLE course;
TRUNCATE TABLE student_course;
執行結果如下圖:
1.2 向學生資訊表 student 插入資料
INSERT INTO student (name,age,id_number) VALUES
('趙小明',21,'420117199303036666'),
('王小紅',22,'420117199303037777'),
('張小虎',18 ,'420117199303038888'),
('李小平',19,'420117199303039999'),
('劉美麗',21,'420117199303035555'),
('周杰',22,'420117199303034444'),
('秦小賢',19,'420117199303033333'),
('馬笑',23,'420117199303032222'),
('艾倫',22,'420117199303031111'),
('包小天',20,'420117199303030000');
執行結果如下圖:
Tips:如果上述新增表資料出現報錯,可能是因為之前修改表字段的時候把表的欄位長度或者型別更改了,請檢查欄位型別和長度是否正確,還可以刪除所有表按照之前建表步驟重新建表。
1.3 向教師資訊表 teacher 插入資料
INSERT INTO teacher (name,age,id_number,email) VALUES
('Tom',29,'420117202006040000','[email protected]'),
('Jack',30,'420117202006041111','[email protected]'),
('Mary',31,'420117202006042222','[email protected]'),
('Timo',35,'420117202006043333','[email protected]'),
('Faker',38,'420117202006044444','[email protected]'),
('Bob',35,'420117202006045555','[email protected]'),
('kelly',40,'420117202006046666','[email protected]'),
('Rose',42,'420117202006047777','[email protected]'),
('Hale',55,'420117202006048888','[email protected]'),
('John',49,'420117202006049999','[email protected]'),
('Amy',55,'42011720200604888X','[email protected]'),
('Judy',49,'42011720200604999X','[email protected]');
執行結果如下圖:
1.4 向課程表 course 插入資料
因為表 course
有 teacher_id
欄位,所以插入資料之前,需要獲取 teacher 表資料:
SELECT * FROM teacher;
執行結果如下圖:
teacher 表 id 的值如上圖所示,對應course 表 teacher_id,按照上面 id 可插入相關課程資訊:
INSERT INTO course (course_name,teacher_id) VALUES
('高等數學',1),
('英語',2),
('政治',3),
('資訊理論',4),
('資料結構和演算法',5),
('體育',6),
('類比電路',7),
('數位電路',8),
('通訊原理',9),
('訊號系統',10),
('概率論',13),
('光學原理',14);
執行結果如下圖:
1.5 向學生選課關聯表 student_course 插入資料
INSERT INTO student_course (student_id,course_id) VALUES
(1,1),
(1,2),
(2,3),
(2,4),
(3,5),
(3,6),
(4,7),
(4,8),
(5,9),
(5,10),
(6,1),
(6,2),
(7,3),
(7,4);
執行結果如下圖:
2.LEFT JOIN左連線
以課程表 course
和 teacher
左連線為例:
SELECT c.id AS course_id,c.*,t.* FROM course c LEFT JOIN teacher t ON c.teacher_id=t.id;
執行結果如下圖:
Tips:這對上述 sql 語句說明如下:
c.id AS course_id
表示將course表
中 id 欄位重新命名為course_id
展示,其目的是為了防止和teacher表
中id
欄位混淆;c.*
表示course
表所有欄位資料;t.*
表示teacher
表字段所有資料;ON
後面跟著的條件是連線表的條件;course c
表示將course
簡寫為c
,teacher t
表示將teacher
簡寫為t
;LEFT JOIN
為左連線,是以左邊的表為’基準’,若右表沒有對應的值,用NULL
來填補。
3.INNER JOIN內連線
同樣以表 course
和 teacher
內連線為例:
SELECT c.id AS course_id,c.*,t.* FROM course c INNER JOIN teacher t ON c.teacher_id=t.id;
執行結果如下圖:
Tips:
INNER JOIN
為內連線,展示的是左右兩表都有對應的資料。
4.RIGHT JOIN右連線
同樣以表 course
和 teacher
右連線為例:
SELECT c.id AS course_id,c.*,t.* FROM course c RIGHT JOIN teacher t ON c.teacher_id=t.id;
執行結果如下圖:
Tips:
RIGHT JOIN
為右連線,是以右邊的表為’基準’,若左表沒有對應的值,用NULL
來填補。
5.多表混合連線
以本小節所有資料全部連線查詢為例:
SELECT * FROM
student a
LEFT JOIN
student_course b
ON a.id=b.student_id
RIGHT JOIN
course c
ON b.course_id=c.id
INNER JOIN teacher d
ON c.teacher_id=d.id;
執行結果如下圖:
Tips:多表混合連線查詢時,後面可以把前面執行的結果集整體當成一個表,例如
SELECT * FROM student a LEFT JOIN student_course b ON a.id=b.student_id RIGHT JOIN course c ON b.course_id=c.id
可以理解為student
和student_course
左連線查詢之後的結果集再對course
右連線查詢。
6.小結
本小節介紹瞭如何使用 LEFT JOIN
、INNER JOIN
、RIGHT JOIN
對錶資料進行連線查詢,需要注意的是,ON
後面的表示對連表條件,並且還能對錶連線查詢的結果集用 WHERE
進行篩選,例如:
SELECT * FROM
student a
LEFT JOIN
student_course b
ON a.id=b.student_id
RIGHT JOIN
course c
ON b.course_id=c.id
INNER JOIN teacher d
ON c.teacher_id=d.id
WHERE a.age > 18 AND d.age < 55;
以上 sql 語句後面使用了 WHERE
條件篩選,表示學生年齡大於 18,教師年齡小於 55。