Dans cet article je vais présenter la notion de « sous-requête SQL« , elle vous permet de séléctionner plusieurs éléments dans une seul requête complété par des sous requêtes. Je vais détailler mon exemple ci-dessous.
Je vais me concentrer uniquement sur la notion de sous-requête. L’exemple que j’utilise ci-dessous est très simple et rapide à mettre en place via XAMPP ou WAMP.
Je possède une base de donnée « dictionnaire« , dans cette base de donnée je possède une table « mot » qui contient 3 colonnes.
J’insère rapidement quelques mots afin de pouvoir travailler plus simplement, copiez-coller simplement le code ci-dessous dans votre gestionnaire SQL afin de remplir avec deux noms, deux verbes, et deux adjectifs votre table « mot ».
`id` ,
`content` ,
`famille`
)
VALUES (
NULL , 'manger', 'verbe'
), (
NULL , 'boire', 'verbe'
);
INSERT INTO `dictionnaire`.`mot` (
`id` ,
`content` ,
`famille`
)
VALUES (
NULL , 'chien', 'nom'
), (
NULL , 'chat', 'nom'
);
INSERT INTO `dictionnaire`.`mot` (
`id` ,
`content` ,
`famille`
)
VALUES (
NULL , 'jolie', 'adjectif'
), (
NULL , 'laid', 'adjctif'
);
L’objectif de l’exercice est de créer une requête qui va nous permettre de séléctionner 1 nom, 1 verbe et 1 adjectif au hasard dans notre table. Ce qui avec une requete simple est toujours simplement impossible.
C’est ici que les sous requêtes prennent leur intérêt.
FROM (SELECT id, content, famille
FROM mot
WHERE famille = 'verbe'
ORDER BY RAND()
LIMIT 1) AS SR_vrb
UNION ALL
SELECT id, content, famille
FROM (SELECT id, content, famille
FROM mot
WHERE famille = 'nom'
ORDER BY RAND()
LIMIT 1) AS SR_nom
UNION ALL
SELECT id, content, famille
FROM (SELECT id, content, famille
FROM mot
WHERE famille = 'adjectif'
ORDER BY RAND()
LIMIT 1) AS SR_adjectif
On utilise « UNION ALL » pour faire une concaténation entre nos différentes requêtes. Cela nous permet d’indiquer plusieurs éléments. Je vais détailler la requête ci-dessus
- FROM (SELECT id, content, famille// je séléctionne les 3 colonnes de ma table
- WHERE famille = ‘verbe’//depuis la table mot
- WHERE famille = ‘verbe’//ou la famille est une verbe
- LIMIT 1) AS SR_vrb //avec une limite de 1 élément à séléctionner en lui fournissant un alias
Pour conclure je fournis un alias qui me permettra si je veux compléter ma requête de me répérer plus facilement dans mes requêtes, cela fera l’objet d’un autre billet.
Ce billet n’a pas pour objectif de servir de cours mais pour aider ceux qui recherche une syntaxe précise et quelques explications sur l’utilisation. N’hésitez pas à me contacter si vous pensez que le billet peut être améliorer.
Très bon article bien expliqué. Un petit point qui peut être optimisé c’est l’utilisation de la fonction RAND() qui n’est pas très bonne en terme de performance. Mais bon, parfois il n’y a pas d’autre choix …
Merci pour votre retour, que conseilleriez vous pour optimiser la fonction rand() ?