Aller au contenu principal

Les sous-requêtes

Notions théoriques

Les sous-requêtes sont des requêtes SQL imbriquées dans une autre requête.

astuce

Les sous-requêtes peuvent être très utiles pour résoudre des problèmes plus complexes qui nécessitent plusieurs étapes de traitement des données.

Les sous-requêtes peuvent être utilisées dans diverses parties d'une requête SQL, y compris le SELECT, FROM, WHERE et HAVING clauses.

info

Une sous-requête est exécutée avant la requête principale et les résultats de la sous-requête sont utilisés par la requête principale pour son exécution. Ainsi, l'ordre d'exécution est de l'intérieur vers l'extérieur.

Exemple pratique

Imaginons que nous voulons trouver tous les livres qui ont plus de pages que la moyenne des pages de tous les livres. Pour cela, nous pouvons utiliser une sous-requête dans la clause WHERE pour calculer d'abord la moyenne des pages, puis utiliser cette valeur pour filtrer les livres.

MLD_bibliotheque.png

SELECT titre
FROM livres
WHERE nbpages > (SELECT AVG(nbpages) FROM livres);

Test de mémorisation/compréhension


Qu'est-ce qu'une sous-requête SQL ?


Quand une sous-requête est-elle exécutée ?


Quelle est la requête qui trouve tous les livres qui ont plus de pages que la moyenne des pages de tous les livres ?


Quel est l'ordre d'exécution des requêtes lorsque vous utilisez une sous-requête ?



TP pour réfléchir et résoudre des problèmes

A partir du schéma « Modèle Conceptuel de Données » MCD représenté ci-dessus, écrire les requêtes SQL pour répondre aux questions suivantes.

Télécharger le fichier 'cdi.sql' - Télécharger le MCD

Mission 1

MLD_bibliotheque.png

Votre 1ère mission est de :

  • trouver le nom de l'auteur qui a écrit le livre avec le plus grand nombre de pages.

Bonne pratique - Sous-requête vs JOIN pour les maxima

Pour trouver l'enregistrement avec la valeur maximale d'une colonne, deux approches existent :

  • Sous-requête : WHERE nbpages = (SELECT MAX(nbpages) FROM livres) — lisible, fonctionne sur tous les SGBD.
  • ORDER BY + LIMIT : ORDER BY nbpages DESC LIMIT 1 — plus performant sur les grandes tables. Préférez la sous-requête pour la clarté, ORDER BY LIMIT pour la performance.

Mission 2

MLD_bibliotheque.png

Votre 2ème mission est de :

  • trouver le titre du livre qui a le plus grand nombre de pages et l'auteur de ce livre.

Bonne pratique - Réutiliser la même sous-requête

Si la même sous-requête apparaît plusieurs fois dans une requête, envisagez une vue ou une CTE (Common Table Expression) avec WITH ... AS (...). Cela améliore la lisibilité et évite de calculer la même valeur plusieurs fois.

Une solution