首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server T-SQL 語法大全:DDL/DML/DCL 核心陳述句與進階查詢模式速查手冊

     編輯:關於SqlServer

SQL 語言分類速覽

類別全稱核心關鍵字
DDLData Definition LanguageCREATE, ALTER, DROP, DECLARE
DMLData Manipulation LanguageSELECT, INSERT, UPDATE, DELETE
DCLData Control LanguageGRANT, REVOKE, COMMIT, ROLLBACK

基礎物件管理語法

資料庫操作

-- 建立資料庫
CREATE DATABASE DatabaseName;

-- 刪除資料庫
DROP DATABASE DatabaseName;

-- 備份裝置與備份
USE master;
EXEC sp_addumpdevice 'disk', 'TestBack', 'C:\Backup\MyDB.dat';
BACKUP DATABASE Pub TO TestBack;

資料表操作

-- 建表
CREATE TABLE TabName (
    Col1 Type1 [NOT NULL] [PRIMARY KEY],
    Col2 Type2 [NOT NULL],
    ...
);

-- 依現有表結構建表 (語法因版本異)
-- SQL Server: SELECT * INTO NewTable FROM OldTable WHERE 1=0;
-- 或: CREATE TABLE NewTable LIKE OldTable; (MySQL/PostgreSQL)

-- 刪表
DROP TABLE TabName;

-- 增加欄位 (不可刪欄,型別不可變,僅可擴充 VARCHAR 長度)
ALTER TABLE TabName ADD ColumnName DataType;

-- 主鍵管理
ALTER TABLE TabName ADD PRIMARY KEY (ColName);
ALTER TABLE TabName DROP PRIMARY KEY (ColName);

索引與視圖

-- 建立索引 (唯一/非唯一)
CREATE [UNIQUE] INDEX IdxName ON TabName (Col1, Col2...);

-- 刪除索引
DROP INDEX IdxName ON TabName; -- 或 DROP INDEX TabName.IdxName

-- 視圖
CREATE VIEW ViewName AS SELECT ...;
DROP VIEW ViewName;

核心 DML 單表操作

-- 查詢
SELECT * FROM Table1 WHERE Condition;

-- 新增
INSERT INTO Table1 (Field1, Field2) VALUES (Value1, Value2);

-- 刪除
DELETE FROM Table1 WHERE Condition;

-- 更新
UPDATE Table1 SET Field1 = Value1 WHERE Condition;

-- 模糊查詢
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差集 (在 A 不在 B)預設去重
EXCEPT ALL差集保留重複不去重
INTERSECT交集預設去重
INTERSECT ALL交集保留重複不去重

註:參與運算的查詢欄位數、順序、資料型別必須一致。

外部聯接語法

-- LEFT OUTER JOIN (左聯接)
SELECT A.A, A.B, A.C, B.C, B.D, B.F
FROM TableA A LEFT OUTER JOIN TableB B ON A.A = B.C;

-- RIGHT OUTER JOIN (右聯接)
SELECT A.A, A.B, A.C, B.C, B.D, B.F
FROM TableA A RIGHT OUTER JOIN TableB B ON A.A = B.C;

-- FULL OUTER JOIN (全聯接)
SELECT A.A, A.B, A.C, B.C, B.D, B.F
FROM TableA A FULL OUTER JOIN TableB B ON A.A = B.C;

實用查詢模式庫

1. 複製表結構 (無資料)

SELECT * INTO NewTable FROM OldTable WHERE 1 <> 1;
-- 或
SELECT TOP 0 * INTO NewTable FROM OldTable;

2. 複製資料 (結構已存在)

INSERT INTO TargetTable (ColA, ColB, ColC)
SELECT ColD, ColE, ColF FROM SourceTable;

3. 跨資料庫複製 (Access/舊版語法)

INSERT INTO TargetTable (ColA, ColB, ColC)
SELECT ColD, ColE, ColF 
FROM SourceTable IN 'C:\Path\Data.mdb' WHERE Condition;

4. 子查詢與 IN 條件

SELECT A, B, C FROM TableA 
WHERE A IN (SELECT D FROM TableB);
-- 或靜態清單
WHERE A IN (1, 2, 3);

5. 文章/論壇:標題 + 發文者 + 最後回覆時間

SELECT A.Title, A.UserName, B.LastReplyDate
FROM Articles A
JOIN (SELECT Title, MAX(AddDate) AS LastReplyDate FROM Articles GROUP BY Title) B
  ON A.Title = B.Title;

