RAND() 返回 0 到 1 之間的隨機浮點數。支援種子參數實現可重複序列,常用於隨機抽樣、打亂順序。
mysql> SELECT RAND(), RAND(), RAND(); +------------------+-----------------+------------------+ | RAND() | RAND() | RAND() | +------------------+-----------------+------------------+ | 0.45464584925645 | 0.1824410643265 | 0.54826780459682 | +------------------+-----------------+------------------+
mysql> SELECT RAND(1), RAND(), RAND(); +------------------+------------------+------------------+ | RAND(1) | RAND() | RAND() | +------------------+------------------+------------------+ | 0.18109050223705 | 0.75023211143001 | 0.20788908117254 | +------------------+------------------+------------------+
同一連接中,首次帶種子調用後,後續無參數 RAND() 產生確定序列。不同連接間相互獨立。
打亂 employee_tbl 行順序:
mysql> SELECT * FROM employee_tbl ORDER BY RAND();
每次執行結果順序不同,適合抽獎、A/B 測試分桶等場景。
ORDER BY RAND() 會導致全表掃描並生成臨時表排序,大表(>1萬行)極慢。WHERE RAND() < 0.01(伯努利採樣)或應用層生成隨機 ID 再 IN 查詢。TABLESAMPLE(實驗特性)或使用 UUID() 排序近似隨機。生成 [min, max] 整數:
SELECT FLOOR(min + RAND() * (max - min + 1));