In MariaDB, RAND()
is een ingebouwde functie die een willekeurige DOUBLE
. retourneert precisie drijvende-kommawaarde v
in het bereik 0 <= v < 1.0
.
Syntaxis
RAND()
kan op de volgende twee manieren worden gebruikt:
RAND()
RAND(N)
Waar N
is een constant geheel getal dat als startwaarde moet worden gebruikt.
Wanneer een seed-waarde wordt gebruikt, RAND()
produceert een herhaalbare reeks kolomwaarden.
Voorbeeld
Hier is een voorbeeld om RAND()
te demonstreren zonder een startwaarde op te geven:
SELECT RAND();
Resultaat:
+---------------------+ | RAND() | +---------------------+ | 0.14470310708945908 | +---------------------+
Voorbeeld – Met een Zaadje
Hier is een voorbeeld om RAND()
te demonstreren met een seed-waarde:
SELECT RAND(3);
Resultaat:
+--------------------+ | RAND(3) | +--------------------+ | 0.9057697559760601 | +--------------------+
We kunnen het verschil niet echt zien bij het gebruik van het bovenstaande voorbeeld. Om het verschil te zien, moeten we meerdere functieaanroepen doen met dezelfde seed.
Zoals dit:
SELECT
RAND(3),
RAND(3),
RAND(3);
Resultaat:
+--------------------+--------------------+--------------------+ | RAND(3) | RAND(3) | RAND(3) | +--------------------+--------------------+--------------------+ | 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 | +--------------------+--------------------+--------------------+
We kunnen zien dat alle drie de oproepen dezelfde waarde opleverden.
Dit is wat er gebeurt als we de seed-waarde weglaten:
SELECT
RAND(),
RAND(),
RAND();
Resultaat:
+--------------------+---------------------+---------------------+ | RAND() | RAND() | RAND() | +--------------------+---------------------+---------------------+ | 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 | +--------------------+---------------------+---------------------+
Elke oproep retourneert een andere waarde.
Willekeurig geheel getal binnen een bereik
We kunnen RAND()
. combineren met FLOOR()
, samen met een paar berekeningen, om een willekeurig geheel getal binnen een bereik te retourneren.
De syntaxis om dit te doen gaat als volgt:
FLOOR(min_value + RAND() * (max_value - min_value +1))
We kunnen dus het volgende doen om een willekeurig geheel getal tussen 1 en 10 te retourneren:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Resultaat:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 6 | +---------------------------------+
Laten we het wat meer noemen om het willekeurige effect te zien:
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;
Resultaat:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 | +----+----+----+----+----+----+----+----+
Retourneer willekeurige rijen van een tabel
RAND()
kan worden gebruikt in combinatie met een ORDER BY
clausule en de LIMIT
trefwoord om willekeurige rijen uit een databasetabel te retourneren:
SELECT
PetId,
PetName
FROM Pets
ORDER BY RAND()
LIMIT 5;
Voorbeeld resultaat:
+-------+---------+ | PetId | PetName | +-------+---------+ | 5 | Tweet | | 7 | Bark | | 1 | Fluffy | | 8 | Meow | | 3 | Scratch | +-------+---------+
En als ik het opnieuw doe, krijg ik dit:
+-------+---------+ | PetId | PetName | +-------+---------+ | 3 | Scratch | | 8 | Meow | | 4 | Wag | | 7 | Bark | | 6 | Fluffy | +-------+---------+
En zo verder...
Houd er echter rekening mee dat dit behoorlijk intensief is en niet op grotere tafels mag worden gebruikt. Zie Data Sampling:technieken voor het efficiënt vinden van een willekeurige rij op de MariaDB-website voor technieken die meer geschikt zijn voor grotere tabellen.
Niet-numeriek zaad
Hier is een voorbeeld van wat er gebeurt als we een niet-numerieke startwaarde opgeven:
SELECT RAND('five');
Resultaat:
+---------------------+ | RAND('five') | +---------------------+ | 0.15522042769493574 | +---------------------+ 1 row in set, 1 warning (0.000 sec)
Laten we eens kijken naar de waarschuwing:
SHOW WARNINGS;
Resultaat:
+---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'five' | +---------+------+-------------------------------------------+
Dit heeft ook de neiging om hetzelfde resultaat te retourneren, ongeacht welke niet-numerieke seed wordt gebruikt. Als ik er bijvoorbeeld verschillende niet-numerieke zaden op gooi, krijg ik hetzelfde resultaat:
SELECT
RAND('one'),
RAND('two'),
RAND('three');
Resultaat:
+---------------------+---------------------+---------------------+ | RAND('one') | RAND('two') | RAND('three') | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+ 1 row in set, 3 warnings (0.000 sec)
Controleer de waarschuwingen:
SHOW WARNINGS;
Resultaat:
+---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'one' | | Warning | 1292 | Truncated incorrect INTEGER value: 'two' | | Warning | 1292 | Truncated incorrect INTEGER value: 'three' | +---------+------+--------------------------------------------+
Nullargumenten
RAND()
geeft dezelfde waarde terug als de seed null
is :
SELECT
RAND(null),
RAND(null),
RAND(null);
Resultaat:
+---------------------+---------------------+---------------------+ | RAND(null) | RAND(null) | RAND(null) | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+
Hoewel er in dit geval geen waarschuwingen zijn.
Te veel argumenten
RAND()
. aanroepen met te veel argumenten resulteert in een fout:
SELECT RAND(1, 2);
Resultaat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'