Retour à la liste des articles Articles
7 minutes de lecture

Quels sont les différents types de sous-requêtes SQL ?

Les sous-requêtes peuvent être utilisées dans de nombreux cas. Quels types de sous-requêtes SQL offre-t-il ? Et comment les utiliser efficacement ? Dans cet article, je vais vous guider à travers les différents types de sous-requêtes et les situations typiques dans lesquelles elles sont utiles.

Qu'est-ce qu'une sous-requête SQL ?

Une sous-requête, ou requête imbriquée, est une requête placée dans une autre requête SQL. Il existe de nombreux scénarios différents dans lesquels vous pouvez inclure une requête dans les clauses WHERE, FROM ou SELECT de votre requête principale.

Il est toujours plus facile d'appréhender de nouveaux concepts lorsqu'ils sont présentés à l'aide d'exemples. Alors, commençons ! Imaginons que nous gérions plusieurs galeries d'art et que nous disposions des tables suivantes dans notre base de données :

galleries

idcity
1London
2New York
3Munich

paintings

idnamegallery_idprice
1Patterns35000
2Ringer14500
3Gift13200
4Violin Lessons26700
5Curiosity29800

sales_agents

idlast_namefirst_namegallery_idagency_fee
1BrownDenis22250
2WhiteKate33120
3BlackSarah21640
4SmithHelen14500
5StewartTom32130

managers

idgallery_id
12
23
41

L'un des cas d'utilisation les plus simples des sous-requêtes consiste à les inclure dans la clause WHERE pour filtrer les résultats. Par exemple, si vous voulez voir les informations concernant uniquement les agents commerciaux qui ont reçu des frais d'agence supérieurs à la moyenne le mois dernier, vous pouvez utiliser la requête SQL suivante :

SELECT *
FROM sales_agents
WHERE agency_fee > 
(SELECT AVG(agency_fee)
 FROM sales_agents);

Ici, votre sous-requête calcule les frais d'agence moyens que votre équipe de vente a reçus le mois dernier et renvoie une seule valeur (2728 $). Vous utilisez ensuite cette valeur pour filtrer les résultats de votre requête principale et renvoyer les informations concernant uniquement les agents commerciaux dont les frais d'agence étaient supérieurs à la moyenne :

idlast_namefirst_namegallery_idagency_fee
2WhiteKate33120
4SmithHelen14500

Les sous-requêtes SQL peuvent renvoyer des valeurs uniques ou des tables entières. Il peut y avoir des sous-requêtes imbriquées ou des sous-requêtes corrélées. Chacun de ces types de sous-requêtes fonctionne bien pour certains cas d'utilisation. Si vous souhaitez obtenir des informations plus détaillées à ce sujet, lisez notre guide des sous-requêtes SQL pour les débutants. Dans cet article, je vais vous donner des exemples de différents types de sous-requêtes en SQL et vous guider dans les scénarios typiques où ce type de sous-requête est particulièrement pratique.

Sous-requêtes scalaires

Lorsqu'une sous-requête renvoie une seule valeur, ou exactement une ligne et exactement une colonne, nous l'appelons une sous-requête scalaire. Ce type de sous-requête est fréquemment utilisé dans la clause WHERE pour filtrer les résultats de la requête principale. La sous-requête de notre exemple précédent est une sous-requête scalaire, car elle renvoie une seule valeur (c'est-à-dire les frais d'agence moyens).

Les sous-requêtes scalaires peuvent également être utilisées dans l'instruction SELECT de la requête principale. Par exemple, disons que nous voulons voir le prix moyen de tous nos tableaux à côté du prix de chaque tableau.

SELECT name AS painting,
	 price,
	 (SELECT AVG(price)
  FROM paintings) AS avg_price
FROM paintings;

La sous-requête renvoie ici une valeur scalaire (5840 $) qui est simplement ajoutée à chaque ligne du tableau résultant :

paintingpriceavg_price
Patterns50005840
Ringer45005840
Gift32005840
Violin Lessons67005840
Curiosity98005840

Notez que la sous-requête (également appelée requête interne) dans cet exemple est totalement indépendante de la requête principale (également appelée requête externe) - vous pouvez exécuter la requête interne seule et obtenir un résultat significatif.

Sous-requêtes à rangs multiples

