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

Come funziona RAND() in MariaDB

In MariaDB, RAND() è una funzione incorporata che restituisce un DOUBLE casuale valore in virgola mobile di precisione v nell'intervallo 0 <= v < 1.0 .

Sintassi

RAND() può essere utilizzato nei seguenti due modi:

RAND()
RAND(N)

Dove N è un numero intero costante da utilizzare come valore di inizializzazione.

Quando viene utilizzato un valore seme, RAND() produce una sequenza ripetibile di valori di colonna.

Esempio

Ecco un esempio per dimostrare RAND() senza specificare un valore seme:

SELECT RAND();

Risultato:

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

Esempio:con un seme

Ecco un esempio per dimostrare RAND() con un valore seme:

SELECT RAND(3);

Risultato:

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

Non possiamo effettivamente dire la differenza quando si utilizza l'esempio sopra. Per vedere la differenza, dobbiamo effettuare più chiamate di funzione usando lo stesso seme.

In questo modo:

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

Risultato:

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

Possiamo vedere che tutte e tre le chiamate hanno prodotto lo stesso valore.

Ecco cosa succede quando omettiamo il valore seed:

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

Risultato:

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

Ogni chiamata restituisce un valore diverso.

Intero casuale all'interno di un intervallo

Possiamo combinare RAND() con FLOOR() , insieme ad alcuni calcoli, per restituire un numero intero casuale all'interno di un intervallo.

La sintassi per farlo è questa:

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

Quindi, potremmo fare quanto segue per restituire un numero intero casuale compreso tra 1 e 10:

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

Risultato:

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

Chiamiamolo ancora un po' per vedere l'effetto casuale:

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;

Risultato:

+----+----+----+----+----+----+----+----+
| r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 |
+----+----+----+----+----+----+----+----+
|  3 |  6 | 10 |  4 |  6 | 10 |  1 |  6 |
+----+----+----+----+----+----+----+----+

Restituisci righe casuali da una tabella

RAND() può essere utilizzato insieme a un ORDER BY clausola e il LIMIT parola chiave per restituire righe casuali da una tabella del database:

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

Esempio di risultato:

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

E se lo eseguo di nuovo, ottengo questo:

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

E così via...

Tuttavia, tieni presente che questo è piuttosto intenso e non dovrebbe essere usato su tavoli più grandi. Vedere Campionamento dei dati:tecniche per trovare in modo efficiente una riga casuale sul sito Web di MariaDB per le tecniche più adatte a tabelle più grandi.

Seme non numerico

Ecco un esempio di cosa succede quando forniamo un valore seed non numerico:

SELECT RAND('five');

Risultato:

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

Vediamo l'avviso:

SHOW WARNINGS;

Risultato:

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

Inoltre, questo tende a restituire lo stesso risultato, indipendentemente dal seme non numerico utilizzato. Ad esempio, se lancio diversi semi non numerici su di esso, ottengo lo stesso risultato:

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

Risultato:

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

Controlla gli avvisi:

SHOW WARNINGS;

Risultato:

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

Argomenti nulli

RAND() restituisce lo stesso valore quando il seme è null :

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

Risultato:

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

Anche se, in questo caso, non ci sono avvisi.

Troppi argomenti

Chiamando RAND() con troppi argomenti genera un errore:

SELECT RAND(1, 2);

Risultato:

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