Comment écrire une sous-requête (subquery) en SQL ?
- 04/12/2025
- Mickael Celestino
Introduction aux sous-requêtes en SQL
Qu'est-ce qu'une sous-requête ?
Une sous-requête en SQL, également appelée subquery, est une requête imbriquée à l'intérieur d'une autre requête SQL. Elle permet d'extraire des données spécifiques qui servent ensuite de base à la requête principale. Les sous-requêtes sont souvent utilisées pour simplifier des requêtes complexes, en permettant de diviser un problème en plusieurs étapes plus gérables.
Une sous-requête est toujours exécutée avant la requête principale.
Imaginez que vous souhaitez obtenir la liste des employés dont le salaire est supérieur à la moyenne de l'entreprise. Vous pouvez utiliser une sous-requête pour calculer cette moyenne, puis l'intégrer dans votre requête principale. Voici un exemple :
SELECT nom, salaire FROM employes WHERE salaire > (SELECT AVG(salaire) FROM employes); Dans cet exemple, la sous-requête (SELECT AVG(salaire) FROM employes) calcule la moyenne des salaires, et la requête principale utilise ce résultat pour filtrer les employés.
Les sous-requêtes sont particulièrement utiles lorsque vous devez effectuer des calculs ou des filtrages qui ne peuvent pas être réalisés directement dans la requête principale. Elles permettent également de rendre le code SQL plus lisible et modulaire, en isolant des parties spécifiques de la logique de requête.
En utilisant des sous-requêtes, vous pouvez également éviter de créer des tables temporaires, ce qui simplifie la gestion des données et améliore l'efficacité de vos requêtes.
Pourquoi utiliser des sous-requêtes ?
Les sous-requêtes en SQL, souvent appelées subqueries, sont des requêtes imbriquées à l'intérieur d'une autre requête. Elles offrent plusieurs avantages qui simplifient et optimisent vos requêtes SQL.
- Simplification des requêtes complexes : Les sous-requêtes permettent de décomposer des requêtes complexes en plusieurs étapes plus simples. Par exemple, au lieu d'écrire une requête massive pour obtenir les employés ayant un salaire supérieur à la moyenne, vous pouvez d'abord calculer la moyenne dans une sous-requête, puis l'utiliser dans votre requête principale.
- Réutilisation de résultats intermédiaires : Elles permettent de réutiliser des résultats intermédiaires sans avoir à les stocker temporairement. Cela est particulièrement utile lorsque vous travaillez avec des données dynamiques ou des calculs complexes.
- Amélioration de la lisibilité : En structurant vos requêtes avec des sous-requêtes, vous rendez votre code plus lisible et plus facile à maintenir. Par exemple, une sous-requête peut être utilisée pour isoler une condition spécifique, rendant ainsi la logique globale plus claire.
- Flexibilité accrue : Les sous-requêtes offrent une flexibilité pour effectuer des opérations qui seraient autrement difficiles à réaliser avec des jointures classiques. Par exemple, vous pouvez utiliser une sous-requête pour filtrer des données basées sur des critères calculés à la volée.
- Optimisation des performances : Bien que cela dépende du moteur de base de données, les sous-requêtes peuvent parfois améliorer les performances en réduisant le nombre de lignes traitées par la requête principale. Par exemple, une sous-requête peut être utilisée pour limiter le nombre de résultats avant de les joindre à d'autres tables.
Prenons un exemple concret : supposons que vous souhaitiez trouver les produits dont le prix est supérieur à la moyenne. Vous pourriez écrire une sous-requête pour calculer la moyenne des prix, puis l'utiliser dans votre requête principale pour filtrer les produits.
En utilisant les sous-requêtes, vous pouvez non seulement simplifier vos requêtes, mais aussi les rendre plus puissantes et adaptables à des besoins variés. Cela vous permet de vous concentrer sur l'analyse des données plutôt que sur la complexité de la syntaxe SQL.
Types de sous-requêtes
Sous-requêtes scalaires
Une sous-requête scalaire est une sous-requête SQL qui retourne une seule valeur. Elle s'intègre souvent dans une requête principale pour fournir une donnée spécifique, comme un nombre ou une chaîne de caractères, qui peut être utilisée dans des expressions ou des conditions. Ce type de sous-requête est particulièrement utile lorsque vous avez besoin d'une valeur unique pour chaque ligne de votre requête principale.
Par exemple, imaginez que vous gérez une base de données d'une boutique en ligne et que vous souhaitez afficher le nom de chaque produit avec son prix, ainsi que le prix moyen de tous les produits. Vous pouvez utiliser une sous-requête scalaire pour calculer ce prix moyen :
SELECT product_name, price, (SELECT AVG(price) FROM products) AS average_price FROM products; Dans cet exemple, la sous-requête (SELECT AVG(price) FROM products) calcule le prix moyen de tous les produits et retourne une seule valeur. Cette valeur est ensuite affichée pour chaque ligne de la requête principale, permettant ainsi de comparer le prix de chaque produit au prix moyen.
Assurez-vous que votre sous-requête scalaire retourne toujours une seule valeur, sinon une erreur se produira. Utilisez des fonctions d'agrégation commeAVG,SUM, ouCOUNTpour garantir ce résultat.
En utilisant des sous-requêtes scalaires, vous pouvez enrichir vos requêtes SQL avec des calculs dynamiques, tout en gardant votre code clair et concis. Cela vous permet de répondre à des besoins spécifiques sans complexifier inutilement votre requête principale.
Sous-requêtes multi-lignes
Les sous-requêtes multi-lignes en SQL sont des requêtes imbriquées qui retournent plusieurs lignes de résultats. Elles sont souvent utilisées pour filtrer des données en fonction de plusieurs critères ou pour comparer des ensembles de données. Ces sous-requêtes sont particulièrement utiles lorsque vous souhaitez extraire des informations qui ne peuvent pas être obtenues par une simple requête.
- Utilisation des opérateurs IN, ANY, et ALL : Ces opérateurs permettent de comparer une valeur avec un ensemble de résultats retournés par une sous-requête multi-lignes. Par exemple, l'opérateur IN vérifie si une valeur est présente dans la liste de résultats.
- Combinaison avec des jointures : Les sous-requêtes multi-lignes peuvent être combinées avec des jointures pour enrichir les données extraites, offrant ainsi une vue plus complète des informations.
- Optimisation des performances : Bien que puissantes, les sous-requêtes multi-lignes peuvent ralentir les performances si elles ne sont pas optimisées. Utilisez des index et limitez le nombre de lignes retournées pour améliorer l'efficacité.
Pour illustrer, prenons un exemple pratique. Supposons que vous gérez une base de données pour un site de e-commerce et que vous souhaitez lister tous les produits qui ont été commandés par des clients ayant passé plus de trois commandes. Voici comment vous pourriez structurer votre requête :
SELECT product_name FROM products WHERE product_id IN ( SELECT product_id FROM orders WHERE customer_id IN ( SELECT customer_id FROM orders GROUP BY customer_id HAVING COUNT(order_id) > 3 ) ); Dans cet exemple, la sous-requête interne compte le nombre de commandes par client et ne retient que ceux ayant passé plus de trois commandes. La sous-requête externe utilise ces résultats pour filtrer les produits commandés par ces clients spécifiques.
En utilisant cette approche, vous pouvez extraire des données complexes de manière structurée et efficace, tout en maintenant une flexibilité dans vos requêtes SQL.
Sous-requêtes corrélées
Les sous-requêtes corrélées sont un type particulier de sous-requête en SQL, où la sous-requête dépend des valeurs de la requête principale. Contrairement aux sous-requêtes classiques, qui s'exécutent indépendamment, les sous-requêtes corrélées s'exécutent pour chaque ligne traitée par la requête principale. Cela signifie qu'elles sont évaluées plusieurs fois, une fois pour chaque ligne de la requête externe.
Une sous-requête corrélée utilise souvent des colonnes de la requête principale dans sa condition WHERE.
Prenons un exemple concret pour illustrer ce concept. Supposons que vous ayez deux tables : Employes et Departements. Vous souhaitez trouver les employés dont le salaire est supérieur au salaire moyen de leur département.
SELECT e.Nom, e.Salaire FROM Employes e WHERE e.Salaire > ( SELECT AVG(e2.Salaire) FROM Employes e2 WHERE e2.DepartementID = e.DepartementID ); Dans cet exemple, la sous-requête corrélée calcule le salaire moyen pour chaque département. Elle utilise e.DepartementID de la requête principale pour filtrer les employés du même département. Ainsi, pour chaque employé, la sous-requête est exécutée pour déterminer si son salaire dépasse la moyenne de son département.
Cette approche est particulièrement utile lorsque vous devez comparer chaque ligne avec un ensemble de données agrégées ou filtrées. Cependant, gardez à l'esprit que les sous-requêtes corrélées peuvent être plus lentes que les sous-requêtes non corrélées, surtout sur de grandes tables, car elles nécessitent plusieurs exécutions.
Comment écrire une sous-requête en SQL
Syntaxe de base
Pour bien comprendre comment écrire une sous-requête en SQL, il est important de se familiariser avec sa structure syntaxique. Une sous-requête, également appelée subquery, est une requête imbriquée à l'intérieur d'une autre requête SQL. Elle permet d'extraire des données spécifiques en fonction de critères définis.
Structure Syntaxique de Base
Une sous-requête se place généralement dans la clause WHERE, FROM ou SELECT d'une requête principale. Voici la structure de base :
SELECT colonne1, colonne2 FROM table_principale WHERE colonne3 = (SELECT colonne FROM table_secondaire WHERE condition); Dans cet exemple, la sous-requête est utilisée pour filtrer les résultats de la table principale en fonction d'une condition définie dans la table secondaire.
Exemple Simple
Imaginons que vous ayez deux tables : Employés et Départements. Vous souhaitez obtenir les noms des employés qui travaillent dans le département Marketing.
SELECT nom FROM Employés WHERE id_departement = (SELECT id FROM Départements WHERE nom = 'Marketing'); Dans cet exemple, la sous-requête récupère l'id du département Marketing et l'utilise pour filtrer les employés qui y sont affectés.
| Élément | Description |
|---|---|
| SELECT | Indique les colonnes à extraire. |
| FROM | Spécifie la table principale ou secondaire. |
| WHERE | Définit la condition de filtrage, souvent en utilisant une sous-requête. |
| Subquery | Requête imbriquée qui retourne une valeur ou un ensemble de valeurs. |
En utilisant cette structure, vous pouvez créer des requêtes SQL plus dynamiques et adaptées à vos besoins spécifiques. N'oubliez pas que la clarté et la lisibilité de votre code sont primordiales pour un développement efficace.
Exemples pratiques
Les sous-requêtes en SQL sont des outils puissants qui permettent d'extraire des données de manière plus flexible et précise. Voici quelques exemples concrets pour vous aider à comprendre comment les utiliser efficacement.
Exemple 1 : Sous-requête pour filtrer des résultats
Imaginons que vous ayez une table Employes et une table Departements. Vous souhaitez lister les employés qui travaillent dans le département ayant le plus d'employés.
SELECT Nom, Prenom FROM Employes WHERE DepartementID = ( SELECT DepartementID FROM Employes GROUP BY DepartementID ORDER BY COUNT(*) DESC LIMIT 1 ); Dans cet exemple, la sous-requête sélectionne le département avec le plus grand nombre d'employés. La requête principale utilise ce résultat pour filtrer les employés.
Exemple 2 : Sous-requête pour calculer des valeurs agrégées
Supposons que vous souhaitiez trouver les produits dont le prix est supérieur à la moyenne des prix de tous les produits dans une table Produits.
SELECT NomProduit, Prix FROM Produits WHERE Prix > ( SELECT AVG(Prix) FROM Produits ); Ici, la sous-requête calcule la moyenne des prix. La requête principale compare chaque prix de produit à cette moyenne.
Exemple 3 : Sous-requête corrélée
Vous avez une table Ventes et vous voulez lister les ventes dont le montant est supérieur à la moyenne des ventes pour chaque client.
SELECT VenteID, ClientID, Montant FROM Ventes v1 WHERE Montant > ( SELECT AVG(Montant) FROM Ventes v2 WHERE v1.ClientID = v2.ClientID ); Cette sous-requête est corrélée car elle référence la table externeVentes (alias v1). Elle calcule la moyenne des montants pour chaque client, et la requête principale compare chaque vente à cette moyenne.
Assurez-vous que vos sous-requêtes sont optimisées pour éviter des temps de traitement longs, surtout avec de grandes bases de données.
Ces exemples montrent comment les sous-requêtes peuvent être utilisées pour filtrer, calculer et comparer des données de manière efficace. En les maîtrisant, vous pourrez écrire des requêtes SQL plus puissantes et adaptées à vos besoins.
Bonnes pratiques et erreurs courantes
Bonnes pratiques pour les sous-requêtes
Écrire des sous-requêtes en SQL peut sembler complexe, mais en suivant quelques bonnes pratiques, vous pouvez optimiser vos requêtes et améliorer leur efficacité. Voici quelques conseils pour vous guider dans cette démarche.
- Privilégiez les sous-requêtes simples : Lorsque cela est possible, optez pour des sous-requêtes simples. Elles sont plus faciles à lire et à maintenir. Par exemple, au lieu d'imbriquer plusieurs sous-requêtes, essayez de les décomposer en étapes distinctes.
- Utilisez des alias clairs : Donnez des noms explicites à vos sous-requêtes. Cela facilite la compréhension du code, surtout lorsque vous travaillez en équipe. Par exemple, utilisez
AS total_salespour une sous-requête calculant les ventes totales. - Évitez les sous-requêtes corrélées si possible : Les sous-requêtes corrélées peuvent être coûteuses en termes de performance car elles s'exécutent pour chaque ligne du résultat principal. Si vous pouvez les remplacer par des jointures, cela peut améliorer l'efficacité.
- Optimisez avec des index : Assurez-vous que les colonnes utilisées dans vos sous-requêtes sont indexées. Cela accélère l'exécution des requêtes, surtout pour les bases de données volumineuses.
- Testez la performance : Utilisez des outils comme EXPLAIN pour analyser le plan d'exécution de vos requêtes. Cela vous aide à identifier les goulots d'étranglement et à ajuster vos sous-requêtes en conséquence.
- Limitez le nombre de lignes retournées : Si votre sous-requête retourne un grand nombre de lignes, cela peut ralentir l'ensemble de la requête. Utilisez des clauses comme LIMIT pour restreindre le nombre de résultats.
- Documentez votre code : Ajoutez des commentaires pour expliquer la logique derrière vos sous-requêtes. Cela est particulièrement utile pour les requêtes complexes et facilite la maintenance future.
En appliquant ces pratiques, vous améliorez non seulement la performance de vos requêtes SQL, mais vous facilitez également leur compréhension et leur maintenance. N'oubliez pas que l'objectif est de rendre vos requêtes aussi claires et efficaces que possible, tout en répondant aux besoins spécifiques de votre projet.
Erreurs courantes à éviter
Lors de l'écriture de sous-requêtes en SQL, il est fréquent de commettre certaines erreurs qui peuvent compliquer l'exécution de vos requêtes ou produire des résultats inattendus. Voici quelques-unes de ces erreurs courantes et des conseils pour les éviter.
Utilisation incorrecte des alias
L'oubli d'alias pour les tables ou les colonnes dans une sous-requête peut entraîner des ambiguïtés, surtout lorsque plusieurs tables sont impliquées. Par exemple, si vous avez une sous-requête qui sélectionne des colonnes de plusieurs tables, assurez-vous d'utiliser des alias clairs pour éviter toute confusion.
Exemple :
SELECT e.name FROM employees e WHERE e.salary > (SELECT AVG(salary) FROM employees); Q : Pourquoi ma sous-requête ne retourne-t-elle pas les résultats attendus ?
R : Cela peut être dû à une mauvaise utilisation des opérateurs de comparaison. Assurez-vous que le type de données retourné par la sous-requête est compatible avec l'opérateur utilisé dans la requête principale. Par exemple, utiliser = avec une sous-requête qui retourne plusieurs lignes provoquera une erreur.
Q : Comment éviter les problèmes de performance avec les sous-requêtes ?
R : Les sous-requêtes peuvent être gourmandes en ressources, surtout si elles sont exécutées plusieurs fois. Pour optimiser, envisagez de réécrire la sous-requête en utilisant des jointures, qui sont souvent plus performantes.
Mauvaise gestion des sous-requêtes corrélées
Les sous-requêtes corrélées, qui dépendent de la requête principale, peuvent être difficiles à gérer. Elles sont exécutées pour chaque ligne de la requête principale, ce qui peut ralentir considérablement l'exécution. Assurez-vous que leur utilisation est justifiée et qu'elles sont optimisées.
Exemple :
SELECT e.name FROM employees e WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id); Oublier de vérifier les résultats de la sous-requête
Il est important de vérifier que la sous-requête retourne les résultats attendus avant de l'intégrer dans une requête plus complexe. Utilisez des outils comme SQL Fiddle ou des environnements de test pour valider vos sous-requêtes.
En gardant ces points à l'esprit, vous pourrez écrire des sous-requêtes en SQL de manière plus efficace et éviter les erreurs courantes qui peuvent survenir.
Nos formations
Ils ont suivi une formation avec SENZA
Des centaines de clients nous font confiance, et voici ce qu'ils ont pensé de nos formations. Ces avis sont vérifiés et proviennent directement de Google, reflétant l'expérience réelle de nos apprenants.
Téléchargez notre programme de formation