1. 程式人生 > Mysql入門教學 >24 JOIN 表連線

24 JOIN 表連線

前面小節介紹了表的設計三正規化和單表的查詢,本小節介紹如何將通過多個表進行關聯查詢資料,其中連表查詢包括 LEFT JOININNER JOINRIGHT 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 插入資料

因為表 courseteacher_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左連線

以課程表 courseteacher 左連線為例:

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 簡寫為 cteacher t 表示將 teacher 簡寫為 t
  • LEFT JOIN 為左連線,是以左邊的表為’基準’,若右表沒有對應的值,用 NULL 來填補。

3.INNER JOIN內連線

同樣以表 courseteacher 內連線為例:

SELECT c.id AS course_id,c.*,t.* FROM course c INNER JOIN teacher t ON c.teacher_id=t.id;

執行結果如下圖:

圖片描述

TipsINNER JOIN 為內連線,展示的是左右兩表都有對應的資料。

4.RIGHT JOIN右連線

同樣以表 courseteacher 右連線為例:

SELECT c.id AS course_id,c.*,t.* FROM course c RIGHT JOIN teacher t ON c.teacher_id=t.id;

執行結果如下圖:

圖片描述

TipsRIGHT 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 可以理解為 studentstudent_course 左連線查詢之後的結果集再對 course 右連線查詢。

6.小結

本小節介紹瞭如何使用 LEFT JOININNER JOINRIGHT 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。