Guide Pratique sur les Sous-Requêtes en SQL (Requêtes Imbriquées)

Les sous-requêtes (ou requêtes imbriquées) en SQL sont des requêtes incluses dans une autre requête. Elles permettent de réaliser des opérations complexes en décomposant un problème en plusieurs étapes. Ce guide vous explique comment utiliser les sous-requêtes dans différents cas de figure, avec des exemples pratiques et des requêtes complexes.

1. Introduction aux Sous-Requêtes

Définition

Une sous-requête est une requête SQL incluse dans une autre requête. Elle peut être utilisée dans les clauses SELECTFROMWHEREHAVING, et même INSERTUPDATE, ou DELETE.

Types de Sous-Requêtes

  • Sous-requête dans la clause WHERE : Pour filtrer les résultats en fonction d'une condition.

  • Sous-requête dans la clause FROM : Pour créer une table temporaire.

  • Sous-requête dans la clause SELECT : Pour retourner une valeur calculée.

  • Sous-requête corrélée : Une sous-requête qui dépend de la requête externe.

sous-requete


2. Sous-Requête dans la Clause WHERE

Cas d'utilisation

  • Filtrer les résultats en fonction d'une condition dynamique.

  • Comparer une valeur avec un résultat calculé.

Exemple 1 : Trouver les clients ayant passé une commande

Supposons deux tables :

  • Clients (ClientID, Nom)

  • Commandes (OrderID, ClientID, Date)

Requête : Trouver les clients qui ont passé au moins une commande.

SELECT ClientID, Nom
FROM Clients
WHERE ClientID IN (SELECT DISTINCT ClientID FROM Commandes);

Exemple 2 : Trouver les produits dont le prix est supérieur à la moyenne

Supposons une table Produits (ProduitID, Nom, Prix).

Requête : Trouver les produits dont le prix est supérieur à la moyenne des prix.

SELECT ProduitID, Nom, Prix
FROM Produits
WHERE Prix > (SELECT AVG(Prix) FROM Produits);
 

3. Sous-Requête dans la Clause FROM

Cas d'utilisation

  • Créer une table temporaire pour une requête plus complexe.

  • Simplifier une requête en décomposant les étapes.

Exemple : Calculer le revenu total par client

Supposons deux tables :

  • Clients (ClientID, Nom)

  • Commandes (OrderID, ClientID, Montant)

Requête : Calculer le revenu total généré par chaque client.

SELECT c.ClientID, c.Nom, COALESCE(TotalRevenu, 0) AS TotalRevenu
FROM Clients c
LEFT JOIN (
    SELECT ClientID, SUM(Montant) AS TotalRevenu
    FROM Commandes
    GROUP BY ClientID
) AS RevenuClients
ON c.ClientID = RevenuClients.ClientID;

4. Sous-Requête dans la Clause SELECT

Cas d'utilisation

  • Retourner une valeur calculée pour chaque ligne.

  • Ajouter des colonnes dynamiques à un résultat.

Exemple : Afficher le nombre de commandes par client

Supposons deux tables :

  • Clients (ClientID, Nom)

  • Commandes (OrderID, ClientID)

Requête : Afficher chaque client avec le nombre de commandes qu'il a passées.

SELECT c.ClientID, c.Nom, 
       (SELECT COUNT(*) 
        FROM Commandes o 
        WHERE o.ClientID = c.ClientID) AS NombreCommandes
FROM Clients c;
 

5. Sous-Requêtes Corrélées

Définition

Une sous-requête corrélée est une sous-requête qui dépend de la requête externe. Elle est exécutée une fois pour chaque ligne de la requête principale.

Exemple : Trouver les employés dont le salaire est supérieur à la moyenne de leur département

Supposons une table Employés (EmployéID, Nom, Salaire, DépartementID).

Requête : Trouver les employés dont le salaire est supérieur à la moyenne de leur département.

SELECT e.EmployéID, e.Nom, e.Salaire, e.DépartementID
FROM Employés e
WHERE e.Salaire > (
    SELECT AVG(Salaire)
    FROM Employés
    WHERE DépartementID = e.DépartementID
);
 
 

6. Sous-Requêtes dans les Opérations INSERT, UPDATE, DELETE

Cas d'utilisation

  • Insérer, mettre à jour ou supprimer des données en fonction d'une condition dynamique.

Exemple 1 : Insérer des données dans une table à partir d'une autre table

Supposons deux tables :

  • Clients (ClientID, Nom)

  • NouveauxClients (ClientID, Nom)

Requête : Insérer les nouveaux clients dans la table Clients.

INSERT INTO Clients (ClientID, Nom)
SELECT ClientID, Nom
FROM NouveauxClients
WHERE ClientID NOT IN (SELECT ClientID FROM Clients);
 

Exemple 2 : Mettre à jour le salaire des employés en fonction de la moyenne du département

Supposons une table Employés (EmployéID, Nom, Salaire, DépartementID).

Requête : Augmenter le salaire de 10% pour les employés dont le salaire est inférieur à la moyenne de leur département. 

UPDATE Employés
SET Salaire = Salaire * 1.10
WHERE Salaire < (
    SELECT AVG(Salaire)
    FROM Employés e2
    WHERE e2.DépartementID = Employés.DépartementID
);
 

7. Requêtes Complexes avec Sous-Requêtes

Exemple : Trouver les clients ayant passé plus de commandes que la moyenne

Supposons deux tables :

  • Clients (ClientID, Nom)

  • Commandes (OrderID, ClientID)

Requête : Trouver les clients ayant passé plus de commandes que la moyenne des commandes par client. 

SELECT c.ClientID, c.Nom, COUNT(o.OrderID) AS NombreCommandes
FROM Clients c
JOIN Commandes o ON c.ClientID = o.ClientID
GROUP BY c.ClientID, c.Nom
HAVING COUNT(o.OrderID) > (
    SELECT AVG(NombreCommandes)
    FROM (
        SELECT COUNT(OrderID) AS NombreCommandes
        FROM Commandes
        GROUP BY ClientID
    ) AS CommandesParClient
);
 

8. Bonnes Pratiques pour les Sous-Requêtes

  1. Évitez les sous-requêtes inutiles : Utilisez des JOIN lorsque possible pour améliorer les performances.

  2. Limitez la profondeur des sous-requêtes : Trop de niveaux d'imbrication peuvent rendre la requête difficile à lire et à maintenir.

  3. Utilisez des alias : Donnez des alias aux sous-requêtes pour améliorer la lisibilité.

  4. Testez les sous-requêtes séparément : Assurez-vous que chaque sous-requête fonctionne correctement avant de l'intégrer dans une requête plus complexe.


Conclusion

Les sous-requêtes sont un outil puissant en SQL pour décomposer des problèmes complexes en étapes simples. Elles peuvent être utilisées dans diverses clauses (WHEREFROMSELECT, etc.) et pour différentes opérations (SELECTINSERTUPDATEDELETE). En maîtrisant les sous-requêtes, vous pourrez écrire des requêtes SQL plus flexibles et performantes.

N'hésitez pas à expérimenter avec vos propres données et à combiner les sous-requêtes avec d'autres fonctionnalités SQL pour résoudre des problèmes complexes !