Công thức
Sử dụng RAND() kết hợp FLOOR() để tạo số nguyên ngẫu nhiên trong khoảng [min, max]:
SELECT FLOOR(RAND() * (max - min + 1) + min) AS random_value;
Ví dụ: Số ngẫu nhiên từ 100 đến 200
mysql> SELECT FLOOR(RAND() * (200 - 100 + 1) + 100) AS RandomValue;
+-------------+ | RandomValue | +-------------+ | 144 | +-------------+ 1 row in set (0.00 sec)
Chạy lại lần 2:
mysql> SELECT FLOOR(RAND() * (200 - 100 + 1) + 100) AS RandomValue;
+-------------+ | RandomValue | +-------------+ | 184 | +-------------+ 1 row in set (0.00 sec)
Giải thích công thức
RAND(): Sinh số thực ngẫu nhiên [0, 1)(max - min + 1): Phạm vi giá trị (kích thước khoảng)RAND() * range: Mở rộng phạm vi thành [0, range)+ min: Dịch chuyển về khoảng [min, max+1)FLOOR(): Làm tròn xuống thành số nguyên [min, max]
Ứng dụng thực tế
Tạo dữ liệu test
INSERT INTO products (name, price)
SELECT CONCAT('Product ', n), FLOOR(RAND() * 900 + 100)
FROM (SELECT 1 n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) t;
Chọn ngẫu nhiên 1 hàng (Random row)
SELECT * FROM ten_bang ORDER BY RAND() LIMIT 1;
Phân ngẫu nhiên dữ liệu (A/B testing)
UPDATE users SET group_name = CASE
WHEN FLOOR(RAND() * 2) = 0 THEN 'A'
ELSE 'B'
END;
Lưu ý hiệu năng
⚠️ ORDER BY RAND() chậm trên bảng lớn!
Thay thế cho bảng > 10k hàng:
Thay thế cho bảng > 10k hàng:
-- Lấy ID min/max trước SELECT @min_id := MIN(id), @max_id := MAX(id) FROM ten_bang; -- Chọn ngẫu nhiên SELECT * FROM ten_bang WHERE id >= FLOOR(RAND() * (@max_id - @min_id + 1) + @min_id) LIMIT 1;
MySQL 8.0: RAND() với seed
-- Kết quả lặp lại được (deterministic) SELECT FLOOR(RAND(12345) * 100) AS deterministic_random;