En SQL la fonction RAND() permet de sélectionner un nombre aléatoire à virgule, compris entre 0 et 1. Le résultat de cette fonction sera différent à chaque fois que la fonction est exécutée dans une requête SQL.
Cette fonction se révèle pratique avec un ORDER BY pour classer des résultats aléatoirement. Toutefois, même si c’est possible il faut essayer d’éviter cette méthode qui n’est pas particulièrement efficace en terme de performances.
La fonction peut aussi être utilisée dans une clause WHERE. Cela peut être pratique pour sélectionner un résultat aléatoirement.
Syntaxe
La syntaxe pour utiliser la fonction RAND() est la suivante :
SELECT RAND();
Le résultat de cette fonction sera différent à chaque fois que la requête sera exécutée. Voici une liste possible de résultats de cette fonction :
0.8702846307962059 0.0648367116831585 0.7657416637667843
Il est possible d’effectuer des opérations mathématiques avec le résultat de cette fonction. Par exemple, pour obtenir un nombre aléatoire entre 0 et 100, il suffit de multiplier le résultat de RAND() par 100, comme dans l’exemple ci-dessous:
SELECT RAND() * 100;
Résultats possibles :
60.11546427394773 51.26955569839995 15.105471494705855
Exemple
Imaginons une application qui utilise une base de données des principales villes de France. Pour le bien de ce cours, nous allons utiliser une table qui contient 10 villes françaises.
Table ville :
id | ville | departement |
---|---|---|
1 | Paris | Paris |
2 | Marseille | Bouches-du-Rhône |
3 | Lyon | Rhône |
4 | Toulouse | Haute-Garonne |
5 | Nice | Alpes-Maritimes |
6 | Nantes | Loire-Atlantique |
7 | Strasbourg | Bas-Rhin |
8 | Montpellier | Hérault |
9 | Bordeaux | Gironde |
10 | Lille | Nord |
Trier les résultats aléatoirement
Il est possible de trier les résultats aléatoirement en utilisant la syntaxe suivante :
SELECT * FROM `ville` ORDER BY RAND()
A chaque fois que la requête sera exécutée, celle-ci retournera un résultat aléatoire. L’un des résultats possibles sera donc le suivant:
id | ville | departement |
---|---|---|
2 | Marseille | Bouches-du-Rhône |
10 | Lille | Nord |
6 | Nantes | Loire-Atlantique |
7 | Strasbourg | Bas-Rhin |
9 | Bordeaux | Gironde |
1 | Paris | Paris |
5 | Nice | Alpes-Maritimes |
3 | Lyon | Rhône |
4 | Toulouse | Haute-Garonne |
8 | Montpellier | Hérault |
Sélectionner un résultat aléatoirement
En couplant cette fonction SQL avec la fonction ROUND() qui permet d’arrondir un nombre a virgule à un entier, il est possible de retourner un nombre entier plutôt qu’un nombre a virgule flottante. Ce résultat entier peut être utilisé pour sélectionner une ligne parmi un set d’enregistrement. Voici une requête SQL utilisant cette méthode:
SELECT * FROM `ville` WHERE `id` = ROUND( RAND() * 9 ) + 1
Voici une explication concernant cette requête :
- RAND() * 9 permet de générer un nombre a virgule compris entre 0 et 9
- ROUND() permet d’arrondir le nombre généré pour obtenir exclusivement des nombres entier
- + 1 permet d’ajouter 1 au résultat précédent. Ainsi, le nombre sera compris entre 1 et 10
Cette requête va donc se baser sur un nombre entier entre 1 et 10 pour sélectionner une ville aléatoirement dans la table “ville”. L’un des résultats possibles est donc le suivant:
id | ville | departement |
---|---|---|
7 | Strasbourg | Bas-Rhin |
Attention, il faut faire attention avec cette méthode qu’il n’y a pas de trou entre les identifiants sous peine de ne retourner aucun résultat.