靈活運用 SQL 語句是資料庫開發者進階的關鍵。本文收錄多個實戰常見場景的經典語句,涵蓋複製表結構、資料遷移、外部連接、排程提醒、關聯刪除、複雜統計等,助您快速解決棘手需求。
SELECT * INTO 新表 FROM 舊表 WHERE 1 <> 1;
WHERE 1 <> 1 恆為假,僅複製結構。
INSERT INTO 目標表 (欄位A, 欄位B, 欄位C)
SELECT 欄位D, 欄位E, 欄位F FROM 來源表;
SELECT a.title, a.username, b.adddate
FROM table a,
(SELECT MAX(adddate) AS adddate FROM table WHERE table.title = a.title) b;
SELECT a.欄位1, a.欄位2, a.欄位3, b.欄位C, b.欄位D, b.欄位F
FROM 表A a LEFT OUTER JOIN 表B b ON a.欄位1 = b.欄位C;
SELECT * FROM 排程表
WHERE DATEDIFF(minute, 開始時間, GETDATE()) > 5;
DELETE FROM 主表
WHERE NOT EXISTS (SELECT 1 FROM 副表 WHERE 主表.主鍵 = 副表.外鍵);
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM TABLE1 A,
(SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE AS PREV_UPD_DATE
FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE, 'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X,
(SELECT NUM, UPD_DATE, STOCK_ONHAND
FROM TABLE2
WHERE TO_CHAR(UPD_DATE, 'YYYY/MM') = TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1), 'YYYY/MM')) Y
WHERE X.NUM = Y.NUM(+)
AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND, 0) <> X.STOCK_ONHAND) B
WHERE A.NUM = B.NUM;
示範 Oracle 外部連接 (+)、日期截斷、NVL 空值處理等技巧。
SELECT * FROM 學生資訊表
WHERE NOT EXISTS (SELECT 1 FROM 學生表 WHERE 學生資訊表.id = 學生表.id)
AND 系名稱 = @部門參數
AND 專業名稱 = @專業參數
ORDER BY 性別, 生源地, 高考總成績;
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear,
SUM(DECODE(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN,
SUM(DECODE(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FEB,
...
FROM 電話費定額表 a, 電話費清單表 b
WHERE ... 關聯條件 ...
GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy');
使用 DECODE/CASE 實現行轉列(Pivot),適用於報表輸出。
ROW_NUMBER()、LAG()、LEAD() 解決排序、同比、環比需求。這些經典語句涵蓋 DDL、DML、查詢、統計等核心場景。建議收藏並在實際專案中嘗試改寫,逐步建立自己的 SQL 模式庫,加速開發並減少錯誤。