[SQL] Sélection aléatoire des lignes dans une table de bdd
Il est facile d’obtenir aléatoirement une ligne renvoyée parmi d’autres par une base de données à l’aide d’un langage comme php, c#, java etc… mais si on veut optimiser un petit peu le processus il faut mieux le faire directement dans la requête SQL. Vous trouverez ci-dessous pour chaque moteur de base de données la syntaxe SQL correspondante pour sélectionner au hasard une ligne dans une table de base de données. Cette requête n’étant pas une requête standard normalisée (‘isofié’), il est normal que chaque moteur de bdd ai implémenté une syntaxe différente. Celle-ci est aussi plus ou moins optimisée suivant le moteur de bdd utilisé.
Vous trouverez donc dans cet article la syntaxe de sélection aléatoire pour
Attention, rappelez vous que la génération de nombre aléatoire en informatique n’est pas vraiment un nombre tiré au hasard…
Sélectionner aléatoirement une ligne avec MySQL
SELECT COLUMN FROM TABLE ORDER BY RAND() LIMIT 1 |
Attention cette requête n’est pas du tout optimisé avec MySQL. Un EXPLAIN sur cette requête permet de s’en rendre compte :
EXPLAIN SELECT colonne FROM TABLE ORDER BY RAND( ) LIMIT 1; Extra : USING INDEX; USING TEMPORARY; USING filesort; |
Using temporary; indique que la requête crée une table temporaire pour résoudre la requête. C’est déconseillé pour les performance surtout si la table n’est pas créé en mémoire mais sur le disque dur.
Using filesort; indique que mysql fait un tri pour retourner la donnée. Ce n’est pas très bon en terme de performance.
Using index; indique que mysql retrouve le résultat en passant directement par les index en mémoire sans passé par les données stockées sur le disque dur. Ce qui est une bonne chose pour les performances.
La solution sous MySQL est de rajouter une clause WHERE RAND() > 0.9.
Exemple sans WHERE RAND() > 0.9
SELECT SQL_NO_CACHE * FROM nom_table ORDER BY RAND( ) LIMIT 1 |
Affichage des enregistrements 0 – 0 (1 total, Traitement en 0.0078 sec.)
Exemple avec WHERE RAND() > 0.9
SELECT SQL_NO_CACHE * FROM nom_table WHERE RAND() > 0.9 ORDER BY RAND( ) LIMIT 1 |
Affichage des enregistrements 0 – 0 (1 total, Traitement en 0.0018 sec.)
Sélectionner une ligne au hasard avec PostgreSQL
SELECT COLUMN FROM TABLE ORDER BY RANDOM() LIMIT 1 |
Sélectionner aléatoirement une ligne avec Microsoft SQL Server
SELECT TOP 1 COLUMN FROM TABLE ORDER BY NEWID() |
Sélectionner aléatoirement une ligne avec IBM DB2
SELECT COLUMN, RAND() AS IDX FROM TABLE ORDER BY IDX FETCH FIRST 1 ROWS ONLY |
Sélectionner aléatoirement une ligne avec Oracle
SELECT COLUMN FROM (SELECT COLUMN FROM TABLE ORDER BY dbms_random.value) WHERE rownum = 1 |
Aléatoire avec SQLite
Le script pour l’aléatoire avec SQLite est proche de celui utilisé pour MySQL, sauf que l’on utilise le mot entier Random.
SELECT COLUMN FROM TABLE ORDER BY Random() LIMIT 1 |
Si vous souhaitez ajouter d’autres exemples, d’autres requêtes et ou surtout d’autres façons de sélectionner aléatoirement une ligne avec d’autres moteurs de base de données n’hésitez pas à commenter cet article.
Merci à Pete Freitag pour les informations sur SQL qui m’ont permis d’écrire cet article :
SQL to Select a random row from a database table : http://www.petefreitag.com/item/466.cfm
Si SQL vous intéresse vous serez peut être intéressé par l’article suivant :
Comment transformer une date alphanumérique en une date de type date en SQL?
Points d’intérêt de cet article : SQL, hasard, random, sélection aléatoire, bdd
Mots clefs liés à cet article:
- random sql
- sql aléatoire
- sql random
- aléatoire sql
- sql sélection aléatoire
- select aleatoire sql
- sql rand
3 commentaires sur « [SQL] Sélection aléatoire des lignes dans une table de bdd »