抽獎、推薦、測試數據抽樣、A/B 實驗分桶……隨機抽取 N 條記錄是高頻需求。各大數據庫語法略有差異,本文匯總備查。
| 數據庫 | 語法 | 關鍵函數/關鍵字 | 備註 |
|---|---|---|---|
| SQL Server | SELECT TOP N * FROM table ORDER BY NEWID(); |
NEWID() 生成唯一標識符 |
每行生成一個 GUID 再排序,大表性能一般 |
| Access | SELECT TOP N * FROM table ORDER BY Rnd(ID); |
Rnd(數值字段) |
ID 可換任意數值列,如 Rnd(Len(UserName)) |
| MySQL | SELECT * FROM table ORDER BY RAND() LIMIT N; |
RAND() + LIMIT |
大表慎用,全表掃描+臨時表+文件排序 |
| PostgreSQL | SELECT * FROM table ORDER BY RANDOM() LIMIT N; |
RANDOM() + LIMIT |
同 MySQL,大表建議 TABLESAMPLE 或主鍵範圍隨機 |
WHERE ID >= (SELECT CAST(RAND() * (SELECT MAX(ID) FROM table) AS INT)) ORDER BY ID OFFSET 0 ROWS FETCH NEXT N ROWS ONLY(需連續主鍵)。TABLESAMPLE SYSTEM (10) 伯努利採樣,或先隨機主鍵再 IN 查詢。ORDER BY RAND(),會導致磁盤 I/O 飆升。小表直用標準寫法;大表必須結合業務主鍵分佈設計採樣策略。收藏本表,下次隨機查詢不再查文檔。