隨機抽取 N 筆資料是常見需求 (如輪播廣告、推薦樣本)。各資料庫語法差異較大,本文整理 SQL Server、Access、MySQL、Oracle 四大主流資料庫的標準寫法供快速查閱。
| 資料庫 | 語法範例 (取 10 筆) | 核心函數/機制 |
|---|---|---|
| SQL Server | SELECT TOP 10 * FROM TABLE ORDER BY NEWID(); |
NEWID() 產生唯一識別碼 (GUID) 作為隨機排序依據 |
| Access | |
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 限制筆數 |
ORDER BY 隨機函數 會觸發**全表掃描 + 排序**,資料量超過 10 萬筆時效能急劇下降。TABLESAMPLE (SQL Server) / BERNOULLI (Oracle) 區塊抽樣 (非精確筆數)。WHERE RAND() < 0.01 概率掃描 (需配合索引)。r,純 SQL 無法單獨完成。NEWID() 無法設定種子,每次結果不同。若需可重現,可改用 CHECKSUM(NEWID(), 'fixed_seed') 或 RAND(@seed) (但 RAND() 每查詢僅執行一次,不適合 ORDER BY)。DBMS_RANDOM.SEED(val) 可設定種子,後續 DBMS_RANDOM.VALUE 即可重現序列。RAND(seed) 可接受種子參數,ORDER BY RAND(12345) 固定排序結果。