student 表
| ID | Name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Cindy |
course 表
| ID | CName |
|---|---|
| 1 | Math |
| 2 | English |
| 4 | Physics |
SELECT * FROM student LEFT JOIN course ON student.ID = course.ID;
| ID | Name | ID | CName |
|---|---|---|---|
| 1 | Alice | 1 | Math |
| 2 | Bob | 2 | English |
| 3 | Cindy | NULL | NULL |
特性:保留左表所有行,右表無匹配則 NULL。一對一時結果行數 = 左表行數。
SELECT * FROM student RIGHT JOIN course ON student.ID = course.ID;
| ID | Name | ID | CName |
|---|---|---|---|
| 1 | Alice | 1 | Math |
| 2 | Bob | 2 | English |
| NULL | NULL | 4 | Physics |
特性:保留右表所有行,左表無匹配則 NULL。
SELECT * FROM student FULL JOIN course ON student.ID = course.ID;
| ID | Name | ID | CName |
|---|---|---|---|
| 1 | Alice | 1 | Math |
| 2 | Bob | 2 | English |
| 3 | Cindy | NULL | NULL |
| NULL | NULL | 4 | Physics |
特性:雙表所有行,無匹配側為 NULL。
SELECT * FROM student INNER JOIN course ON student.ID = course.ID;
-- 等價舊語法:SELECT * FROM student, course WHERE student.ID = course.ID;
| ID | Name | ID | CName |
|---|---|---|---|
| 1 | Alice | 1 | Math |
| 2 | Bob | 2 | English |
特性:僅返回雙方均匹配的行。
SELECT * FROM student CROSS JOIN course; -- 笛卡爾積 3×3=9 行
SELECT * FROM student CROSS JOIN course WHERE student.ID = course.ID; -- 等同 INNER JOIN
特性:無 WHERE 時產生笛卡爾積;有條件時退化為內連接。
student (Sno, Name) —student_course (Sno, Cno) —course (Cno, CName)
SELECT s.Name, c.CName
FROM student_course sc
LEFT JOIN student s ON s.Sno = sc.Sno
LEFT JOIN course c ON c.Cno = sc.Cno;
結果:每行代表一個學生選課記錄,學生與課程可多對多。
| 連接類型 | 關鍵字 | 保留哪側 | 典型用途 |
|---|---|---|---|
| 內連接 | INNER JOIN | 雙方匹配行 | 主從關聯、明細查詢 |
| 左外連接 | LEFT JOIN | 左表全保留 | 主表帶明細、報表列表 |
| 右外連接 | RIGHT JOIN | 右表全保留 | 較少用,可改 LEFT 交換順序 |
| 完全外連接 | FULL JOIN | 雙表全保留 | 資料對帳、差異比對 |
| 交叉連接 | CROSS JOIN | 笛卡爾積 | 生成組合、測試資料 |