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'