Trong MariaDB, RAND()
là một hàm tích hợp trả về một DOUBLE
ngẫu nhiên giá trị dấu phẩy động chính xác v
trong phạm vi 0 <= v < 1.0
.
Cú pháp
RAND()
có thể được sử dụng theo hai cách sau:
RAND()
RAND(N)
Ở đâu N
là một số nguyên không đổi được sử dụng làm giá trị hạt giống.
Khi một giá trị gốc được sử dụng, RAND()
tạo ra một chuỗi giá trị cột có thể lặp lại.
Ví dụ
Dưới đây là một ví dụ để chứng minh RAND()
mà không chỉ định giá trị gốc:
SELECT RAND();
Kết quả:
+---------------------+ | RAND() | +---------------------+ | 0.14470310708945908 | +---------------------+
Ví dụ - Với một hạt giống
Dưới đây là một ví dụ để chứng minh RAND()
với giá trị hạt giống:
SELECT RAND(3);
Kết quả:
+--------------------+ | RAND(3) | +--------------------+ | 0.9057697559760601 | +--------------------+
Chúng tôi thực sự không thể phân biệt được khi sử dụng ví dụ trên. Để thấy sự khác biệt, chúng ta cần thực hiện nhiều lệnh gọi hàm bằng cách sử dụng cùng một hạt giống.
Như thế này:
SELECT
RAND(3),
RAND(3),
RAND(3);
Kết quả:
+--------------------+--------------------+--------------------+ | RAND(3) | RAND(3) | RAND(3) | +--------------------+--------------------+--------------------+ | 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 | +--------------------+--------------------+--------------------+
Chúng ta có thể thấy rằng cả ba lệnh gọi đều mang lại cùng một giá trị.
Đây là những gì sẽ xảy ra khi chúng tôi bỏ qua giá trị gốc:
SELECT
RAND(),
RAND(),
RAND();
Kết quả:
+--------------------+---------------------+---------------------+ | RAND() | RAND() | RAND() | +--------------------+---------------------+---------------------+ | 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 | +--------------------+---------------------+---------------------+
Mỗi cuộc gọi trả về một giá trị khác nhau.
Số nguyên ngẫu nhiên trong một phạm vi
Chúng ta có thể kết hợp RAND()
với FLOOR()
, cùng với một vài phép tính, để trả về một số nguyên ngẫu nhiên trong một phạm vi.
Cú pháp để thực hiện việc này như sau:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Vì vậy, chúng ta có thể làm như sau để trả về một số nguyên ngẫu nhiên từ 1 đến 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Kết quả:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 6 | +---------------------------------+
Hãy gọi nó là một số khác để xem hiệu ứng ngẫu nhiên:
SELECT
FLOOR(1 + RAND() * (10 - 1 +1)) AS r1,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r2,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r3,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r4,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r5,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r6,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r7,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r8;
Kết quả:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 | +----+----+----+----+----+----+----+----+
Trả về các hàng ngẫu nhiên từ một bảng
RAND()
có thể được sử dụng cùng với ORDER BY
mệnh đề và LIMIT
từ khóa để trả về các hàng ngẫu nhiên từ bảng cơ sở dữ liệu:
SELECT
PetId,
PetName
FROM Pets
ORDER BY RAND()
LIMIT 5;
Kết quả ví dụ:
+-------+---------+ | PetId | PetName | +-------+---------+ | 5 | Tweet | | 7 | Bark | | 1 | Fluffy | | 8 | Meow | | 3 | Scratch | +-------+---------+
Và nếu tôi chạy lại, tôi nhận được điều này:
+-------+---------+ | PetId | PetName | +-------+---------+ | 3 | Scratch | | 8 | Meow | | 4 | Wag | | 7 | Bark | | 6 | Fluffy | +-------+---------+
Và cứ thế…
Mặc dù vậy, hãy nhớ rằng điều này khá nặng và không nên được sử dụng trên các bảng lớn hơn. Xem Lấy mẫu Dữ liệu:Các Kỹ thuật Tìm Hàng Ngẫu nhiên Hiệu quả trên trang web MariaDB để biết các kỹ thuật phù hợp hơn với các bảng lớn hơn.
Hạt giống không phải dạng số
Dưới đây là một ví dụ về những gì sẽ xảy ra khi chúng tôi cung cấp giá trị gốc không phải là số:
SELECT RAND('five');
Kết quả:
+---------------------+ | RAND('five') | +---------------------+ | 0.15522042769493574 | +---------------------+ 1 row in set, 1 warning (0.000 sec)
Hãy xem cảnh báo:
SHOW WARNINGS;
Kết quả:
+---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'five' | +---------+------+-------------------------------------------+
Ngoài ra, điều này có xu hướng trả lại cùng một kết quả, bất kể hạt giống không phải là số nào được sử dụng. Ví dụ:nếu tôi ném các hạt không phải số khác nhau vào nó, tôi nhận được kết quả giống nhau:
SELECT
RAND('one'),
RAND('two'),
RAND('three');
Kết quả:
+---------------------+---------------------+---------------------+ | RAND('one') | RAND('two') | RAND('three') | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+ 1 row in set, 3 warnings (0.000 sec)
Kiểm tra các cảnh báo:
SHOW WARNINGS;
Kết quả:
+---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'one' | | Warning | 1292 | Truncated incorrect INTEGER value: 'two' | | Warning | 1292 | Truncated incorrect INTEGER value: 'three' | +---------+------+--------------------------------------------+
Đối số rỗng
RAND()
trả về cùng một giá trị khi hạt giống null
:
SELECT
RAND(null),
RAND(null),
RAND(null);
Kết quả:
+---------------------+---------------------+---------------------+ | RAND(null) | RAND(null) | RAND(null) | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+
Mặc dù, trong trường hợp này, không có cảnh báo nào.
Quá nhiều đối số
Gọi RAND()
với quá nhiều đối số dẫn đến lỗi:
SELECT RAND(1, 2);
Kết quả:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'