Hasard Random Dés hazard

[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…

Hasard Random Dés hazard sélection aléatoire
Jeu de dés, hasard (Random) avec SQL

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 »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.