本文彙整 SQL Server 常用 T-SQL 指令分類速查,涵蓋資料操作、定義、控制、交易、程序化 SQL、變數、流程控制、查詢、統計、日期、系統函數等核心語法,適合開發與維護時快速查閱。
| 分類 | 關鍵字 | 說明 |
|---|---|---|
| DML 資料操作 | SELECT, INSERT, UPDATE, DELETE, MERGE | 查詢、新增、修改、刪除、合併資料列 |
| DDL 資料定義 | CREATE/ALTER/DROP TABLE/VIEW/INDEX/PROCEDURE/TRIGGER/SCHEMA/DOMAIN | 建立、修改、刪除資料庫結構物件 |
| DCL 資料控制 | GRANT, DENY, REVOKE | 授予、拒絕、收回權限 |
| TCL 交易控制 | COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION | 提交、回滾、儲存點、設定交易特性 |
| 程序化 SQL | DECLARE, OPEN, FETCH, CLOSE, PREPARE, EXECUTE, DESCRIBE, EXPLAIN | 游標操作、動態 SQL 準備執行 |
-- 區域變數 (批次/程序內)
DECLARE @id CHAR(10);
SET @id = '10010001'; -- 標準賦值
SELECT @id = '10010001'; -- 選賦值 (可同時賦多個)
-- 全域變數 (系統內建,@@ 開頭)
SELECT @@VERSION, @@SERVERNAME, @@ROWCOUNT, @@ERROR, @@IDENTITY, @@TRANCOUNT;
DECLARE @x INT = 1, @y INT = 2, @z INT = 3;
IF @x > @y
PRINT 'x > y';
ELSE IF @y > @z
PRINT 'y > z';
ELSE
PRINT 'z >= y';
-- 簡單 CASE
UPDATE Employee
SET Wage = CASE JobLevel
WHEN 1 THEN Wage * 1.08
WHEN 2 THEN Wage * 1.07
WHEN 3 THEN Wage * 1.06
ELSE Wage * 1.05
END;
-- 搜尋 CASE (條件任意)
UPDATE Employee
SET Bonus = CASE
WHEN Wage > 50000 AND Years > 5 THEN 10000
WHEN Wage > 30000 THEN 5000
ELSE 1000
END;
DECLARE @x INT = 1, @y INT = 1, @c INT;
WHILE @x < 3
BEGIN
PRINT @x;
WHILE @y < 3
BEGIN
SET @c = 100 * @x + @y;
PRINT @c;
SET @y = @y + 1;
END
SET @x = @x + 1;
SET @y = 1;
END
-- 等待 1 小時 2 分 3 秒
WAITFOR DELAY '01:02:03';
SELECT * FROM Employee;
-- 等到 23:08:00 執行
WAITFOR TIME '23:08:00';
SELECT * FROM Employee;
-- 基礎查詢
SELECT col1, col2 FROM Table WHERE col1 = 'value' AND col2 > 100;
-- 模糊查詢
WHERE Name LIKE 'Zhang%' -- 以 Zhang 開頭 (可用索引)
WHERE Name LIKE '%San' -- 以 San 結尾 (掃描)
WHERE Name LIKE '%Li%' -- 包含 Li (掃描)
WHERE Code LIKE '[A-Z]%' -- 字元範圍
WHERE Code LIKE '[^0-9]%' -- 排除數字開頭
-- 範圍與集合
WHERE Age BETWEEN 18 AND 60
WHERE Status IN (1, 2, 5)
WHERE Status NOT IN (3, 4)
-- 排序
ORDER BY CreateDate DESC, Id ASC
ORDER BY 1, 2 -- 按欄位序號
-- 子查詢 (外層用 IN 防多行)
SELECT * FROM Orders WHERE CustId IN (SELECT CustId FROM Customers WHERE City='Taipei');
-- 連接查詢
SELECT * FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.Id = t2.Id; -- 左外部連接
SELECT * FROM Table1 t1 RIGHT JOIN Table2 t2 ON t1.Id = t2.Id; -- 右外部連接
-- 集合運算
SELECT Name FROM Table1 UNION SELECT Name FROM Table2; -- 去重
SELECT Name FROM Table1 UNION ALL SELECT Name FROM Table2; -- 保留重複
-- INSERT
INSERT INTO Table (Col1, Col2) VALUES ('A', 'B');
INSERT INTO Table (Col1, Col2) SELECT Col1, Col2 FROM OtherTable;
-- UPDATE
UPDATE Table SET Col1 = 'New' WHERE Id = 1;
UPDATE Table SET Col1 = DEFAULT, Col2 = NULL, Col3 = Col3 + 5;
-- DELETE
DELETE FROM Table WHERE Id = 1;
TRUNCATE TABLE Table; -- 高速清空,重置 IDENTITY,不觸發 Trigger
DROP TABLE Table; -- 徹底刪除表結構
ALTER TABLE Table ADD NewCol INT NULL;
ALTER TABLE Table DROP CONSTRAINT DF_Table_Col; -- 刪除預設約束
ALTER TABLE Table ALTER COLUMN Col VARCHAR(100) NOT NULL;
-- 間接刪除欄位:建新表 → 複製資料 → 刪舊表 → 改名
CREATE TABLE Table_New (Id INT, Name VARCHAR(50));
INSERT INTO Table_New SELECT Id, Name FROM Table;
DROP TABLE Table;
EXEC sp_rename 'Table_New', 'Table';
| 函數 | 說明 | 範例 |
|---|---|---|
| AVG | 平均值 | SELECT AVG(Wage) FROM Employee GROUP BY DeptId |
| COUNT | 筆數統計 | COUNT(*) 含 NULL / COUNT(Col) 不含 NULL |
| MAX/MIN | 最大/最小值 | SELECT Name FROM Employee WHERE Wage = (SELECT MAX(Wage) FROM Employee) |
| SUM | 加總 | SELECT SUM(Sales) FROM Orders WHERE Year=2023 |
| 函數 | 回傳 | 範例 |
|---|---|---|
| DAY(date) | 日 (1-31) | DAY(GETDATE()) |
| MONTH(date) | 月 (1-12) | MONTH(GETDATE()) |
| YEAR(date) | 年 | YEAR(GETDATE()) |
| DATEADD(interval, number, date) | 新日期 | DATEADD(DAY, 7, GETDATE()) 一週後 |
| DATEDIFF(interval, start, end) | 間隔數 | DATEDIFF(DAY, StartDate, GETDATE()) 天數差 |
| DATENAME(interval, date) | 字串 | DATENAME(MONTH, GETDATE()) → 'January' |
| DATEPART(interval, date) | 整數 | DATEPART(WEEKDAY, GETDATE()) → 2 |
| GETDATE() | 當前日期時間 | SELECT GETDATE() |
interval 單位:year/yy, quarter/qq, month/mm, dayofyear/dy, day/dd, week/wk, weekday/dw, hour/hh, minute/mi, second/ss, millisecond/ms
| 函數 | 用途 | 範例 |
|---|---|---|
| APP_NAME() | 應用程式名稱 | SELECT APP_NAME() |
| COALESCE(v1, v2, ...) | 第一個非 NULL | COALESCE(Phone, Mobile, 'N/A') |
| COL_LENGTH('table', 'col') | 欄位定義長度 | COL_LENGTH('Customers', 'Name') |
| COL_NAME(table_id, col_id) | 欄位名稱 | COL_NAME(OBJECT_ID('Customers'), 3) |
| DATALENGTH(expr) | 實際資料位元組數 | DATALENGTH(N'中文') → 6 |
| DB_ID('dbname') | 資料庫 ID | DB_ID('master') → 1 |
| DB_NAME(db_id) | 資料庫名稱 | DB_NAME(1) → 'master' |
| HOST_NAME() | 用戶端機器名 | SELECT HOST_NAME() |
| ISDATE(expr) | 是否合法日期 | ISDATE('2023-02-30') → 0 |
| ISNULL(expr, replacement) | NULL 替換 | ISNULL(Commission, 0) |
| ISNUMERIC(expr) | 是否數值 | ISNUMERIC('123abc') → 0 |
| NEWID() | 唯一識別碼 | SELECT NEWID() |
| NULLIF(expr1, expr2) | 相等回 NULL | NULLIF(Price, 0) |