cours
Sous-requête SQL : Un guide complet
Les sous-requêtes SQL sont un outil puissant dans la gestion des bases de données, permettant une extraction plus complexe et plus efficace des données. Ce guide vous guidera à travers les principes fondamentaux des sous-requêtes SQL et vous donnera un aperçu de leurs applications pratiques et de leurs techniques avancées. Que vous soyez débutant ou professionnel expérimenté, la maîtrise des sous-requêtes peut considérablement améliorer vos compétences en SQL.
Pour ceux qui ne connaissent pas SQL, commencez par notre cours SQL intermédiaire afin de construire une base solide. De plus, je trouve que l' aide-mémoire SQL Basics, que vous pouvez télécharger, est une référence utile car il contient toutes les fonctions SQL les plus courantes. Enfin, je tiens à dire que les sous-requêtes sont un moyen courant de répondre aux questions d'entretien en SQL. question d'entretien SQL, donc si vous vous préparez à un entretien, vous êtes au bon endroit pour une révision.
Qu'est-ce qu'une sous-requête SQL ?
Une sous-requête permet aux requêtes SQL d'être plus modulaires en traitant des tâches qui nécessiteraient autrement plusieurs requêtes distinctes.
Définition et objectif
Une sous-requête SQL est une requête imbriquée dans une autre requête SQL, utilisée pour effectuer des opérations nécessitant plusieurs étapes ou une logique complexe. Le rôle des sous-requêtes dans SQL est notamment le suivant :
- Filtrage des enregistrements sur la base de données provenant de tableaux connexes.
- Agréger des données et effectuer des calculs de manière dynamique.
- Recouper les données entre les tableaux pour obtenir des informations spécifiques.
- Sélection conditionnelle des lignes sans nécessiter de jointures explicites ou de code logique externe.
Cela peut sembler beaucoup, mais cela prendra tout son sens au fur et à mesure que nous explorerons ces aspects dans le didacticiel.
Types de sous-requêtes
Vous serez peut-être surpris d'apprendre qu'il existe différents types de sous-requêtes. Les différents types sont regroupés en fonction des différents types de besoins en matière de recherche de données et sont adaptés à ceux-ci. Vous pouvez choisir parmi les sous-requêtes suivantes en fonction de l'opération que vous souhaitez effectuer :
Sous-requêtes scalaires
Les sous-requêtes scalaires renvoient une seule valeur, par exemple une ligne et une colonne. Ils sont souvent utilisés lorsqu'une seule valeur est attendue, par exemple dans les calculs, les comparaisons ou les affectations dans les clauses SELECT
ou WHERE
.
Dans l'exemple ci-dessous, la sous-requête scalaire (SELECT AVG(salary) FROM employees)
renvoie une seule valeur, le salaire moyen, et la compare au salaire de chaque employé.
-- Example of Scalar Subquery
-- Compares each salary to the average salary
SELECT employee_name,
salary,
(SELECT AVG(salary) FROM employees) AS average_salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
Sous-requêtes sur les colonnes
Les sous-requêtes de colonnes renvoient une seule colonne mais plusieurs lignes. Ces sous-requêtes sont souvent utilisées avec des opérateurs tels que IN
ou ANY
, où la requête externe compare les valeurs de plusieurs lignes.
Par exemple, la sous-requête ci-dessous renvoie une liste d'identifiants de départements situés à New York, que la requête principale utilise ensuite pour filtrer les employés de ces départements.
-- Example of Column Subquery
-- Filters based on departments in New York
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');
Sous-requêtes de ligne
Les sous-requêtes de ligne renvoient une seule ligne contenant plusieurs colonnes. Ces sous-requêtes sont généralement utilisées avec des opérateurs de comparaison qui peuvent comparer une ligne de données, tels que les opérateurs =
ou IN
, lorsque plusieurs valeurs sont attendues.
La sous-requête suivante récupère le service et l'intitulé du poste d'un responsable, et la requête externe recherche les employés dont les valeurs correspondent.
-- Example of Row Subquery
-- Matches department and job title with a specific manager
SELECT employee_name
FROM employees
WHERE (department_id, job_title) = (SELECT department_id, job_title FROM managers WHERE manager_id = 1);
Sous-requêtes de tableaux (tableaux dérivés)
Les sous-requêtes de tableaux, ou tableaux dérivés, renvoient un tableau complet composé de plusieurs lignes et colonnes. Ces tableaux sont généralement utilisés dans la clause FROM
en tant que tableau temporaire dans une requête.
Par exemple, la sous-requête ci-dessous crée un tableau dérivé des salaires moyens par département, qui est ensuite utilisé dans la requête externe pour trouver les départements dont le salaire moyen est supérieur à un seuil spécifié.
-- Example of Table Subquery
-- Uses derived table for average department salary comparison
SELECT dept_avg.department_id, dept_avg.avg_salary
FROM
(SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id) AS dept_avg
WHERE dept_avg.avg_salary > 50000;
Comprendre les sous-requêtes SQL
Dans les exemples ci-dessus, nous avons vu qu'une sous-requête est placée entre parenthèses. Explorons maintenant les mécanismes d'une sous-requête, y compris sa syntaxe et son ordre d'exécution.
Syntaxe et structure
La syntaxe d'une sous-requête varie en fonction de l'endroit où elle est utilisée dans l'instruction SQL principale, par exemple dans les clauses SELECT
, FROM
ou WHERE
. Les sous-requêtes sont généralement placées entre parenthèses à l'adresse ( )
, ce qui indique qu'il s'agit d'une requête distincte.
L'exemple suivant montre une sous-requête dans une clause WHERE
, ce qui nous permet de filtrer les données de la requête principale sur la base des résultats d'une requête imbriquée.
-- Selects the main column to retrieve from the main table to query
SELECT column_name
FROM table_name
-- Applies a condition to filter rows based on the subquery result
WHERE column_name operator
-- Subquery retrieves data for comparison in the WHERE clause
(SELECT column_name FROM table_name WHERE condition);
Ordre d'exécution
L'ordre d'exécution des sous-requêtes dépend de leur corrélation ou de leur non-corrélation.
Sous-requêtes non corrélées
Les sous-requêtes non corrélées sont indépendantes de la requête externe et s'exécutent en premier. Le résultat de la sous-requête est ensuite transmis à la requête externe. Les sous-requêtes non corrélées sont généralement utilisées pour les calculs et les filtres scalaires ou au niveau des colonnes.
La requête ci-dessous suit l'ordre d'exécution :
-
La sous-requête
(SELECT AVG(salary) FROM employees)
est exécutée en premier et calcule le salaire moyen. -
La requête externe permet alors de retrouver les salariés dont le salaire est supérieur à cette moyenne.
-- Retrieves names of employees with above-average salary
SELECT employee_name
FROM employees
-- Subquery: calculates average salary across all employees
WHERE salary > (SELECT AVG(salary) FROM employees);
Je vous recommande de suivre le cours Introduction à SQL Server de DataCamp pour en savoir plus sur le regroupement et l'agrégation de données, ainsi que sur la jonction de tableaux.
Sous-requêtes corrélées
Les sous-requêtes corrélées dépendent de la requête externe pour certaines de leurs données, elles sont donc réévaluées pour chaque ligne traitée par la requête externe.
La requête suivante s'exécute dans cet ordre :
-
Pour chaque ligne de
employees
(aliase1
), la sous-requête(SELECT AVG(e2.salary) FROM employees e2 WHERE e2.department_id = e1.department_id)
calcule le salaire moyen pour ce département spécifique. -
La requête externe compare ensuite le salaire de chaque employé avec le salaire moyen du département et n'inclut que ceux qui gagnent plus.
-- Retrieves names of employees with above-average salary in their department
SELECT e1.employee_name
FROM employees e1
-- Subquery: calculates average salary for each department
WHERE e1.salary > (SELECT AVG(e2.salary) FROM employees e2 WHERE e2.department_id = e1.department_id);
Applications de la sous-requête SQL
Les sous-requêtes SQL sont importantes pour la récupération et la transformation des données. Elles vous permettent d'écrire des requêtes complexes et de traiter des tâches d'analyse de données avancées. Vous trouverez ci-dessous des applications concrètes des sous-requêtes dans la gestion des bases de données.
Filtrage des données
Les sous-requêtes sont utiles pour filtrer les données en fonction de conditions dynamiques, en particulier lorsque le filtrage nécessite de comparer des valeurs dans plusieurs tableaux ou d'effectuer des calculs.
La sous-requête suivante permet de retrouver le site category_id
du "Produit A", et la requête principale permet de retrouver tous les produits de cette catégorie.
-- Retrieves names of products in the same category as 'Product A'
SELECT product_name
FROM products
-- Subquery: finds category ID of 'Product A'
WHERE category_id = (SELECT category_id FROM products WHERE product_name = 'Product A');
Agrégation de données
Les sous-requêtes sont également utilisées pour l'agrégation de données, en particulier lors de la génération de statistiques sommaires ou d'informations pour l'établissement de rapports et l'analyse. La sous-requête (SELECT department_id, AVG(sales) AS avg_sales FROM sales GROUP BY department_id)
calcule les ventes moyennes par département. La requête externe filtre ensuite les départements dont le chiffre d'affaires moyen est supérieur à 50 000.
-- Retrieves department IDs and their average sales
-- Filters for departments with average sales over 50,000
SELECT department_id, avg_sales
FROM (SELECT department_id, AVG(sales) AS avg_sales FROM sales GROUP BY department_id) AS dept_sales -- Subquery: calculates average sales per department
WHERE avg_sales > 50000;
Considérations sur les performances et meilleures pratiques
Bien que les sous-requêtes soient puissantes lors de l'écriture de requêtes complexes, elles peuvent avoir un impact sur les performances, en particulier lorsque vous travaillez avec de grands ensembles de données. Il est important de tenir compte des pièges les plus courants et des meilleures pratiques pour améliorer les performances.
Optimiser les performances des sous-requêtes
L'optimisation des performances des sous-requêtes permet d'améliorer le temps d'exécution des requêtes et la réactivité de la base de données. Vous trouverez ci-dessous des moyens d'optimiser la sous-requête.
-
Index Colonnes pertinentes : Pour accélérer la recherche de données, veillez à ce que les colonnes utilisées dans les clauses
WHERE
etJOIN
et les opérations de comparaison soient indexées. -
Limitez l'utilisation de sous-requêtes corrélées : Dans la mesure du possible, utilisez des opérations JOIN ou des CTE au lieu de sous-requêtes corrélées, car elles permettent souvent de traiter les données plus rapidement en utilisant des opérations d'ensemble plutôt qu'un traitement ligne par ligne.
-
Limiter le nombre de colonnes dans les sous-requêtes : Ne sélectionnez que les colonnes dont vous avez besoin dans les sous-requêtes afin de minimiser la récupération des données, de réduire l'utilisation de la mémoire et de permettre à la base de données d'optimiser l'exécution.
-
Utilisez EXISTS au lieu de IN : Si une sous-requête renvoie un grand ensemble de données, l'utilisation de
EXISTS
au lieu deIN
peut améliorer les performances. L'opérateurEXISTS
interrompt le traitement de la requête lorsqu'il trouve une ligne correspondante, tandis que l'opérateurIN
continue d'évaluer l'ensemble du résultat de la sous-requête.
Éviter les pièges les plus courants
Lorsque vous écrivez des sous-requêtes de manière incorrecte, vous pouvez rencontrer des problèmes lors de leur exécution. Voyons comment éviter ces pièges.
-
Évitez les sous-requêtes corrélées inutiles : Les sous-requêtes corrélées sont gourmandes en ressources ; évitez donc de les utiliser lorsque le résultat peut être obtenu avec une sous-requête non corrélée ou une jointure.
-
Attention aux valeurs NULL dans les sous-requêtes : les valeurs
NULL
peuvent conduire à des résultats inattendus, en particulier dans les sous-requêtes qui utilisent des opérateurs de comparaison tels queIN
ou=
. Pour éviter les erreurs, envisagez d'utiliserCOALESCE
pour gérer les nullités ou assurez-vous que les colonnes ne sont pas nullables si elles sont utilisées pour des comparaisons. -
Évitez d'utiliser SELECT * dans les sous-requêtes : L'utilisation de
SELECT *
peut s'avérer inefficace, car elle récupère toutes les colonnes, même si vous n'en avez pas besoin. Cela augmente l'utilisation de la mémoire et peut ralentir l'exécution des requêtes, en particulier pour les grands ensembles de données. -
Utilisez des alias pertinents : Nommez clairement vos tableaux et vos sous-requêtes pour améliorer la lisibilité.
Essayez notre cursus de développeur SQL Server, qui vous permettra d'acquérir les compétences nécessaires pour écrire, dépanner et optimiser vos requêtes à l'aide de SQL Server.
Techniques plus avancées de sous-requêtes SQL
Si les sous-requêtes constituent un moyen efficace d'écrire des requêtes complexes, il existe des méthodes avancées pour traiter les données hiérarchiques. Examinons les techniques et stratégies avancées d'application des sous-requêtes SQL.
Sous-requêtes récursives
Les sous-requêtes récursives (également connues sous le nom d'expressions récursives de tableau commun ou CTE) vous permettent d'extraire des données hiérarchiques, telles que des structures organisationnelles, des catégories de produits ou des relations graphiques, où chaque élément des données est lié à un autre.
Supposons que vous ayez un tableau employees
avec employee_id
, manager_id
, et employee_name
. Vous voulez récupérer la hiérarchie des employés sous un manager spécifique.
WITH RECURSIVE EmployeeHierarchy AS (
-- Anchor Query: Start with the specified manager
SELECT employee_id, manager_id, employee_name, 1 AS level
FROM employees
-- Assuming the top-level manager has NULL as manager_id
WHERE manager_id IS NULL
UNION ALL
-- Recursive Query: Find employees who report to those in the previous level
SELECT e.employee_id, e.manager_id, e.employee_name, eh.level + 1
FROM employees e
INNER JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM EmployeeHierarchy;
Dans la requête ci-dessus :
-
Ce que j'appelle la requête d'ancrage sélectionne le gestionnaire de premier niveau (où
manager_id
estNULL
). -
La requête récursive associe
employees
à l'ETC lui-même (EmployeeHierarchy
), ce qui permet de trouver les salariés qui dépendent de chaque salarié précédemment recherché. -
La récursion se poursuit jusqu'à ce qu'il n'y ait plus d'employés qui se rapportent à ceux qui ont été trouvés.
Combiner les sous-requêtes avec d'autres fonctionnalités SQL
Vous pouvez intégrer les sous-requêtes à d'autres fonctions SQL telles que les fonctions de fenêtre, les instructions CASE
et les fonctions de regroupement. Ces combinaisons permettent une manipulation avancée des données et l'établissement de rapports plus complets.
Combinaison de sous-requêtes avec des fonctions de fenêtre
Les sous-requêtes peuvent être utilisées pour affiner l'ensemble de données sur lequel les fonctions de fenêtre agissent, ce qui les rend utiles pour le classement, les totaux cumulés et les moyennes mobiles. Supposons que vous souhaitiez classer les produits en fonction des ventes réalisées dans chaque région. Vous pouvez utiliser une sous-requête pour sélectionner les données pertinentes, puis appliquer une fonction de fenêtre pour le classement.
-- Ranks products by sales within each region
SELECT region, product_id, sales,
RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS sales_rank
-- Subquery: calculates total sales per product in each region
FROM (SELECT region, product_id, SUM(sales) AS sales
FROM sales_data
GROUP BY region, product_id) AS regional_sales;
Utilisation de sous-requêtes avec les instructions CASE
La combinaison de sous-requêtes avec les instructions CASE
peut vous aider à appliquer des conditions complexes basées sur des calculs dynamiques. La requête suivante permet de classer les produits dans les catégories "élevé", "moyen" ou "faible" en fonction de leur chiffre d'affaires par rapport au chiffre d'affaires moyen de leur catégorie.
-- Categorize above-average sales, average sales, and below-average sales
SELECT product_id, category_id, sales,
CASE
WHEN sales > (SELECT AVG(sales) FROM products WHERE category_id = p.category_id) THEN 'High'
WHEN sales = (SELECT AVG(sales) FROM products WHERE category_id = p.category_id) THEN 'Medium'
ELSE 'Low'
END AS performance
FROM products AS p;
Sous-requêtes avec fonctions d'agrégation pour l'agrégation conditionnelle
Vous pouvez également calculer des agrégats conditionnels en utilisant des sous-requêtes dans les fonctions d'agrégat. Supposons que vous souhaitiez calculer le revenu total généré uniquement par les clients actifs. Dans l'exemple ci-dessous, la sous-requête récupère tous les clients actifs. La requête principale filtre ensuite les commandes pour n'inclure que celles passées par des clients actifs, en calculant le revenu total de ce groupe.
-- Calculates total revenue from active customers
SELECT SUM(order_total) AS active_customer_revenue
FROM orders
-- Subquery: retrieves IDs of active customers
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE status = 'Active'
);
Utilisation des sous-requêtes SQL
Les sous-requêtes SQL offrent des applications polyvalentes pour l'analyse des données, c'est pourquoi elles sont si souvent utilisées. Vous trouverez ci-dessous quelques applications mathématiques ou spécifiques à l'industrie des sous-requêtes SQL. Pour trouver ces idées, j'ai essayé de penser à des travaux d'analyse ou d'ingénierie de données qui nécessitent plusieurs étapes, et c'est là, à mon avis, que les sous-requêtes sont vraiment utiles.
Exemples spécifiques à l'industrie
Les sous-requêtes peuvent offrir des solutions utiles dans les secteurs de la finance, de la santé et du commerce de détail. Voici quelques idées :
-
Évaluation des risques pour l'approbation des prêts (Finance) : J'imagine les banques en train de jongler avec des paramètres tels que les ratios dette/revenu et les scores de crédit. En imbriquant ces mesures dans des sous-requêtes, les analystes peuvent mieux comprendre les mesures financières complexes. Une sous-requête peut, par exemple, calculer le montant moyen du prêt pour les clients se situant dans des tranches de revenus spécifiques.
-
Identifier des modèles dans les diagnostics des patients (soins de santé) : Dans le secteur des soins de santé, la gestion des données des patients peut s'avérer une lourde tâche. Les sous-requêtes peuvent contribuer à réduire cette complexité. J'imagine utiliser des sous-requêtes pour suivre la fréquence des diagnostics dans différents groupes d'âge ou facteurs de risque.
-
Optimisation du placement des produits en fonction de l'historique des achats (commerce de détail) : Les détaillants s'efforcent de comprendre les habitudes d'achat. Les sous-requêtes peuvent afficher des données d'achat imbriquées afin d'identifier les produits qui sont souvent achetés ensemble. Cela peut aider à placer stratégiquement des articles complémentaires et à stimuler les ventes.
Connexions mathématiques
Les sous-requêtes sont également utilisées pour identifier des modèles et des tendances de données dans des connexions mathématiques et logiques. Voici quelques exemples d'applications des sous-requêtes en mathématiques.
-
Moyennes mobiles pour l'analyse des séries temporelles : Lors de l'analyse des tendances dans le temps, les sous-requêtes simplifient le calcul des moyennes mobiles. Je les vois définir des fenêtres temporelles spécifiques dans des requêtes imbriquées, ce qui facilite le lissage des données et l'identification des tendances.
-
Détection des valeurs aberrantes à l'aide des écarts types : Le repérage des valeurs aberrantes est important pour de nombreuses choses, notamment pour la détection des fraudes. Les sous-requêtes permettent de calculer facilement des mesures telles que les écarts types dans le cadre de requêtes imbriquées.
-
Utilisation des concepts de la théorie des ensembles : Je trouve intéressante la façon dont les sous-requêtes reflètent les opérations de la théorie des ensembles comme
UNION
etINTERSECT
. Cette capacité est idéale pour des tâches telles que l'analyse de la fidélisation de la clientèle, où la compréhension des chevauchements et des différences entre les groupes de clients permet d'élaborer des stratégies de marketing plus intelligentes.
Conclusion
La maîtrise des sous-requêtes SQL peut considérablement améliorer votre capacité à gérer et à analyser les données de manière efficace. En comprenant leur structure, leurs applications et les meilleures pratiques, vous pouvez optimiser vos requêtes SQL pour de meilleures performances. Je tiens également à préciser que la maîtrise des sous-requêtes facilite l'écriture du langage SQL, et qu'il vaut donc la peine de l'apprendre.
Si vous souhaitez devenir un analyste de données compétent, consultez notre cursus d'analyste de données associé en SQL pour acquérir les compétences nécessaires. Le cours Reporting in SQL est également approprié si vous souhaitez apprendre à construire des tableaux de bord professionnels à l'aide de SQL. Enfin, je vous recommande d'obtenir la certification SQL Associate pour démontrer votre maîtrise de l'utilisation de SQL pour l'analyse des données et vous démarquer parmi les autres professionnels des données.
FAQ sur les sous-requêtes SQL
Qu'est-ce qu'une sous-requête SQL ?
Une sous-requête SQL est une requête imbriquée dans une autre requête SQL, utilisée pour effectuer des opérations nécessitant plusieurs étapes ou une logique complexe.
Comment utiliser une sous-requête en SQL ?
Les sous-requêtes sont utilisées dans les instructions SQL pour filtrer les données, effectuer des calculs ou récupérer des informations spécifiques en fonction de conditions complexes.
Quels sont les types de sous-requêtes en SQL ?
Les sous-requêtes SQL peuvent être classées en sous-requêtes scalaires, de colonnes, de lignes et de tableaux, chacune servant à des fins différentes dans la recherche de données.
Quelle est la différence entre une sous-requête et une jointure ?
Une sous-requête est une requête imbriquée utilisée pour des opérations complexes, tandis qu'une jointure combine les lignes de deux tableaux ou plus sur la base de colonnes apparentées.
Comment les sous-requêtes peuvent-elles améliorer les performances des requêtes SQL ?
Les sous-requêtes permettent de rationaliser les requêtes complexes en les divisant en parties plus petites et plus faciles à gérer, ce qui peut améliorer les performances si elles sont utilisées correctement.
Apprenez SQL avec DataCamp
cours
SQL intermédiaire
cours
Jointure de données en SQL
blog
Les 32 meilleures questions d'entretien sur AWS et leurs réponses pour 2024
blog
Q2 2023 DataCamp Donates Digest
blog
Les 20 meilleures questions d'entretien pour les flocons de neige, à tous les niveaux

Nisha Arya Ahmed
20 min
blog
Célébration de Saghar Hazinyar : Une boursière de DataCamp Donates et une diplômée de Code to Inspire

Fereshteh Forough
4 min
blog
2022-2023 Rapport annuel DataCamp Classrooms
blog