MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Wie RAND() in MariaDB funktioniert

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'