| ID | NAME | SUBJECT | SCORE |
|---|---|---|---|
| 1 | 張三 | 語文 | 90 |
| 2 | 張三 | 數學 | 80 |
| 3 | 李四 | 語文 | 99 |
| 4 | 李四 | 數學 | 78 |
| 5 | 張三 | 英語 | 89 |
| NAME | 語文 | 數學 | 英語 |
|---|---|---|---|
| 張三 | 90 | 80 | 89 |
| 李四 | 99 | 78 | - |
SELECT NAME,
SUM(DECODE(SUBJECT, '語文', SCORE, NULL)) AS 語文,
SUM(DECODE(SUBJECT, '數學', SCORE, NULL)) AS 數學,
SUM(DECODE(SUBJECT, '英語', SCORE, NULL)) AS 英語
FROM A
GROUP BY NAME;
DECODE(SUBJECT, '語文', SCORE, NULL):科目匹配時取分數,否則 NULLSUM(...):同一學生同科目可能多筆 (取總和),NULL 不參與加總GROUP BY NAME:按學生分組,產生一行11g+ 新語法: 可使用標準
PIVOT子句:SELECT * FROM A PIVOT (SUM(SCORE) FOR SUBJECT IN ('語文','數學','英語')),語法更直觀。
僅回傳兩表符合條件的匹配行
-- 舊式寫法
SELECT * FROM A A, B B WHERE A.ID = B.AID;
-- ANSI SQL-92 標準寫法 (推薦)
SELECT * FROM A A INNER JOIN B B ON A.ID = B.AID;
保留左表 (A) 所有行,右表 (B) 無匹配則為 NULL
SELECT * FROM A A LEFT JOIN B B ON (A.ID = B.AID);
-- LEFT OUTER JOIN 同義,OUTER 可省略
保留右表所有行,左表無匹配則為 NULL
SELECT * FROM A A RIGHT JOIN B B ON (A.ID = B.AID);
保留兩表所有行,無匹配處以 NULL 填補
SELECT * FROM A A FULL OUTER JOIN B B ON (A.ID = B.AID);
無 ON 條件,回傳兩表行數乘積
SELECT * FROM A CROSS JOIN B;
| JOIN 類型 | 保留左表 | 保留右表 | 典型用途 |
|---|---|---|---|
| INNER JOIN | 否 | 否 | 關聯查詢、主從表明細 |
| LEFT JOIN | 是 | 否 | 主表帶明細、缺漏分析 |
| RIGHT JOIN | 否 | 是 | 同 LEFT,視角互換 |
| FULL OUTER JOIN | 是 | 是 | 資料對帳、差異比對 |
| CROSS JOIN | 全排列 | 全排列 | 組合生成、測試資料 |
DECODE/CASE 條件聚合 + GROUP BY,11g+ 建議用 PIVOTINNER/LEFT/RIGHT/FULL JOIN ... ON),可讀性與可攜性優於舊式 WHERE 條件寫法