6. 內聯檢視 / 衍生表

SELECT * FROM (SELECT A, B, C FROM TableA) T WHERE T.A > 1;

7. BETWEEN 邊界語意

-- 包含邊界
SELECT * FROM Table1 WHERE TimeCol BETWEEN '2023-01-01' AND '2023-12-31';
-- 排除邊界
SELECT * FROM Table1 WHERE ColA NOT BETWEEN 10 AND 20;

8. 分頁查詢 (SQL Server 2005/2008 經典寫法)

SELECT TOP 10 B.* 
FROM (
    SELECT TOP 20 PrimaryKey, SortCol FROM TableName ORDER BY SortCol DESC
) A
INNER JOIN TableName B ON B.PrimaryKey = A.PrimaryKey
ORDER BY A.SortCol;

9. 取前 N 筆

SELECT TOP 10 * FROM Table1 WHERE Condition;

10. 分組取最大值完整列 (如月排行榜)

SELECT A, B, C FROM TableName TA
WHERE A = (SELECT MAX(A) FROM TableName TB WHERE TB.B = TA.B);

11. 多重 EXCEPT 排除

(SELECT A FROM TableA) 
EXCEPT (SELECT A FROM TableB) 
EXCEPT (SELECT A FROM TableC);

12. 隨機取樣

-- SQL Server
SELECT TOP 10 * FROM TableName ORDER BY NEWID();

-- MySQL
SELECT * FROM TableName ORDER BY RAND() LIMIT 10;

-- Access
SELECT TOP 10 * FROM TableName ORDER BY RND(ID);

13. 刪除重複資料 (保留最大 ID)

DELETE FROM TableName 
WHERE ID NOT IN (
    SELECT MAX(ID) FROM TableName GROUP BY Col1, Col2, ...
);

14. 系統目錄查詢

-- 所有使用者資料表
SELECT NAME FROM SYSOBJECTS WHERE TYPE = 'U';

-- 指定表的所有欄位
SELECT NAME FROM SYSCOLUMNS WHERE ID = OBJECT_ID('TableName');

15. 條件聚合 / 樞紐分析 (CASE 運算式)

SELECT 
    Type,
    SUM(CASE WHEN Vender = 'A' THEN Pcs ELSE 0 END) AS VenderA,
    SUM(CASE WHEN Vender = 'C' THEN Pcs ELSE 0 END) AS VenderC,
    SUM(CASE WHEN Vender = 'B' THEN Pcs ELSE 0 END) AS VenderB
FROM TableName
GROUP BY Type;

輸出範例:電腦 A=2, B=0, C=0 | 光碟 A=2, B=2, C=0 | 手機 A=0, B=3, C=3

16. 快速清空資料表 (保留結構、重置身分識別)

TRUNCATE TABLE TableName;

17. 取第 10-15 筆 (分頁通用邏輯)

SELECT TOP 5 * FROM (
    SELECT TOP 15 * FROM TableName ORDER BY ID ASC
) T ORDER BY ID DESC;

字串截斷顯示 (列表頁常用)

-- SQL Server / T-SQL
SELECT 
    CASE WHEN LEN(Field) > 10 THEN LEFT(Field, 10) + '...' ELSE Field END AS News_Name,
    News_ID
FROM TableName;

-- Access / Jet SQL
SELECT IIF(LEN(Field) > 2, LEFT(Field, 2) + '...', Field) FROM TableName;

ADO Connection.Execute 方法詳解

查詢類 (返回 Recordset)

Set Rs = Conn.Execute("SELECT * FROM Table")

自動建立 Recordset 物件,查詢結果存入其中。

動作類 (無 Recordset 返回)

Conn.Execute "UPDATE Table SET Col=1", RecordsAffected, adCmdText
  • RecordsAffected:選擇性參數,接收影響列數。
  • adCmdText:告知 ADO 後續字串為命令文本,提升解析效能。

交易控制三部曲

Conn.BeginTrans      ' 開啟交易
' ... 多條 SQL 操作 ...
If Conn.Errors.Count > 0 Then
    Conn.RollbackTrans   ' 任一失敗全盤回滾
Else
    Conn.CommitTrans     ' 全部成功確認提交
End If

交易將一組操作視為原子單位:全成或全敗,確保資料一致性。錯誤資訊可透過 Conn.Errors 集合逐一檢視。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved