T-SQL 指令分類速查
資料操作 (DML)
SELECT, INSERT, UPDATE, DELETE, MERGE, BULK INSERT
資料定義 (DDL)
CREATE/ALTER/DROP DATABASE, TABLE, VIEW, INDEX, PROCEDURE, TRIGGER, FUNCTION, SCHEMA, SYNONYM, TYPE, XML SCHEMA COLLECTION
資料控制 (DCL)
GRANT, DENY, REVOKE
交易控制 (TCL)
BEGIN TRANSACTION, COMMIT, ROLLBACK, SAVE TRANSACTION, SET TRANSACTION ISOLATION LEVEL
程序化 SQL / 游標
DECLARE @var, SET/SELECT @var=..., IF/ELSE, CASE, WHILE/BREAK/CONTINUE, WAITFOR, TRY/CATCH, THROW, RAISERROR, PRINT, DECLARE CURSOR, OPEN, FETCH, CLOSE, DEALLOCATE, EXEC/sp_executesql
變數與流程控制範例
區域變數
DECLARE @id CHAR(10);
SELECT @id = '10010001'; -- 或 SET @id = '10010001'
全域變數 (系統函數)
@@ROWCOUNT, @@IDENTITY, @@ERROR, @@TRANCOUNT, @@VERSION, @@SERVERNAME, GETDATE() -- 實為函數
條件判斷
IF @x > @y PRINT 'x > y'
ELSE IF @y > @z PRINT 'y > z'
ELSE PRINT 'z >= y';
CASE 運算式
UPDATE Employee SET Wage = CASE
WHEN JobLevel = 1 THEN Wage * 1.08
WHEN JobLevel = 2 THEN Wage * 1.07
WHEN JobLevel = 3 THEN Wage * 1.06
ELSE Wage * 1.05 END;
迴圈控制
WHILE @i < 10 BEGIN
IF @i = 5 BREAK;
IF @i = 3 BEGIN SET @i += 1; CONTINUE; END
PRINT @i; SET @i += 1;
END;
WAITFOR DELAY '00:00:10'; -- 等待 10 秒
WAITFOR TIME '23:59:00'; -- 等待至指定時間
核心內建函數分類
彙總函數
AVG, COUNT, COUNT_BIG, SUM, MIN, MAX, STDEV, STDEVP, VAR, VARP, CHECKSUM_AGG
數學/三角函數
ABS, SIGN, ROUND, FLOOR, CEILING, POWER, SQRT, EXP, LOG, LOG10, PI, RAND, SIN, COS, TAN, ASIN, ACOS, ATAN, ATN2, DEGREES, RADIANS
字串函數
| 函數 | 用途 |
| LEN / DATALENGTH | 字元數 / 儲存位元組數 |
| SUBSTRING, LEFT, RIGHT | 擷取子字串 |
| CHARINDEX, PATINDEX | 搜尋位置 (支援萬用字元 PATINDEX) |
| REPLACE, STUFF | 取代 / 刪除並插入 |
| LTRIM, RTRIM, TRIM (2017+) | 移除前後空白 |
| UPPER, LOWER | 大小寫轉換 |
| REPLICATE, SPACE | 重複字串 / 產生空白 |
| REVERSE | 反轉字串 |
| QUOTENAME | 加上分隔符 (防注入) |
| CONCAT, CONCAT_WS (2017+) | 安全串聯 (自動處理 NULL) |
| STRING_AGG (2017+) | 群組串聯彙總 |
| FORMAT (2012+) | .NET 格式化 (文化特性) |
型別轉換
CAST(expr AS datatype) -- ANSI 標準
CONVERT(datatype, expr, style) -- T-SQL 擴充,支援日期格式 style
TRY_CAST / TRY_CONVERT (2012+) -- 失敗回傳 NULL 不報錯
日期時間函數
| 函數 | 說明 |
| GETDATE() / SYSDATETIME() | 當前日期時間 (低/高精度) |
| DATEADD(datepart, number, date) | 日期加減 |
| DATEDIFF(datepart, start, end) | 日期差值 |
| DATENAME / DATEPART | 取得名稱/整數部分 (年月日等) |
| EOMONTH (2012+) | 月份最後一天 |
| DATEFROMPARTS / DATETIMEFROMPARTS | 由組件建構日期 |
| SWITCHOFFSET / TODATETIMEOFFSET | 時區偏移處理 |
系統/中繼資料函數
OBJECT_ID, OBJECT_NAME, OBJECT_SCHEMA_NAME, DB_ID, DB_NAME, FILE_ID, FILE_NAME, INDEX_COL, COL_NAME, COL_LENGTH, TYPE_ID, TYPE_NAME, SCHEMA_ID, SCHEMA_NAME, USER_NAME, HOST_NAME, APP_NAME, CONNECTIONPROPERTY, SERVERPROPERTY
條件/邏輯函數
ISNULL(check, replacement) -- 非 NULL 回傳本身,NULL 回傳替代值
COALESCE(expr1, expr2, ...) -- 回傳第一個非 NULL (ANSI)
NULLIF(expr1, expr2) -- 相等回傳 NULL,否則 expr1
IIF(condition, true, false) -- 簡易三元 (2012+)
CHOOSE(index, val1, val2, ...) -- 索引選值 (2012+)
JOIN 與集合運算
-- 內連接
SELECT * FROM T1 JOIN T2 ON T1.id = T2.id;
-- 外連接
SELECT * FROM T1 LEFT JOIN T2 ON T1.id = T2.id;
SELECT * FROM T1 RIGHT JOIN T2 ON T1.id = T2.id;
SELECT * FROM T1 FULL JOIN T2 ON T1.id = T2.id;
-- 交叉連接 (笛卡兒積)
SELECT * FROM T1 CROSS JOIN T2;
-- 集合運算
SELECT col FROM T1 UNION SELECT col FROM T2; -- 去重
SELECT col FROM T1 UNION ALL SELECT col FROM T2; -- 保留重複
SELECT col FROM T1 INTERSECT SELECT col FROM T2; -- 交集
SELECT col FROM T1 EXCEPT SELECT col FROM T2; -- 差集 (T1 有 T2 無)