sql >> Database teknologi >  >> RDS >> MariaDB

Hvordan RAND() virker i MariaDB

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'

  1. Udfyldning af en PL/SQL-tabel fra en blok i Oracle D2k Forms

  2. Hvordan udfører jeg en GROUP BY på en aliaseret kolonne i MS-SQL Server?

  3. Aktiver kundeforretningsintelligence via datakataloger, virksomhedsordlister og datastyring

  4. Eksporter forespørgselsresultater til en XML-fil, når du bruger SQLcl (Oracle)