Comment Faire des Requêtes Imbriquées en SQL
Les requêtes imbriquées, également appelées sous-requêtes ou requêtes internes, sont des requêtes SQL placées à l’intérieur d’une autre requête. Elles permettent d’effectuer des opérations complexes en décomposant un problème en plusieurs étapes, chaque étape étant résolue par une sous-requête.
Qu’est-ce qu’une requête imbriquée ?
Une requête imbriquée est une requête SQL qui est incluse à l’intérieur d’une autre requête SQL. La sous-requête peut être utilisée pour :
- Filtrer des résultats (avec
WHERE
,HAVING
, etc.) - Calculer des agrégations utilisées dans la requête principale
- Fournir un jeu de résultats à la requête principale
Exemple simple de requête imbriquée
Supposons que vous avez une table ventes
et une table produits
. Vous voulez trouver tous les produits qui ont été vendus à un prix supérieur à la moyenne des prix de tous les produits. Vous pouvez utiliser une sous-requête pour calculer le prix moyen, puis filtrer les produits dont le prix dépasse cette moyenne.
Dans cet exemple :
- La sous-requête
(SELECT AVG(prix) FROM produits)
calcule le prix moyen de tous les produits. - La requête principale sélectionne tous les produits dont le prix est supérieur à cette moyenne.
Types de sous-requêtes
Les sous-requêtes peuvent être classées en fonction de leur emplacement et de leur usage dans la requête principale.
1. Sous-requête dans la clause WHERE
Les sous-requêtes sont souvent utilisées dans la clause WHERE
pour filtrer les résultats en fonction d’un critère complexe.
Exemple
Trouver tous les employés dont le salaire est supérieur à la moyenne des salaires dans leur département :
2. Sous-requête dans la clause SELECT
Une sous-requête peut également être utilisée dans la clause SELECT
pour générer des valeurs calculées qui seront affichées dans le résultat final.
Exemple
Afficher le nom des employés et le nombre de commandes qu’ils ont gérées :
3. Sous-requête dans la clause FROM
Une sous-requête dans la clause FROM
est traitée comme une table temporaire, ce qui permet de manipuler les résultats intermédiaires avant de les utiliser dans la requête principale.
Exemple
Calculer le revenu total généré par chaque employé, puis afficher les employés dont le revenu total dépasse un certain seuil :
Dans cet exemple, la sous-requête génère un tableau de revenus totaux par employé, qui est ensuite filtré dans la requête principale.
Requêtes corrélées vs. non corrélées
Les sous-requêtes peuvent être classées en deux catégories :
1. Requêtes non corrélées
Les sous-requêtes non corrélées sont indépendantes de la requête principale. Elles peuvent être exécutées indépendamment de la requête principale.
Exemple
Trouver tous les employés dont le salaire est supérieur au salaire moyen de l’entreprise :
2. Requêtes corrélées
Les sous-requêtes corrélées dépendent de la requête principale, car elles utilisent les colonnes de la requête principale pour effectuer leur calcul.
Exemple
Trouver tous les employés dont le salaire est supérieur à la moyenne des salaires de leur propre département :
Ici, la sous-requête dépend de chaque ligne traitée dans la requête principale.
Avantages des requêtes imbriquées
- Modularité : Les requêtes imbriquées permettent de décomposer une requête complexe en étapes plus simples et plus faciles à comprendre.
- Flexibilité : Elles permettent d’utiliser des résultats intermédiaires pour affiner et améliorer la précision des requêtes.
- Puissance d’expression : Elles permettent de réaliser des opérations complexes qui seraient difficiles ou impossibles à effectuer avec des requêtes simples.
Limites et inconvénients
- Performance : Les sous-requêtes, en particulier les sous-requêtes corrélées, peuvent être lentes, car elles sont exécutées pour chaque ligne du résultat principal.
- Lisibilité : Les requêtes imbriquées peuvent devenir difficiles à lire et à comprendre si elles sont trop complexes ou si elles contiennent plusieurs niveaux de sous-requêtes.