Cú pháp cơ bản
SELECT * FROM bang ORDER BY RAND() LIMIT 1;
Ví dụ: Chọn 1 sinh viên ngẫu nhiên
Dữ liệu
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | John | | 2 | Carol | | 3 | Bob | | 4 | Sam | | 5 | Mike | | 6 | Robert | +-----------+-------------+
Lần 1
mysql> SELECT * FROM selectRandomRecord ORDER BY RAND() LIMIT 1; +-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 3 | Bob | +-----------+-------------+
Lần 2
mysql> SELECT * FROM selectRandomRecord ORDER BY RAND() LIMIT 1; +-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 5 | Mike | +-----------+-------------+
Hiệu năng với bảng lớn
ORDER BY RAND() quét toàn bảng → chậm khi bảng > 10k dòng.
Cách tối ưu cho bảng lớn
-- Lấy ID ngẫu nhiên trong phạm vi SELECT * FROM bang WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM bang))) ORDER BY id LIMIT 1;
Hoặc dùng 2 truy vấn:
-- 1. Lấy count SELECT COUNT(*) INTO @cnt FROM bang; -- 2. Offset ngẫu nhiên SET @offset = FLOOR(RAND() * @cnt); PREPARE stmt FROM 'SELECT * FROM bang LIMIT ?, 1'; EXECUTE stmt USING @offset;
Chọn N bản ghi ngẫu nhiên
SELECT * FROM bang ORDER BY RAND() LIMIT 10;
Lưu ý: RAND() không deterministic. Dùng RAND(seed) để có kết quả lặp lại được (test/debug).