V MariaDB, RAND()
je vestavěná funkce, která vrací náhodný DOUBLE
přesnost s plovoucí desetinnou čárkou v
v rozsahu 0 <= v < 1.0
.
Syntaxe
RAND()
lze použít následujícími dvěma způsoby:
RAND()
RAND(N)
Kde N
je konstantní celé číslo, které se má použít jako počáteční hodnota.
Když je použita počáteční hodnota, RAND()
vytváří opakovatelnou sekvenci hodnot sloupců.
Příklad
Zde je příklad demonstrující RAND()
bez zadání počáteční hodnoty:
SELECT RAND();
Výsledek:
+---------------------+ | RAND() | +---------------------+ | 0.14470310708945908 | +---------------------+
Příklad – Se semínkem
Zde je příklad demonstrující RAND()
s seed value:
SELECT RAND(3);
Výsledek:
+--------------------+ | RAND(3) | +--------------------+ | 0.9057697559760601 | +--------------------+
Při použití výše uvedeného příkladu ve skutečnosti nepoznáme rozdíl. Abychom viděli rozdíl, musíme provést více volání funkcí pomocí stejného seedu.
Takhle:
SELECT
RAND(3),
RAND(3),
RAND(3);
Výsledek:
+--------------------+--------------------+--------------------+ | RAND(3) | RAND(3) | RAND(3) | +--------------------+--------------------+--------------------+ | 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 | +--------------------+--------------------+--------------------+
Vidíme, že všechna tři volání vedla ke stejné hodnotě.
Co se stane, když vynecháme seed hodnotu:
SELECT
RAND(),
RAND(),
RAND();
Výsledek:
+--------------------+---------------------+---------------------+ | RAND() | RAND() | RAND() | +--------------------+---------------------+---------------------+ | 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 | +--------------------+---------------------+---------------------+
Každé volání vrací jinou hodnotu.
Náhodné celé číslo v rozsahu
Můžeme kombinovat RAND()
pomocí FLOOR()
, spolu s několika výpočty, abyste vrátili náhodné celé číslo v rozsahu.
Syntaxe pro to vypadá takto:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Takže bychom mohli udělat následující, abychom vrátili náhodné celé číslo mezi 1 a 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Výsledek:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 6 | +---------------------------------+
Abychom viděli náhodný efekt, nazvěme to ještě:
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;
Výsledek:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 | +----+----+----+----+----+----+----+----+
Vracet náhodné řádky z tabulky
RAND()
lze použít ve spojení s ORDER BY
klauzule a LIMIT
klíčové slovo pro vrácení náhodných řádků z databázové tabulky:
SELECT
PetId,
PetName
FROM Pets
ORDER BY RAND()
LIMIT 5;
Příklad výsledku:
+-------+---------+ | PetId | PetName | +-------+---------+ | 5 | Tweet | | 7 | Bark | | 1 | Fluffy | | 8 | Meow | | 3 | Scratch | +-------+---------+
A když to spustím znovu, dostanu toto:
+-------+---------+ | PetId | PetName | +-------+---------+ | 3 | Scratch | | 8 | Meow | | 4 | Wag | | 7 | Bark | | 6 | Fluffy | +-------+---------+
A tak dále…
Mějte však na paměti, že je to poměrně intenzivní a nemělo by se používat na větších stolech. Viz Vzorkování dat:Techniky pro efektivní hledání náhodného řádku na webu MariaDB, kde najdete techniky vhodnější pro větší tabulky.
Nečíselné semeno
Zde je příklad toho, co se stane, když poskytneme nečíselnou počáteční hodnotu:
SELECT RAND('five');
Výsledek:
+---------------------+ | RAND('five') | +---------------------+ | 0.15522042769493574 | +---------------------+ 1 row in set, 1 warning (0.000 sec)
Podívejme se na varování:
SHOW WARNINGS;
Výsledek:
+---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'five' | +---------+------+-------------------------------------------+
Také to má tendenci vracet stejný výsledek bez ohledu na to, které nečíselné semeno je použito. Například, když na to hodím různá nenumerická semínka, dostanu stejný výsledek:
SELECT
RAND('one'),
RAND('two'),
RAND('three');
Výsledek:
+---------------------+---------------------+---------------------+ | RAND('one') | RAND('two') | RAND('three') | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+ 1 row in set, 3 warnings (0.000 sec)
Zkontrolujte varování:
SHOW WARNINGS;
Výsledek:
+---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'one' | | Warning | 1292 | Truncated incorrect INTEGER value: 'two' | | Warning | 1292 | Truncated incorrect INTEGER value: 'three' | +---------+------+--------------------------------------------+
Nulové argumenty
RAND()
vrátí stejnou hodnotu, když je seed null
:
SELECT
RAND(null),
RAND(null),
RAND(null);
Výsledek:
+---------------------+---------------------+---------------------+ | RAND(null) | RAND(null) | RAND(null) | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+
Ačkoli v tomto případě neexistují žádná varování.
Příliš mnoho argumentů
Volání RAND()
s příliš mnoha argumenty vede k chybě:
SELECT RAND(1, 2);
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'