題目資料
| TableX | | |
| Code | Name | Age |
| 97001 | 張三 | 22 |
| 97002 | 趙四 | 21 |
| 97003 | 張飛 | 20 |
| 97004 | 李五 | 22 |
| TableY | | |
| Code | Class | Score |
| 97001 | 數學 | 80 |
| 97002 | 計算機 | 59 |
| 97003 | 計算機 | 60 |
| 97004 | 數學 | 55 |
1. 等值連接
-- ANSI-92 標準寫法(推薦)
SELECT X.Name, Y.Class, Y.Score
FROM TableX X
INNER JOIN TableY Y ON X.Code = Y.Code;
-- 老式寫法(等效)
SELECT X.Name, Y.Class, Y.Score
FROM TableX X, TableY Y
WHERE X.Code = Y.Code;
結果:4 筆(每位學生一門課)。
2. 外連接(左連接)
-- 列出所有學生,即使沒有成績也顯示(Class/Score 為 NULL)
SELECT X.Name, Y.Class, Y.Score
FROM TableX X
LEFT JOIN TableY Y ON X.Code = Y.Code;
若 TableX 有 Code=97005 但 TableY 無對應,結果會多一行 Name=新生, Class=NULL, Score=NULL。
Oracle 專用舊語法(了解即可)
-- 左外連接
SELECT X.Name, Y.Class, Y.Score
FROM TableX X, TableY Y
WHERE X.Code = Y.Code(+); -- (+) 在右表 = 左連接
建表腳本(Oracle 11g)
CREATE TABLE TABLEX (CODE VARCHAR2(10) PRIMARY KEY, NAME VARCHAR2(20), AGE NUMBER);
CREATE TABLE TABLEY (CODE VARCHAR2(10), CLASS VARCHAR2(20), SCORE NUMBER, PRIMARY KEY (CODE, CLASS));
INSERT INTO TABLEX VALUES ('97001','張三',22);
INSERT INTO TABLEX VALUES ('97002','趙四',21);
INSERT INTO TABLEX VALUES ('97003','張飛',20);
INSERT INTO TABLEX VALUES ('97004','李五',22);
INSERT INTO TABLEY VALUES ('97001','數學',80);
INSERT INTO TABLEY VALUES ('97002','計算機',59);
INSERT INTO TABLEY VALUES ('97003','計算機',60);
INSERT INTO TABLEY VALUES ('97004','數學',55);
COMMIT;
核心區別
| 連接類型 | 結果行數 | 無匹配時 |
| INNER JOIN | 兩表匹配行 | 不顯示 |
| LEFT JOIN | 左表所有行 | 右表欄位為 NULL |
| RIGHT JOIN | 右表所有行 | 左表欄位為 NULL |
| FULL JOIN | 兩表所有行 | 無匹配側為 NULL |