Passer au contenu

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.

SELECT nom_produit, prix
FROM produits
WHERE prix > (SELECT AVG(prix) FROM produits);

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 :

SELECT nom_employe, salaire
FROM employes
WHERE salaire > (SELECT AVG(salaire)
FROM employes
WHERE departement_id = employes.departement_id);

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 :

SELECT nom_employe,
(SELECT COUNT(*)
FROM commandes
WHERE commandes.employe_id = employes.id) AS nombre_commandes
FROM employes;

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 :

SELECT nom_employe, total_revenu
FROM (SELECT employes.nom_employe, SUM(commandes.montant) AS total_revenu
FROM employes
JOIN commandes ON employes.id = commandes.employe_id
GROUP BY employes.nom_employe) AS revenus
WHERE total_revenu > 10000;

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 :

SELECT nom_employe, salaire
FROM employes
WHERE salaire > (SELECT AVG(salaire) FROM employes);

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 :

SELECT nom_employe, salaire
FROM employes
WHERE salaire > (SELECT AVG(salaire)
FROM employes AS e
WHERE e.departement_id = employes.departement_id);

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.