本文延續基礎語法,聚焦「資料表複製與遷移」、「子查詢應用」、「分頁與隨機抽樣」、「中繼資料查詢」四大高頻實戰場景,所有範例附帶可直接執行的測試資料建立腳本,複製即用。
-- 方法 1:WHERE 1&<>1(永假)
SELECT * INTO b FROM a WHERE 1 <> 1;
-- 方法 2:TOP 0(語意更清晰)
SELECT TOP 0 * INTO b FROM a;
兩者皆建立新表 b,結構同 a,零資料列。
-- 目標表不存在:一鍵建表+複製
SELECT * INTO b FROM a;
-- 目標表已存在:INSERT SELECT
INSERT INTO b (id) SELECT id FROM a;
-- 同伺服器不同資料庫:三部份命名法
INSERT INTO TargetDB.dbo.b (id) SELECT id FROM SourceDB.dbo.a;
-- 不同伺服器:需先建立 Linked Server
INSERT INTO [LinkedSrv].TargetDB.dbo.b (id) SELECT id FROM SourceDB.dbo.a;
-- IN:適合小結果集
SELECT * FROM a WHERE id IN (SELECT id FROM b);
-- EXISTS:適合大表關聯,短路優化
SELECT * FROM a WHERE EXISTS (SELECT 1 FROM b WHERE b.id = a.id);
-- 衍生表:子查詢當表用
SELECT * FROM (SELECT TOP 4 * FROM a ORDER BY id) t ORDER BY id DESC; -- 取第 2-4 筆
SELECT a.品名, a.入庫數量, b.最後入庫時間
FROM 測試表 a
JOIN (
SELECT 品名, MAX(入庫時間) AS 最後入庫時間
FROM 測試表 GROUP BY 品名
) b ON a.品名 = b.品名;
BETWEEN **包含** 邊界值;NOT BETWEEN 排除邊界。IN 適用於離散值清單;NOT IN 注意 NULL 陷阱(NULL NOT IN (...) 永傳回 UNKNOWN)。-- 前 3 筆(固定順序)
SELECT TOP (3) * FROM a ORDER BY id;
-- 隨機 3 筆(NEWID() 排序)
SELECT TOP (3) * FROM a ORDER BY NEWID();
-- 分頁通用模式(SQL Server 2012+)
SELECT * FROM a ORDER BY id OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;
-- 所有使用者表
SELECT name FROM sysobjects WHERE type = 'U'; -- 或 sys.tables
-- 指定表所有欄位
SELECT name FROM syscolumns WHERE id = OBJECT_ID('a'); -- 或 sys.columns
| 特性 | TRUNCATE TABLE | DELETE |
|---|---|---|
| 速度 | 極快(最小日誌、釋放頁面) | 逐列刪除、完整日誌 |
| 觸發器 | 不觸發 | 觸發 |
| 身分識別欄位 | 重置種子 | 保留種子 |
| 外鍵限制 | 不可用於被參考表 | 可用 |
| 回滾 | 可(在交易中) | 可 |
SELECT TOP 0 * INTO new FROM oldSELECT * INTO new FROM old / INSERT SELECTIN、大表 EXISTSORDER BY NEWID()OFFSET/FETCH (2012+)TRUNCATE TABLE(注意外鍵)將這些模式內化為肌肉記憶,日常開發效率將大幅提升。