MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Comment RAND() fonctionne dans MariaDB

Dans MariaDB, RAND() est une fonction intégrée qui renvoie un DOUBLE aléatoire valeur en virgule flottante de précision v dans la plage 0 <= v < 1.0 .

Syntaxe

RAND() peut être utilisé des deux manières suivantes :

RAND()
RAND(N)

N est un entier constant à utiliser comme valeur de départ.

Lorsqu'une valeur de départ est utilisée, RAND() produit une séquence reproductible de valeurs de colonne.

Exemple

Voici un exemple pour démontrer RAND() sans spécifier de valeur de départ :

SELECT RAND();

Résultat :

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

Exemple – Avec une graine

Voici un exemple pour démontrer RAND() avec une valeur de départ :

SELECT RAND(3);

Résultat :

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

Nous ne pouvons pas réellement faire la différence lorsque nous utilisons l'exemple ci-dessus. Pour voir la différence, nous devons effectuer plusieurs appels de fonction en utilisant la même graine.

Comme ceci :

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

Résultat :

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

Nous pouvons voir que les trois appels ont abouti à la même valeur.

Voici ce qui se passe lorsque nous omettons la valeur de départ :

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

Résultat :

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

Chaque appel renvoie une valeur différente.

Entier aléatoire dans une plage

Nous pouvons combiner RAND() avec FLOOR() , ainsi que quelques calculs, pour renvoyer un entier aléatoire dans une plage.

La syntaxe pour ce faire est la suivante :

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

Ainsi, nous pourrions faire ce qui suit pour renvoyer un entier aléatoire entre 1 et 10 :

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

Résultat :

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

Appelons-le un peu plus pour voir l'effet aléatoire :

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;

Résultat :

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

Renvoyer des lignes aléatoires d'un tableau

RAND() peut être utilisé en conjonction avec un ORDER BY clause et la LIMIT mot-clé pour renvoyer des lignes aléatoires à partir d'une table de base de données :

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

Exemple de résultat :

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

Et si je le relance, j'obtiens ceci :

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

Et ainsi de suite…

Cependant, gardez à l'esprit que cela est assez intensif et ne doit pas être utilisé sur des tables plus grandes. Voir Data Sampling:Techniques for Efficiently Finding a Random Row sur le site Web MariaDB pour des techniques plus adaptées aux grandes tables.

Graine non numérique

Voici un exemple de ce qui se passe lorsque nous fournissons une valeur de départ non numérique :

SELECT RAND('five');

Résultat :

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

Voyons l'avertissement :

SHOW WARNINGS;

Résultat :

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

En outre, cela a tendance à renvoyer le même résultat, quelle que soit la graine non numérique utilisée. Par exemple, si je lui lance différentes graines non numériques, j'obtiens le même résultat :

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

Résultat :

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

Vérifiez les avertissements :

SHOW WARNINGS;

Résultat :

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

Arguments nuls

RAND() renvoie la même valeur lorsque la graine est null :

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

Résultat :

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

Bien que, dans ce cas, il n'y ait pas d'avertissement.

Trop d'arguments

Appel de RAND() avec trop d'arguments génère une erreur :

SELECT RAND(1, 2);

Résultat :

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