В 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'