I MariaDB, RAND()
är en inbyggd funktion som returnerar en slumpmässig DOUBLE
precisionsflyttalsvärde v
i intervallet 0 <= v < 1.0
.
Syntax
RAND()
kan användas på följande två sätt:
RAND()
RAND(N)
Där N
är ett konstant heltal som ska användas som ett startvärde.
När ett frövärde används, RAND()
producerar en repeterbar sekvens av kolumnvärden.
Exempel
Här är ett exempel för att demonstrera RAND()
utan att ange ett startvärde:
SELECT RAND();
Resultat:
+---------------------+ | RAND() | +---------------------+ | 0.14470310708945908 | +---------------------+
Exempel – med ett frö
Här är ett exempel för att demonstrera RAND()
med ett frövärde:
SELECT RAND(3);
Resultat:
+--------------------+ | RAND(3) | +--------------------+ | 0.9057697559760601 | +--------------------+
Vi kan faktiskt inte se skillnaden när vi använder exemplet ovan. För att se skillnaden måste vi göra flera funktionsanrop med samma frö.
Så här:
SELECT
RAND(3),
RAND(3),
RAND(3);
Resultat:
+--------------------+--------------------+--------------------+ | RAND(3) | RAND(3) | RAND(3) | +--------------------+--------------------+--------------------+ | 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 | +--------------------+--------------------+--------------------+
Vi kan se att alla tre samtalen resulterade i samma värde.
Så här händer när vi utelämnar startvärdet:
SELECT
RAND(),
RAND(),
RAND();
Resultat:
+--------------------+---------------------+---------------------+ | RAND() | RAND() | RAND() | +--------------------+---------------------+---------------------+ | 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 | +--------------------+---------------------+---------------------+
Varje anrop returnerar ett annat värde.
Slumpmässigt heltal inom ett intervall
Vi kan kombinera RAND()
med FLOOR()
, tillsammans med några beräkningar, för att returnera ett slumpmässigt heltal inom ett intervall.
Syntaxen för att göra detta ser ut så här:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Så vi kan göra följande för att returnera ett slumpmässigt heltal mellan 1 och 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Resultat:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 6 | +---------------------------------+
Låt oss kalla det lite mer för att se den slumpmässiga effekten:
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;
Resultat:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 | +----+----+----+----+----+----+----+----+
Returnera slumpmässiga rader från en tabell
RAND()
kan användas tillsammans med en ORDER BY
satsen och LIMIT
nyckelord för att returnera slumpmässiga rader från en databastabell:
SELECT
PetId,
PetName
FROM Pets
ORDER BY RAND()
LIMIT 5;
Exempelresultat:
+-------+---------+ | PetId | PetName | +-------+---------+ | 5 | Tweet | | 7 | Bark | | 1 | Fluffy | | 8 | Meow | | 3 | Scratch | +-------+---------+
Och om jag kör det igen får jag det här:
+-------+---------+ | PetId | PetName | +-------+---------+ | 3 | Scratch | | 8 | Meow | | 4 | Wag | | 7 | Bark | | 6 | Fluffy | +-------+---------+
Och så vidare...
Kom dock ihåg att detta är ganska intensivt och inte bör användas på större bord. Se Datasampling:Techniques for Efficiently Finding a Random Row på MariaDB-webbplatsen för tekniker som är mer lämpade för större tabeller.
Icke-numeriskt frö
Här är ett exempel på vad som händer när vi tillhandahåller ett icke-numeriskt startvärde:
SELECT RAND('five');
Resultat:
+---------------------+ | RAND('five') | +---------------------+ | 0.15522042769493574 | +---------------------+ 1 row in set, 1 warning (0.000 sec)
Låt oss se varningen:
SHOW WARNINGS;
Resultat:
+---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'five' | +---------+------+-------------------------------------------+
Detta tenderar också att ge samma resultat, oavsett vilket icke-numeriskt frö som används. Till exempel, om jag kastar olika icke-numeriska frön på det, får jag samma resultat:
SELECT
RAND('one'),
RAND('two'),
RAND('three');
Resultat:
+---------------------+---------------------+---------------------+ | RAND('one') | RAND('two') | RAND('three') | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+ 1 row in set, 3 warnings (0.000 sec)
Kontrollera varningarna:
SHOW WARNINGS;
Resultat:
+---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'one' | | Warning | 1292 | Truncated incorrect INTEGER value: 'two' | | Warning | 1292 | Truncated incorrect INTEGER value: 'three' | +---------+------+--------------------------------------------+
Nollargument
RAND()
returnerar samma värde när fröet är null
:
SELECT
RAND(null),
RAND(null),
RAND(null);
Resultat:
+---------------------+---------------------+---------------------+ | RAND(null) | RAND(null) | RAND(null) | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+
Även om det i det här fallet inte finns några varningar.
För många argument
Anropar RAND()
med för många argument resulterar i ett fel:
SELECT RAND(1, 2);
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'