Si votre sous-requête renvoie plus d'une ligne, elle peut être appelée sous-requête à lignes multiples. Notez que ce type de sous-requête comprend (1) les sous-requêtes qui renvoient une colonne avec plusieurs lignes (c'est-à-dire une liste de valeurs) et (2) les sous-requêtes qui renvoient plusieurs colonnes avec plusieurs lignes (c'est-à-dire des tableaux).

Les sous-requêtes qui renvoient une colonne et plusieurs lignes sont souvent incluses dans la clause WHERE pour filtrer les résultats de la requête principale. Dans ce cas, elles sont généralement utilisées avec des opérateurs tels que IN, NOT IN, ANY, ALL, EXISTS ou NOT EXISTS qui permettent aux utilisateurs de comparer une valeur particulière avec les valeurs de la liste renvoyée par la sous-requête.

Vous voulez en savoir plus sur les sous-requêtes SQL avec l'opérateur IN ? Regardez un épisode de notre série Nous apprenons le SQL sur Youtube. N'oubliez pas de vous abonner à notre chaîne.

Par exemple, disons que vous voulez calculer les frais d'agence moyens pour les agents qui ne sont pas des managers. Vous pouvez utiliser la sous-requête suivante pour répondre à cette question :

SELECT AVG(agency_fee)
FROM sales_agents
WHERE id NOT IN (SELECT id
                 FROM managers);

La requête interne renvoie une liste de tous les ID de managers. Ensuite, la requête externe filtre uniquement les agents commerciaux qui ne figurent pas dans la liste des managers et calcule les frais d'agence moyens payés à ces agents. La requête renvoie une seule valeur - la moyenne des frais d'agence payés aux non-managers (1885 $).

Consultez notre guide des sous-requêtes SQL pour obtenir d'autres exemples de sous-requêtes à plusieurs rangs.

Sous-requêtes corrélées

Il existe également des sous-requêtes SQL dans lesquelles la requête interne repose sur des informations obtenues à partir de la requête externe. Il s'agit de sous-requêtes corrélées. En raison de l'interdépendance entre la requête principale et la requête interne, ce type de sous-requête peut être plus difficile à comprendre. Lisez ce guide pour débutants afin de mieux maîtriser les sous-requêtes corrélées en SQL.

Une fois encore, passons directement aux exemples ! Les sous-requêtes corrélées sont généralement utilisées dans les instructions SELECT, WHERE et FROM.

Si nous voulons calculer le nombre de tableaux trouvés dans chacune de nos galeries, nous pouvons utiliser la requête suivante. Notez la sous-requête corrélée dans l'instruction SELECT :

SELECT city, 
 (SELECT count(*)
  FROM paintings p
  WHERE g.id = p.gallery_id) total_paintings
FROM galleries g;

Ici, la sous-requête renvoie une valeur scalaire avec le nombre total de tableaux dans la galerie correspondante. La requête principale affiche cette information ainsi que la ville où se trouve cette galerie d'art.

citytotal_paintings
London2
New York2
Munich1

Vous pouvez également voir que, contrairement à nos exemples précédents, ici la requête interne dépend de la requête externe. Nous tirons l'ID de la galerie de la table galleries qui est dans la requête externe. En d'autres termes, vous ne pouvez pas exécuter la requête interne en tant que requête indépendante - cela ne ferait que générer une erreur.

Notez également que, dans ce cas, vous pourriez utiliser un JOIN au lieu d'une sous-requête et obtenir le même résultat :

SELECT g.city, count(p.name) AS total_paintings
FROM galleries g
JOIN paintings p
ON g.id = p.gallery_id
GROUP BY g.city;

Les JOIN sont généralement plus rapides que les sous-requêtes. Toutefois, si vous trouvez les sous-requêtes plus intuitives pour votre cas particulier, vous pouvez les utiliser. Pour en savoir plus sur l'utilisation des sous-requêtes et des JOIN, consultez notre guide complet.

Enfin, les sous-requêtes corrélées peuvent également être utilisées dans l'instruction WHERE. Par exemple, disons que nous voulons obtenir des informations sur les agents commerciaux dont les frais d'agence sont égaux ou supérieurs aux frais moyens de leur galerie. Nous pouvons exécuter la requête suivante pour obtenir le résultat souhaité :

SELECT last_name, 
       first_name, 
       agency_fee
FROM sales_agents sa1
WHERE sa1.agency_fee >= (SELECT avg(agency_fee)
                         FROM sales_agents sa2 
                         WHERE sa2.gallery_id = sa1.gallery_id);

La requête interne, dans ce cas, renvoie les frais d'agence moyens pour la galerie de l'agent commercial concerné. La requête externe renvoie les informations concernant uniquement les agents commerciaux qui satisfont à la condition incluse dans l'instruction WHERE (c'est-à-dire des frais d'agence égaux ou supérieurs à la moyenne de leur galerie).

last_namefirst_nameagency_fee
BrownDenis2250
WhiteKate3120
SmithHelen4500

Encore une fois, la sous-requête dans cet exemple est une sous-requête corrélée, car elle ne peut pas être exécutée indépendamment de la requête externe. Si vous voulez en savoir plus, consultez ce tutoriel facile à suivre sur l'écriture de sous-requêtes corrélées.

Même si les différents types de sous-requêtes SQL couvrent de nombreuses situations typiques, il existe des cas où vous pouvez utiliser des expressions de table communes (CTE) au lieu de sous-requêtes. Si vous souhaitez en savoir plus sur les CTE, consultez cet article qui vous expliquera les différences entre les sous-requêtes et les CTE.

Il est temps de s'entraîner aux différents types de sous-requêtes SQL !

Vous avez appris qu'il existe de nombreux types de sous-requêtes en SQL. En fonction de la tâche à accomplir, vous pouvez appliquer des sous-requêtes scalaires, multi-rangs ou corrélées pour obtenir le résultat dont vous avez besoin.

Nous avons déjà parcouru plusieurs exemples de sous-requêtes et découvert où vous pouvez les utiliser. Cependant, pour devenir un utilisateur de SQL vraiment puissant, vous devez vous entraîner davantage avec les différents types de sous-requêtes. C'est le moment de faire des exercices interactifs !

Notre cours SQL pour les débutants comporte une section complète sur les sous-requêtes, où des explications détaillées et des exemples sont combinés à des dizaines d'exercices. Consultez-la ! Pour vous entraîner davantage, je vous recommande également de compléter la section sur les sous-requêtes dans la section Exercices Pratiques de SQL.

Plus de pratique = plus de requêtes SQL professionnelles ! Bon apprentissage !