介紹如何在 MySQL/MariaDB 資料庫中使用 RAND
函數產生亂數,並用於隨機抽樣選取資料。
建立測試用資料
為了示範 RAND
函數的使用方式,我們先建立測試用的 products
資料表:
-- 建立 products 資料表 CREATE TABLE products ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255), price INT UNSIGNED, PRIMARY KEY (id) );
新增一些測試用的資料:
-- 新增資料 INSERT INTO products (name, price) VALUES ("A031", 320), ("C001", 420), ("B021", 280), ("Y158", 690), ("A202", 195), ("D022", 540);
顯示所有資料:
-- 顯示所有資料 SELECT * FROM products;
+----+------+-------+ | id | name | price | +----+------+-------+ | 1 | A031 | 320 | | 2 | C001 | 420 | | 3 | B021 | 280 | | 4 | Y158 | 690 | | 5 | A202 | 195 | | 6 | D022 | 540 | +----+------+-------+
RAND
產生亂數
RAND
函數可以用來產生介於 0
與 1
之間的隨機亂數:
-- 產生介於 0 與 1 之間的亂數 SELECT RAND();
+--------------------+ | RAND() | +--------------------+ | 0.7121299539805669 | +--------------------+
亂數種子
RAND
的參數可用來指定亂數種子,相同的亂數種子就會產生相同的亂數結果(在程式開發與測試階段很有用):
-- 指定亂數種子 SELECT RAND(3);
+--------------------+ | RAND(3) | +--------------------+ | 0.9057697559760601 | +--------------------+
整數亂數
若要產生整數亂數,可以搭配 FLOOR
函數使用:
-- 產生大於或等於 5 且小於或等於 10 的整數亂數 SELECT FLOOR(RAND() * (10 - 5 + 1) + 5);
+----------------------------------+ | FLOOR(RAND() * (10 - 5 + 1) + 5) | +----------------------------------+ | 8 | +----------------------------------+
亂數欄位
若希望在每一筆資料上自動加上一欄亂數欄位,可以這樣寫:
-- 讓資料加上亂數欄位 SELECT id, name, RAND() FROM products;
+----+------+---------------------+ | id | name | RAND() | +----+------+---------------------+ | 1 | A031 | 0.3601633034275503 | | 2 | C001 | 0.18889325315960986 | | 3 | B021 | 0.8639763862490434 | | 4 | Y158 | 0.7532022025000324 | | 5 | A202 | 0.17408188448667702 | | 6 | D022 | 0.6108028456669328 | +----+------+---------------------+
隨機排序資料
RAND
函數可用來將資料的順序打亂:
-- 隨機排序資料 SELECT * FROM products ORDER BY RAND();
+----+------+-------+ | id | name | price | +----+------+-------+ | 4 | Y158 | 690 | | 1 | A031 | 320 | | 6 | D022 | 540 | | 3 | B021 | 280 | | 5 | A202 | 195 | | 2 | C001 | 420 | +----+------+-------+
隨機抽樣資料
將資料的順序打亂之後,只要加上 LIMIT
的限制,就可以用來進行隨機抽樣,自動以亂數挑選指定的樣本數:
-- 隨機抽樣 3 筆資料 SELECT * FROM products ORDER BY RAND() LIMIT 3;
+----+------+-------+ | id | name | price | +----+------+-------+ | 5 | A202 | 195 | | 6 | D022 | 540 | | 1 | A031 | 320 | +----+------+-------+
參考資料:MySQL 官方文件