系統整理 SQL 三大語言類別(DDL、DML、DCL)核心語法,並收錄聯集/差集/交集、外部聯結、子查詢、分頁、去重、隨機抽樣等 44 種高頻查詢模式,適用於 MySQL、SQL Server、Access 等主流資料庫開發參考。
-- 建立/刪除資料庫
CREATE DATABASE db_name;
DROP DATABASE db_name;
-- 建立資料表
CREATE TABLE tabname(col1 type1 [NOT NULL] [PRIMARY KEY], col2 type2...);
-- 依現有表建立新表
CREATE TABLE tab_new LIKE tab_old;
CREATE TABLE tab_new AS SELECT col1,col2 FROM tab_old DEFINITION ONLY;
-- 刪除資料表
DROP TABLE tabname;
-- 欄位異動
ALTER TABLE tabname ADD COLUMN col type;
ALTER TABLE tabname ADD PRIMARY KEY(col);
ALTER TABLE tabname DROP PRIMARY KEY(col);
-- 索引
CREATE [UNIQUE] INDEX idxname ON tabname(col...);
DROP INDEX idxname;
-- 視圖
CREATE VIEW viewname AS SELECT ...;
DROP VIEW viewname;
SELECT * FROM table1 WHERE 條件;
INSERT INTO table1(field1,field2) VALUES(value1,value2);
DELETE FROM table1 WHERE 條件;
UPDATE table1 SET field1=value1 WHERE 條件;
SELECT * FROM table1 WHERE field1 LIKE '%value1%';
SELECT * FROM table1 ORDER BY field1,field2 [DESC];
SELECT COUNT(*) AS totalcount FROM table1;
SELECT SUM(field1) AS sumvalue FROM table1;
SELECT AVG(field1) AS avgvalue FROM table1;
SELECT MAX(field1) AS maxvalue FROM table1;
SELECT MIN(field1) AS minvalue FROM table1;
-- UNION:聯集(去重),UNION ALL 保留重複
-- EXCEPT:差集(TABLE1 有而 TABLE2 無),EXCEPT ALL 保留重複
-- INTERSECT:交集(兩者皆有),INTERSECT ALL 保留重複
-- 注意:參與運算的查詢欄位數、型別必須一致
-- LEFT OUTER JOIN:左表全部 + 右表匹配
SELECT a.a, a.b, a.c, b.c, b.d, b.f FROM a LEFT OUTER JOIN b ON a.a = b.c;
-- RIGHT OUTER JOIN:右表全部 + 左表匹配
-- FULL OUTER JOIN:兩表全部(MySQL 不支援,需 UNION 模擬)
-- 只複製結構
SELECT * INTO b FROM a WHERE 1<>1; -- Access/SQL Server
SELECT TOP 0 * INTO b FROM a; -- SQL Server
-- 複製資料
INSERT INTO b(a,b,c) SELECT d,e,f FROM a;
-- 跨資料庫複製
INSERT INTO b(a,b,c) SELECT d,e,f FROM a IN '完整路徑' WHERE 條件;
SELECT a,b,c FROM a WHERE a IN (SELECT d FROM b);
SELECT a,b,c FROM a WHERE a IN (1,2,3);
-- 顯示文章、提交人、最後回覆時間
SELECT a.title, a.username, b.adddate
FROM table a,
(SELECT MAX(adddate) adddate FROM table WHERE table.title=a.title) b;
| 需求 | SQL 範例 |
|---|---|
| BETWEEN 範圍查詢(含邊界) | SELECT * FROM t WHERE time BETWEEN t1 AND t2; |
| IN / NOT IN 列表匹配 | SELECT * FROM t WHERE a IN ('v1','v2'); |
| 刪除主表中副表無對應資料 | DELETE FROM t1 WHERE NOT EXISTS (SELECT * FROM t2 WHERE t1.f1=t2.f1); |
| 四表聯結 | SELECT * FROM a LEFT JOIN b ON a.a=b.b RIGHT JOIN c ON a.a=c.c INNER JOIN d ON a.a=d.d WHERE ...; |
| 提前 5 分鐘提醒 | SELECT * FROM schedule WHERE DATEDIFF(minute, start_time, GETDATE()) > 5; |
| 分頁(通用) | SELECT * FROM t ORDER BY id LIMIT offset, page_size; |
| 前 10 筆 | SELECT TOP 10 * FROM t WHERE ...; |
| 每組最大值記錄 | SELECT a,b,c FROM t ta WHERE a=(SELECT MAX(a) FROM t tb WHERE tb.b=ta.b); |
| 多重 EXCEPT | (SELECT a FROM A) EXCEPT (SELECT a FROM B) EXCEPT (SELECT a FROM C); |
| 隨機 10 筆 | SELECT TOP 10 * FROM t ORDER BY NEWID(); |
| 刪除重複(保留最大 ID) | DELETE FROM t WHERE id NOT IN (SELECT MAX(id) FROM t GROUP BY col1,col2...); |
| 列出所有表名 | SELECT name FROM sysobjects WHERE type='U'; |
| 列出表欄位 | SELECT name FROM syscolumns WHERE id=OBJECT_ID('TableName'); |
| CASE 條件聚合 | SELECT type, SUM(CASE vender WHEN 'A' THEN pcs ELSE 0 END)... GROUP BY type; |
| 清空表(保留結構) | TRUNCATE TABLE table1; |
| 取第 10-15 筆 | SELECT TOP 5 * FROM (SELECT TOP 15 * FROM t ORDER BY id ASC) t_alias ORDER BY id DESC; |
應用層迴圈比對 ID 極慢;直接在 SQL 使用 ORDER BY RAND() LIMIT n(MySQL)、ORDER BY NEWID()(SQL Server)、ORDER BY RND(id)(Access)可大幅提升效能。
SELECT table1.fd1, table1.fd2, table2.fd2
FROM table1 LEFT JOIN table2 ON table1.fd1 = table2.fd1 WHERE ...;
-- SQL Server
SELECT CASE WHEN LEN(field)>10 THEN LEFT(field,10)+'...' ELSE field END AS news_name, news_id FROM tablename;
-- Access
SELECT IIF(LEN(field)>2, LEFT(field,2)+'...', field) FROM tablename;
-- 查詢返回 Recordset
Set rs = conn.Execute("SELECT ...")
-- 執行動作查詢
conn.Execute "UPDATE ...", RecordsAffected, adCmdText
-- 事務控制
conn.BeginTrans
' ... SQL 陳述式 ...
If conn.Errors.Count = 0 Then conn.CommitTrans Else conn.RollbackTrans
SUM(CASE WHEN ...) 或多子查詢 INNER JOIN 實現勝/負場次統計。CASE WHEN a>b THEN a ELSE b END 嵌套 CASE WHEN b>c THEN b ELSE c END。DATEDIFF(dd, SendTime, GETDATE()) = 0。CASE WHEN 並列輸出。#temp(Session 級)、##temp(全域級)。CASE WHEN MONTH=1 THEN ... 聚合。SELECT id, COUNT(*) FROM t GROUP BY id HAVING COUNT(*)>1。