In MariaDB RAND()
ist eine eingebaute Funktion, die einen zufälligen DOUBLE
zurückgibt Präzisions-Gleitkommawert v
im Bereich 0 <= v < 1.0
.
Syntax
RAND()
kann auf die folgenden zwei Arten verwendet werden:
RAND()
RAND(N)
Wobei N
ist eine konstante Ganzzahl, die als Startwert verwendet werden soll.
Wenn ein Ausgangswert verwendet wird, RAND()
erzeugt eine wiederholbare Folge von Spaltenwerten.
Beispiel
Hier ist ein Beispiel, um RAND()
zu demonstrieren ohne Angabe eines Seed-Werts:
SELECT RAND();
Ergebnis:
+---------------------+ | RAND() | +---------------------+ | 0.14470310708945908 | +---------------------+
Beispiel – Mit einem Seed
Hier ist ein Beispiel, um RAND()
zu demonstrieren mit ein Seed-Wert:
SELECT RAND(3);
Ergebnis:
+--------------------+ | RAND(3) | +--------------------+ | 0.9057697559760601 | +--------------------+
Wir können den Unterschied nicht wirklich erkennen, wenn wir das obige Beispiel verwenden. Um den Unterschied zu sehen, müssen wir mehrere Funktionsaufrufe mit demselben Seed durchführen.
So:
SELECT
RAND(3),
RAND(3),
RAND(3);
Ergebnis:
+--------------------+--------------------+--------------------+ | RAND(3) | RAND(3) | RAND(3) | +--------------------+--------------------+--------------------+ | 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 | +--------------------+--------------------+--------------------+
Wir können sehen, dass alle drei Aufrufe denselben Wert ergaben.
Folgendes passiert, wenn wir den Seed-Wert weglassen:
SELECT
RAND(),
RAND(),
RAND();
Ergebnis:
+--------------------+---------------------+---------------------+ | RAND() | RAND() | RAND() | +--------------------+---------------------+---------------------+ | 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 | +--------------------+---------------------+---------------------+
Jeder Aufruf gibt einen anderen Wert zurück.
Zufallszahl innerhalb eines Bereichs
Wir können RAND()
kombinieren mit FLOOR()
, zusammen mit einigen Berechnungen, um eine zufällige ganze Zahl innerhalb eines Bereichs zurückzugeben.
Die Syntax dafür sieht folgendermaßen aus:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Wir könnten also Folgendes tun, um eine zufällige Ganzzahl zwischen 1 und 10 zurückzugeben:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Ergebnis:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 6 | +---------------------------------+
Nennen wir es etwas länger, um den Zufallseffekt zu sehen:
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;
Ergebnis:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 | +----+----+----+----+----+----+----+----+
Zufällige Zeilen aus einer Tabelle zurückgeben
RAND()
kann in Verbindung mit einem ORDER BY
verwendet werden -Klausel und das LIMIT
Schlüsselwort, um zufällige Zeilen aus einer Datenbanktabelle zurückzugeben:
SELECT
PetId,
PetName
FROM Pets
ORDER BY RAND()
LIMIT 5;
Beispielergebnis:
+-------+---------+ | PetId | PetName | +-------+---------+ | 5 | Tweet | | 7 | Bark | | 1 | Fluffy | | 8 | Meow | | 3 | Scratch | +-------+---------+
Und wenn ich es erneut ausführe, erhalte ich Folgendes:
+-------+---------+ | PetId | PetName | +-------+---------+ | 3 | Scratch | | 8 | Meow | | 4 | Wag | | 7 | Bark | | 6 | Fluffy | +-------+---------+
Und so weiter…
Beachten Sie jedoch, dass dies ziemlich intensiv ist und nicht an größeren Tischen verwendet werden sollte. Siehe Data Sampling:Techniques for Efficiently Finding a Random Row auf der MariaDB-Website für Techniken, die besser für größere Tabellen geeignet sind.
Nicht numerischer Seed
Hier ist ein Beispiel dafür, was passiert, wenn wir einen nicht numerischen Seed-Wert angeben:
SELECT RAND('five');
Ergebnis:
+---------------------+ | RAND('five') | +---------------------+ | 0.15522042769493574 | +---------------------+ 1 row in set, 1 warning (0.000 sec)
Sehen wir uns die Warnung an:
SHOW WARNINGS;
Ergebnis:
+---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'five' | +---------+------+-------------------------------------------+
Außerdem gibt dies tendenziell das gleiche Ergebnis zurück, unabhängig davon, welcher nicht numerische Startwert verwendet wird. Wenn ich zum Beispiel verschiedene nicht-numerische Samen darauf werfe, erhalte ich das gleiche Ergebnis:
SELECT
RAND('one'),
RAND('two'),
RAND('three');
Ergebnis:
+---------------------+---------------------+---------------------+ | RAND('one') | RAND('two') | RAND('three') | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+ 1 row in set, 3 warnings (0.000 sec)
Überprüfen Sie die Warnungen:
SHOW WARNINGS;
Ergebnis:
+---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'one' | | Warning | 1292 | Truncated incorrect INTEGER value: 'two' | | Warning | 1292 | Truncated incorrect INTEGER value: 'three' | +---------+------+--------------------------------------------+
Null-Argumente
RAND()
gibt denselben Wert zurück, wenn der Seed null
ist :
SELECT
RAND(null),
RAND(null),
RAND(null);
Ergebnis:
+---------------------+---------------------+---------------------+ | RAND(null) | RAND(null) | RAND(null) | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+
Obwohl es in diesem Fall keine Warnungen gibt.
Zu viele Argumente
Aufruf von RAND()
mit zu vielen Argumenten führt zu einem Fehler:
SELECT RAND(1, 2);
Ergebnis:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'