27th Apr 2022 7 minutes de lecture Quels sont les différents types de sous-requêtes SQL ? Kateryna Koidan sql apprendre sql sous-requête Table des matières Qu'est-ce qu'une sous-requête SQL ? Sous-requêtes scalaires Sous-requêtes à rangs multiples Sous-requêtes corrélées Il est temps de s'entraîner aux 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 ! Tags: sql apprendre sql sous-requête