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

SQL Server 基礎語法實戰範例集(二):資料複製、子查詢、分頁與隨機抽樣

     編輯:關於SqlServer

實戰場景導向的 T-SQL 技巧集錦

本文延續基礎語法,聚焦「資料表複製與遷移」、「子查詢應用」、「分頁與隨機抽樣」、「中繼資料查詢」四大高頻實戰場景,所有範例附帶可直接執行的測試資料建立腳本,複製即用。

一、只複製結構(不複製資料)

-- 方法 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 / EXISTS / 衍生表

-- 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 與 IN

  • 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 vs DELETE

特性TRUNCATE TABLEDELETE
速度極快(最小日誌、釋放頁面)逐列刪除、完整日誌
觸發器不觸發觸發
身分識別欄位重置種子保留種子
外鍵限制不可用於被參考表可用
回滾可(在交易中)可

十、總結速查卡

  • 只複製結構 → SELECT TOP 0 * INTO new FROM old
  • 複製資料 → SELECT * INTO new FROM old / INSERT SELECT
  • 跨庫 → 三部份命名 / Linked Server
  • 子查詢 → 小集合 IN、大表 EXISTS
  • 隨機抽樣 → ORDER BY NEWID()
  • 分頁 → OFFSET/FETCH (2012+)
  • 清空大表 → TRUNCATE TABLE(注意外鍵)

將這些模式內化為肌肉記憶,日常開發效率將大幅提升。

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