MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Cách RAND () hoạt động trong MariaDB

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'

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 cách trả lại mã ASCII cho một ký tự đã cho trong MariaDB

  2. MariaDB sắp đến một thành phố gần bạn!

  3. Cài đặt Laravel trên Ubuntu với hỗ trợ Apache, MariaDB và PHP

  4. MariaDB DEFAULT () Giải thích

  5. Cách DATE_FORMAT () hoạt động trong MariaDB