ฟังก์ชัน RAND() ใน MySQL สุ่มค่าทศนิยมระหว่าง 0 ถึง 1 (0 ≤ RAND() < 1) เพื่อสุ่มจำนวนเต็มในช่วงที่ต้องการ ให้ใช้สูตรคณิตศาสตร์ร่วมกับ FLOOR()
สูตรสุ่มจำนวนเต็มในช่วง [min, max]
FLOOR(min + RAND() * (max - min + 1))
ตัวอย่าง: สุ่มเลข 1 ถึง 14
1. สร้างตารางและเพิ่มข้อมูลตัวเลข 1-14
mysql> CREATE TABLE RandomIntegerDemo (Number INT);
Query OK, 0 rows affected (0.61 sec)
mysql> INSERT INTO RandomIntegerDemo VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14);
Query OK, 14 rows affected (0.14 sec)
2. สุ่มค่าใหม่สำหรับแต่ละแถว
mysql> SELECT Number, (FLOOR(1 + RAND() * 14)) AS RandomValue
-> FROM RandomIntegerDemo
-> LIMIT 0, 14;
+--------+-------------+
| Number | RandomValue |
+--------+-------------+
| 1 | 9 |
| 2 | 8 |
| 3 | 13 |
| 4 | 13 |
| 5 | 10 |
| 6 | 10 |
| 7 | 7 |
| 8 | 3 |
| 9 | 8 |
| 10 | 2 |
| 11 | 14 |
| 12 | 6 |
| 13 | 3 |
| 14 | 9 |
+--------+-------------+
14 rows in set (0.00 sec)
การใช้งานจริง: สุ่มลำดับแถว (Random Order)
SELECT * FROM your_table ORDER BY RAND() LIMIT 10;
เหมาะสำหรับ: แสดงสินค้าสุ่ม, แบบสำรวจสุ่ม, A/B testing
การใช้ SEED เพื่อผลลัพธ์ที่ทำซ้ำได้
SELECT RAND(42); -- จะได้ค่าเดิมทุกครั้งที่ใช้ SEED เดียวกัน
ใช้ในการทดสอบหรือ Debug ที่ต้องการผลลัพธ์ซ้ำได้
ข้อควรระวังด้านประสิทธิภาพ
ORDER BY RAND()ช้ามากสำหรับตารางใหญ่ (Full table scan + filesort)- สำหรับตารางใหญ่ ควรสุ่ม Primary Key แล้ว JOIN กลับมา แทน
RAND()เรียกใหม่ทุกแถว ไม่สามารถใช้ Index ได้
ฟังก์ชันสุ่มอื่นๆ
RANDOM_BYTES(len)- สุ่มไบต์ (สำหรับ token, salt)UUID()- สร้าง UUID v1UUID_SHORT()- สร้าง 64-bit unique ID