sql >> Databasteknik >  >> RDS >> MariaDB

Hur RAND() fungerar i MariaDB

I MariaDB, RAND() är en inbyggd funktion som returnerar en slumpmässig DOUBLE precisionsflyttalsvärde v i intervallet 0 <= v < 1.0 .

Syntax

RAND() kan användas på följande två sätt:

RAND()
RAND(N)

Där N är ett konstant heltal som ska användas som ett startvärde.

När ett frövärde används, RAND() producerar en repeterbar sekvens av kolumnvärden.

Exempel

Här är ett exempel för att demonstrera RAND() utan att ange ett startvärde:

SELECT RAND();

Resultat:

+---------------------+
| RAND()              |
+---------------------+
| 0.14470310708945908 |
+---------------------+

Exempel – med ett frö

Här är ett exempel för att demonstrera RAND() med ett frövärde:

SELECT RAND(3);

Resultat:

+--------------------+
| RAND(3)            |
+--------------------+
| 0.9057697559760601 |
+--------------------+

Vi kan faktiskt inte se skillnaden när vi använder exemplet ovan. För att se skillnaden måste vi göra flera funktionsanrop med samma frö.

Så här:

SELECT 
    RAND(3),
    RAND(3),
    RAND(3);

Resultat:

+--------------------+--------------------+--------------------+
| RAND(3)            | RAND(3)            | RAND(3)            |
+--------------------+--------------------+--------------------+
| 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 |
+--------------------+--------------------+--------------------+

Vi kan se att alla tre samtalen resulterade i samma värde.

Så här händer när vi utelämnar startvärdet:

SELECT 
    RAND(),
    RAND(),
    RAND();

Resultat:

+--------------------+---------------------+---------------------+
| RAND()             | RAND()              | RAND()              |
+--------------------+---------------------+---------------------+
| 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 |
+--------------------+---------------------+---------------------+

Varje anrop returnerar ett annat värde.

Slumpmässigt heltal inom ett intervall

Vi kan kombinera RAND() med FLOOR() , tillsammans med några beräkningar, för att returnera ett slumpmässigt heltal inom ett intervall.

Syntaxen för att göra detta ser ut så här:

FLOOR(min_value + RAND() * (max_value - min_value +1))

Så vi kan göra följande för att returnera ett slumpmässigt heltal mellan 1 och 10:

SELECT FLOOR(1 + RAND() * (10 - 1 +1));

Resultat:

+---------------------------------+
| FLOOR(1 + RAND() * (10 - 1 +1)) |
+---------------------------------+
|                               6 |
+---------------------------------+

Låt oss kalla det lite mer för att se den slumpmässiga effekten:

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 |
+----+----+----+----+----+----+----+----+

Returnera slumpmässiga rader från en tabell

RAND() kan användas tillsammans med en ORDER BY satsen och LIMIT nyckelord för att returnera slumpmässiga rader från en databastabell:

SELECT  
    PetId,
    PetName
FROM Pets 
ORDER BY RAND() 
LIMIT 5;

Exempelresultat:

+-------+---------+
| PetId | PetName |
+-------+---------+
|     5 | Tweet   |
|     7 | Bark    |
|     1 | Fluffy  |
|     8 | Meow    |
|     3 | Scratch |
+-------+---------+

Och om jag kör det igen får jag det här:

+-------+---------+
| PetId | PetName |
+-------+---------+
|     3 | Scratch |
|     8 | Meow    |
|     4 | Wag     |
|     7 | Bark    |
|     6 | Fluffy  |
+-------+---------+

Och så vidare...

Kom dock ihåg att detta är ganska intensivt och inte bör användas på större bord. Se Datasampling:Techniques for Efficiently Finding a Random Row på MariaDB-webbplatsen för tekniker som är mer lämpade för större tabeller.

Icke-numeriskt frö

Här är ett exempel på vad som händer när vi tillhandahåller ett icke-numeriskt startvärde:

SELECT RAND('five');

Resultat:

+---------------------+
| RAND('five')        |
+---------------------+
| 0.15522042769493574 |
+---------------------+
1 row in set, 1 warning (0.000 sec)

Låt oss se varningen:

SHOW WARNINGS;

Resultat:

+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'five' |
+---------+------+-------------------------------------------+

Detta tenderar också att ge samma resultat, oavsett vilket icke-numeriskt frö som används. Till exempel, om jag kastar olika icke-numeriska frön på det, får jag samma resultat:

SELECT 
    RAND('one'),
    RAND('two'),
    RAND('three');

Resultat:

+---------------------+---------------------+---------------------+
| RAND('one')         | RAND('two')         | RAND('three')       |
+---------------------+---------------------+---------------------+
| 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 |
+---------------------+---------------------+---------------------+
1 row in set, 3 warnings (0.000 sec)

Kontrollera varningarna:

SHOW WARNINGS;

Resultat:

+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'one'   |
| Warning | 1292 | Truncated incorrect INTEGER value: 'two'   |
| Warning | 1292 | Truncated incorrect INTEGER value: 'three' |
+---------+------+--------------------------------------------+

Nollargument

RAND() returnerar samma värde när fröet är null :

SELECT 
    RAND(null),
    RAND(null),
    RAND(null);

Resultat:

+---------------------+---------------------+---------------------+
| RAND(null)          | RAND(null)          | RAND(null)          |
+---------------------+---------------------+---------------------+
| 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 |
+---------------------+---------------------+---------------------+

Även om det i det här fallet inte finns några varningar.

För många argument

Anropar RAND() med för många argument resulterar i ett fel:

SELECT RAND(1, 2);

Resultat:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'

  1. En affärsdatamodell för prenumeration

  2. Prestanda för sys.partitioner

  3. Hur formaterar man bigint-fält till ett datum i Postgresql?

  4. Använder variabeln env i Spring Boots application.properties