I MariaDB, RAND()
er en indbygget funktion, der returnerer en tilfældig DOUBLE
præcision flydende komma værdi v
i området 0 <= v < 1.0
.
Syntaks
RAND()
kan bruges på følgende to måder:
RAND()
RAND(N)
Hvor N
er et konstant heltal, der skal bruges som startværdi.
Når en startværdi bruges, RAND()
producerer en gentagelig sekvens af kolonneværdier.
Eksempel
Her er et eksempel til at demonstrere RAND()
uden at angive en startværdi:
SELECT RAND();
Resultat:
+----------------------------+| RAND() |+----------------------------+| 0,14470310708945908 |+--------------------------+
Eksempel – Med et frø
Her er et eksempel til at demonstrere RAND()
med en frøværdi:
SELECT RAND(3);
Resultat:
+---------------------------+| RAND(3) |+---------------------+| 0,9057697559760601 |+------------------------+
Vi kan faktisk ikke se forskel, når vi bruger ovenstående eksempel. For at se forskellen skal vi lave flere funktionskald ved at bruge det samme frø.
Sådan:
SELECT
RAND(3),
RAND(3),
RAND(3);
Resultat:
+--------------------+--------------------+---- ----------------+| RAND(3) | RAND(3) | RAND(3) |+--------------------+------------------------+-- ------------------+| 0,9057697559760601 | 0,9057697559760601 | 0,9057697559760601 |+------------------------+--------------------+----- ---------------+
Vi kan se, at alle tre opkald resulterede i samme værdi.
Her er, hvad der sker, når vi udelader startværdien:
SELECT
RAND(),
RAND(),
RAND();
Resultat:
+--------------------+---------------------+--- ------------------+| RAND() | RAND() | RAND() |+---------------------+---------------------+-- -------------------+| 0,7037061310407763 | 0,08442136466914915 | 0,31098846095706195 |+-------------------+--------------------------+---- ------------------+
Hvert opkald returnerer en anden værdi.
Tilfældigt heltal inden for et interval
Vi kan kombinere RAND()
med FLOOR()
, sammen med nogle få beregninger, for at returnere et tilfældigt heltal inden for et interval.
Syntaksen for at gøre dette ser sådan ud:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Så vi kunne gøre følgende for at returnere et tilfældigt heltal mellem 1 og 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Resultat:
+--------------------------------+| GULV(1 + RAND() * (10 - 1 +1)) |+-------------------------------- -+| 6 |+----------------------------------------+
Lad os kalde det noget mere for at se den tilfældige effekt:
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 |+----+----+----+----+----+-----+----+----+
Returner tilfældige rækker fra en tabel
RAND()
kan bruges sammen med en ORDER BY
klausulen og LIMIT
nøgleord for at returnere tilfældige rækker fra en databasetabel:
SELECT
PetId,
PetName
FROM Pets
ORDER BY RAND()
LIMIT 5;
Eksempelresultat:
+-------+---------+| PetId | Kæledyrsnavn |+-------+--------+| 5 | Tweet || 7 | Bark || 1 | Fluffy || 8 | Mjav || 3 | Scratch |+-------+---------+
Og hvis jeg kører det igen, får jeg dette:
+-------+---------+| PetId | Kæledyrsnavn |+-------+--------+| 3 | Ridse || 8 | Mjav || 4 | Wag || 7 | Bark || 6 | Fluffy |+-------+---------+
Og så videre...
Husk dog på, at dette er ret intensivt og ikke bør bruges på større borde. Se Datasampling:Teknikker til effektivt at finde en tilfældig række på MariaDB-webstedet for teknikker, der er mere egnede til større tabeller.
Ikke-numerisk frø
Her er et eksempel på, hvad der sker, når vi angiver en ikke-numerisk startværdi:
SELECT RAND('five');
Resultat:
+----------------------------+| RAND('fem') |+----------------------+| 0,15522042769493574 |+---------------------------+1 række i sæt, 1 advarsel (0,000 sek.)
Lad os se advarslen:
SHOW WARNINGS;
Resultat:
+--------+------+------------------------------------- --------------+| Niveau | Kode | Besked |+--------+------+-------------------------------------- --------------+| Advarsel | 1292 | Trunkeret forkert HELTAL-værdi:'fem' |+--------+------+----------------------------- --------------------+
Dette har også en tendens til at returnere det samme resultat, uanset hvilket ikke-numerisk frø der bruges. For eksempel, hvis jeg kaster forskellige ikke-numeriske frø efter det, får jeg det samme resultat:
SELECT
RAND('one'),
RAND('two'),
RAND('three');
Resultat:
+---------------------+---------------------+-- -------------------+| RAND('en') | RAND('to') | RAND('tre') |+----------------------+------------------------ --+----------------------------+| 0,15522042769493574 | 0,15522042769493574 | 0,15522042769493574 |+--------------------------+----------------------+--- ------------------+1 række i sæt, 3 advarsler (0.000 sek.)
Tjek advarslerne:
SHOW WARNINGS;
Resultat:
+--------+------+------------------------------------- ---------------+| Niveau | Kode | Besked |+--------+------+-------------------------------------- --------------+| Advarsel | 1292 | Trunkeret forkert HELTAL-værdi:'one' || Advarsel | 1292 | Trunkeret forkert HELTAL-værdi:'to' || Advarsel | 1292 | Afkortet forkert HELTAL-værdi:'tre' |+---------+------+------------------------------ ----------------------+
Nul-argumenter
RAND()
returnerer den samme værdi, når frøet er null
:
SELECT
RAND(null),
RAND(null),
RAND(null);
Resultat:
+---------------------+---------------------+-- -------------------+| RAND(nul) | RAND(nul) | RAND(nul) |+----------------------+--------------------------+ ----------------------+| 0,15522042769493574 | 0,15522042769493574 | 0,15522042769493574 |+--------------------------+----------------------+--- ------------------+
Selvom der i dette tilfælde ikke er nogen advarsler.
For mange argumenter
Kalder RAND()
med for mange argumenter resulterer i en fejl:
SELECT RAND(1, 2);
Resultat:
FEJL 1582 (42000):Forkert parameterantal i kaldet til den oprindelige funktion 'RAND'