首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 基礎語法大全:DDL、DML、DCL 與進階查詢完整參考

     編輯:MySQL 資料庫相關知識

系統整理 SQL 三大語言類別(DDL、DML、DCL)核心語法,並收錄聯集/差集/交集、外部聯結、子查詢、分頁、去重、隨機抽樣等 44 種高頻查詢模式,適用於 MySQL、SQL Server、Access 等主流資料庫開發參考。

一、語言分類速覽

  • DDL:CREATE、ALTER、DROP、DECLARE
  • DML:SELECT、DELETE、UPDATE、INSERT
  • DCL:GRANT、REVOKE、COMMIT、ROLLBACK

二、核心 DDL 操作

-- 建立/刪除資料庫
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;

三、基礎 DML 操作

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)可大幅提升效能。

十、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;

十二、ADO Execute 方法與事務處理

-- 查詢返回 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

十三、面試經典題目精選

  1. GROUP BY 橫向轉換:以 SUM(CASE WHEN ...) 或多子查詢 INNER JOIN 實現勝/負場次統計。
  2. 三欄位取最大值:CASE WHEN a>b THEN a ELSE b END 嵌套 CASE WHEN b>c THEN b ELSE c END。
  3. 當天日期記錄:DATEDIFF(dd, SendTime, GETDATE()) = 0。
  4. 分數等級轉換:多欄位 CASE WHEN 並列輸出。
  5. 暫存表區別:#temp(Session 級)、##temp(全域級)。
  6. SQL Server 儲存架構:主資料檔、次資料檔、記錄檔三類檔案支援無限擴充。
  7. 行轉列報表:靜態多表聯結或動態 CASE WHEN MONTH=1 THEN ... 聚合。
  8. 重複 ID 統計:SELECT id, COUNT(*) FROM t GROUP BY id HAVING COUNT(*)>1。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved