本文通過一道經典的 Oracle 11g SQL 題目,詳細講解等值連接與左外連接的寫法及結果差異,並提供建表與測試數據腳本,幫助讀者掌握多表查詢核心技巧。
現有兩張表:
樣本數據如下:
TableX:
Code Name Age
97001 張三 22
97002 趙四 21
97003 張飛 20
97004 李五 22
TableY:
Code Class Score
97001 數學 80
97002 計算機 59
97003 計算機 60
97004 數學 55
create table TABLEX (
CODE VARCHAR2(10) not null,
NAME VARCHAR2(20),
AGE NUMBER
);
alter table TABLEX add constraint P_TABLEX primary key (CODE);
create table TABLEY (
CODE VARCHAR2(10) not null,
CLASS VARCHAR2(20) not null,
SCORE NUMBER
);
alter table TABLEY add constraint P_TABLEY primary key (CODE, CLASS);
insert into TABLEX (CODE, NAME, AGE) values ('97001', '張三', 22);
insert into TABLEX (CODE, NAME, AGE) values ('97002', '趙四', 21);
insert into TABLEX (CODE, NAME, AGE) values ('97003', '張飛', 20);
insert into TABLEX (CODE, NAME, AGE) values ('97004', '李五', 22);
commit;
insert into TABLEY (CODE, CLASS, SCORE) values ('97001', '數學', 80);
insert into TABLEY (CODE, CLASS, SCORE) values ('97002', '計算機', 59);
insert into TABLEY (CODE, CLASS, SCORE) values ('97003', '計算機', 60);
insert into TABLEY (CODE, CLASS, SCORE) values ('97004', '數學', 55);
commit;
SELECT NAME, CLASS, SCORE
FROM TABLEX, TABLEY
WHERE TABLEX.CODE = TABLEY.CODE;
結果:僅返回兩表 Code 都存在的 4 條記錄。
SELECT NAME, CLASS, SCORE
FROM TABLEX LEFT JOIN TABLEY ON TABLEX.CODE = TABLEY.CODE;
結果:返回 TableX 所有 4 條記錄,若 TableY 無匹配則 Class、Score 顯示 NULL。
LEFT JOIN ... ON),可讀性更強。