MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Как работи RAND() в MariaDB

В MariaDB, RAND() е вградена функция, която връща произволен DOUBLE прецизна стойност с плаваща запетая v в диапазона 0 <= v < 1.0 .

Синтаксис

RAND() може да се използва по следните два начина:

RAND()
RAND(N)

Където N е константно цяло число, което да се използва като начална стойност.

Когато се използва начална стойност, RAND() произвежда повтаряща се последователност от стойности на колони.

Пример

Ето пример за демонстрация на RAND() без посочване на начална стойност:

SELECT RAND();

Резултат:

+---------------------+
| RAND()              |
+---------------------+
| 0.14470310708945908 |
+---------------------+

Пример – Със семка

Ето пример за демонстрация на RAND() с начална стойност:

SELECT RAND(3);

Резултат:

+--------------------+
| RAND(3)            |
+--------------------+
| 0.9057697559760601 |
+--------------------+

Всъщност не можем да разберем разликата, когато използваме горния пример. За да видим разликата, трябва да направим множество извиквания на функции, използвайки едно и също начало.

Като това:

SELECT 
    RAND(3),
    RAND(3),
    RAND(3);

Резултат:

+--------------------+--------------------+--------------------+
| RAND(3)            | RAND(3)            | RAND(3)            |
+--------------------+--------------------+--------------------+
| 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 |
+--------------------+--------------------+--------------------+

Можем да видим, че и трите извиквания са довели до една и съща стойност.

Ето какво се случва, когато пропуснем началната стойност:

SELECT 
    RAND(),
    RAND(),
    RAND();

Резултат:

+--------------------+---------------------+---------------------+
| RAND()             | RAND()              | RAND()              |
+--------------------+---------------------+---------------------+
| 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 |
+--------------------+---------------------+---------------------+

Всяко повикване връща различна стойност.

Случайно цяло число в рамките на диапазон

Можем да комбинираме RAND() с FLOOR() , заедно с няколко изчисления, за връщане на произволно цяло число в рамките на диапазон.

Синтаксисът за това е следният:

FLOOR(min_value + RAND() * (max_value - min_value +1))

И така, можем да направим следното, за да върнем произволно цяло число между 1 и 10:

SELECT FLOOR(1 + RAND() * (10 - 1 +1));

Резултат:

+---------------------------------+
| FLOOR(1 + RAND() * (10 - 1 +1)) |
+---------------------------------+
|                               6 |
+---------------------------------+

Нека го наречем още малко, за да видим случайния ефект:

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;

Резултат:

+----+----+----+----+----+----+----+----+
| r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 |
+----+----+----+----+----+----+----+----+
|  3 |  6 | 10 |  4 |  6 | 10 |  1 |  6 |
+----+----+----+----+----+----+----+----+

Връщане на произволни редове от таблица

RAND() може да се използва във връзка с ORDER BY клауза и LIMIT ключова дума за връщане на произволни редове от таблица на база данни:

SELECT  
    PetId,
    PetName
FROM Pets 
ORDER BY RAND() 
LIMIT 5;

Примерен резултат:

+-------+---------+
| PetId | PetName |
+-------+---------+
|     5 | Tweet   |
|     7 | Bark    |
|     1 | Fluffy  |
|     8 | Meow    |
|     3 | Scratch |
+-------+---------+

И ако го стартирам отново, получавам това:

+-------+---------+
| PetId | PetName |
+-------+---------+
|     3 | Scratch |
|     8 | Meow    |
|     4 | Wag     |
|     7 | Bark    |
|     6 | Fluffy  |
+-------+---------+

И така нататък...

Въпреки това, имайте предвид, че това е доста интензивно и не трябва да се използва на по-големи маси. Вижте Извадка от данни:Техники за ефективно намиране на произволен ред на уебсайта на MariaDB за техники, които са по-подходящи за по-големи таблици.

Нечислово начало

Ето пример за това какво се случва, когато предоставим нечислова начална стойност:

SELECT RAND('five');

Резултат:

+---------------------+
| RAND('five')        |
+---------------------+
| 0.15522042769493574 |
+---------------------+
1 row in set, 1 warning (0.000 sec)

Нека видим предупреждението:

SHOW WARNINGS;

Резултат:

+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'five' |
+---------+------+-------------------------------------------+

Също така, това има тенденция да връща един и същ резултат, независимо от това кое нечислово начало се използва. Например, ако хвърля различни нечислови семена към него, получавам същия резултат:

SELECT 
    RAND('one'),
    RAND('two'),
    RAND('three');

Резултат:

+---------------------+---------------------+---------------------+
| RAND('one')         | RAND('two')         | RAND('three')       |
+---------------------+---------------------+---------------------+
| 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 |
+---------------------+---------------------+---------------------+
1 row in set, 3 warnings (0.000 sec)

Проверете предупрежденията:

SHOW WARNINGS;

Резултат:

+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'one'   |
| Warning | 1292 | Truncated incorrect INTEGER value: 'two'   |
| Warning | 1292 | Truncated incorrect INTEGER value: 'three' |
+---------+------+--------------------------------------------+

Нулеви аргументи

RAND() връща същата стойност, когато семето е null :

SELECT 
    RAND(null),
    RAND(null),
    RAND(null);

Резултат:

+---------------------+---------------------+---------------------+
| RAND(null)          | RAND(null)          | RAND(null)          |
+---------------------+---------------------+---------------------+
| 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 |
+---------------------+---------------------+---------------------+

Въпреки че в този случай няма предупреждения.

Твърде много аргументи

Извикване на RAND() с твърде много аргументи води до грешка:

SELECT RAND(1, 2);

Резултат:

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. Как работи TIME_TO_SEC() в MariaDB

  2. Какво представляват временните таблици на MariaDB?

  3. Как CHAR_LENGTH() работи в MariaDB

  4. Как да разположите Open edX MySQL база данни за висока наличност

  5. MariaDB GROUP_CONCAT()