SQL 不僅是查詢語言,更是資料處理的瑞士軍刀。本文匯總多個實戰中高頻、高效的 SQL 寫法,涵蓋建表、複製、刪除、外連接、排程提醒、關聯刪除、分組統計等場景,助你快速解決棘手需求。
-- Oracle / SQL Server 通用
SELECT * INTO new_table FROM source_table WHERE 1 <> 1;
利用永假條件 1<>1 讓查詢不返回任何行,僅建立同結構的空表。
INSERT INTO target_table (col_a, col_b, col_c)
SELECT col_d, col_e, col_f FROM source_table;
指定欄位順序可避免結構不一致報錯。
SELECT a.title, a.username, b.adddate
FROM table_a a,
(SELECT MAX(adddate) AS adddate FROM table_a WHERE table_a.title = a.title) b;
子查詢在關聯條件中引用外層表別名,實現逐行計算最新回覆時間。
SELECT a.a, a.b, a.c, b.c, b.d, b.f
FROM table_a a
LEFT OUTER JOIN table_b b ON a.a = b.c;
優先使用 ANSI 標準語法,可讀性強且避免 Oracle 舊式 (+) 陷阱。
SELECT * FROM schedule
WHERE DATEDIFF(minute, start_time, GETDATE()) > 5;
適用於 SQL Server;MySQL 可用 TIMESTAMPDIFF(MINUTE, start_time, NOW()) > 5。
DELETE FROM info
WHERE NOT EXISTS (SELECT 1 FROM infobz WHERE info.infid = infobz.infid);
NOT EXISTS 配合關聯子查詢,效率優於 NOT IN 且能正確處理 NULL 值。
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;
展示多層子查詢、外連接、日期截取、NVL 空值處理的綜合應用。
SELECT * FROM studentinfo
WHERE NOT EXISTS (SELECT 1 FROM student WHERE studentinfo.id = student.id)
AND department = :dept_name
AND major = :major_name
ORDER BY gender, origin, gaokao_score DESC;
使用參數化查詢防注入,NOT EXISTS 確保高效排除。
掌握這些模式,能將許多原本需要應用層迴圈處理的邏輯下推到資料庫,大幅提升效能與簡潔度。建議收藏備查,實戰中靈活組合。