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

各主流資料庫隨機抽樣查詢 SQL 寫法速查表

     編輯:關於SqlServer

隨機抽取 N 筆資料是常見需求 (如輪播廣告、推薦樣本)。各資料庫語法差異較大,本文整理 SQL Server、Access、MySQL、Oracle 四大主流資料庫的標準寫法供快速查閱。

快速對照表

資料庫語法範例 (取 10 筆)核心函數/機制
SQL Server SELECT TOP 10 * FROM TABLE ORDER BY NEWID(); NEWID() 產生唯一識別碼 (GUID) 作為隨機排序依據
Access
Dim r
Randomize
r = Rnd
sql = "SELECT TOP 10 * FROM table ORDER BY Rnd(" & r & "-id)"
' id 為自動編號欄位,可換成其他數值欄位如 Len(UserName)
VBA Rnd() 搭配隨機種子,需在應用層產生 r 變數
MySQL SELECT * FROM TABLE ORDER BY RAND() LIMIT 10; RAND() 函數產生 0~1 隨機浮點數排序
Oracle SELECT * FROM (SELECT * FROM t ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM < 10; DBMS_RANDOM.VALUE 套件函數 + 子查詢配合 ROWNUM 限制筆數

效能與適用性提醒

  • SQL Server / MySQL / Oracle: ORDER BY 隨機函數 會觸發**全表掃描 + 排序**,資料量超過 10 萬筆時效能急劇下降。
  • 大數據量優化替代方案:
    • 預先產生隨機主鍵清單 (應用層或排程表)。
    • 使用 TABLESAMPLE (SQL Server) / BERNOULLI (Oracle) 區塊抽樣 (非精確筆數)。
    • MySQL: WHERE RAND() < 0.01 概率掃描 (需配合索引)。
  • Access: 需在應用程式 (VBA/ASP) 端產生隨機種子 r,純 SQL 無法單獨完成。

進階:可重現的隨機抽樣 (設定種子)

  • SQL Server: NEWID() 無法設定種子,每次結果不同。若需可重現,可改用 CHECKSUM(NEWID(), 'fixed_seed') 或 RAND(@seed) (但 RAND() 每查詢僅執行一次,不適合 ORDER BY)。
  • Oracle: DBMS_RANDOM.SEED(val) 可設定種子,後續 DBMS_RANDOM.VALUE 即可重現序列。
  • MySQL: RAND(seed) 可接受種子參數,ORDER BY RAND(12345) 固定排序結果。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved