Retour à la liste des articles Articles
8 minutes de lecture

Comment pratiquer les sous-requêtes SQL

Vous êtes-vous déjà demandé ce qui sépare les débutants des utilisateurs avancés de SQL ? Cela inclut des choses comme, par exemple, les sous-requêtes. Dans cet article, j'explique leur importance et pourquoi vous devez pratiquer les sous-requêtes SQL pour devenir un expert.

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

SQL est un langage facile à apprendre. Cependant, il existe certaines fonctionnalités et techniques complexes du langage qui nécessitent de la pratique. L'une de ces caractéristiques est la sous-requête, qui ajoute une grande puissance d'expression au langage et à vos projets.

Dans cet article, nous passons en revue des exemples qui vous permettront de faire vos premiers pas dans la pratique des sous-requêtes. Nous mentionnons également des articles et des cours où vous trouverez davantage de matériel, comme des conférences et des exercices, pour continuer à progresser dans l'utilisation des sous-requêtes.

Si vous ne savez pas de quoi je parle, commencez par le SQL pour les débutants cours. C'est le point de départ idéal pour apprendre SQL. Si vous connaissez déjà un peu le sujet mais ne savez pas comment pratiquer les sous-requêtes, lisez la suite.

En termes simples, une sous-requête est une requête dans une autre requête. SQL permet de placer des sous-requêtes dans différentes parties d'une requête SQL, comme les clauses WHERE et FROM, entre autres. Il est très facile de créer une sous-requête car sa structure est la même que celle d'une requête ordinaire. Il suffit de connaître certaines règles sur la façon de connecter la requête et la sous-requête.

Avant de commencer avec des exemples, clarifions un peu de vocabulaire : dans le reste de cet article, nous appelons la requête externe dans laquelle réside une sous-requête une "requête externe".

Introduisons une base de données simple avec deux tables : employee et department.

Table employee

employee_idlast_namefirst_namesalarydepartment_id
1001SmithJohn145000.00100
1002BelleMary115000.00101
1003DalePeter155000.00102
1004GarrahanSusan195000.00100
1005GarrahanMary94000.00102
1006FiesJulia92000.00101

Table department

department_iddept_namemanager_idbudgetbuilding
100Sales23240000.00CentralPark
101Accounting56130000.00CentralPark
102IT34150000.00Oblivious

Supposons que nous voulions obtenir le nom du département ayant le plus gros budget. Nous pouvons écrire la requête suivante, qui inclut une sous-requête (en bleu):

SELECT dept_name, budget
FROM   department
WHERE budget = ( SELECT MAX(budget) FROM department )

Nous avons une sous-requête (en bleu) dans la clause WHERE qui renvoie le plus grand budget de la table department table. Ensuite, nous utilisons cette valeur dans la clause WHERE de la requête externe pour la comparer avec la colonne budget. Tous les enregistrements de la table department ayant un budget égal à la valeur maximale du budget sont retournés.

Notez que la sous-requête est placée entre parenthèses. En SQL, les sous-requêtes doivent toujours être mises entre parenthèses.

Avec cet exemple, nous avons vu combien il est facile et simple de créer une sous-requête. Cependant, il existe certaines règles concernant la manière de connecter la sous-requête à la requête externe. Nous devons également savoir où une sous-requête doit se trouver dans l'instruction SELECT. Il existe différentes clauses (comme WHERE, FROM et HAVING) dans la requête externe où nous pouvons placer une sous-requête. Ce sont là quelques-unes des raisons pour lesquelles il est si important de s'entraîner à utiliser des sous-requêtes.

Enfin, pour ceux qui cherchent des ressources pour mettre en pratique leurs compétences SQL, je suggère le cours Exercices Pratiques de SQL. Vous y trouverez plus de 80 exercices interactifs, allant de tâches simples avec les instructions SELECT FROM à des problèmes plus avancés impliquant des sous-requêtes multiples. Un autre ensemble intéressant d'exercices SQL se trouve dans les Pratique SQL mensuelle, où vous voyez votre code SQL en action et recevez un retour immédiat.

Un autre exemple de sous-requête SQL

Nous avons vu une sous-requête qui renvoie un ensemble de résultats contenant un seul enregistrement et une seule colonne. Ce type de sous-requête est assez courant, et il est facile d'intégrer ou de connecter la sous-requête à la requête externe en utilisant l'opérateur equal (=).

Voyons maintenant une sous-requête qui renvoie une seule colonne mais plusieurs enregistrements, par opposition à une sous-requête qui produit un seul enregistrement.

Supposons que nous ayons besoin d'obtenir les identifiants et les noms des employés qui travaillent dans le bâtiment CentralPark. Nous pouvons écrire une requête SQL comme la suivante. Là encore, la sous-requête est en bleu.

SELECT employee_id, last_name, first_name
FROM   employee
WHERE department_id IN ( SELECT department_id
                         FROM   department
                         WHERE  building = ‘CentralPark’
                       )

La première chose à noter est le nombre d'enregistrements renvoyés par la sous-requête. Elle renvoie deux enregistrements car il y a deux départements dans le bâtiment CentralPark : les ventes et la comptabilité. Ainsi, la sous-requête génère un ensemble de résultats avec deux ID de département, 100 et 101.

La deuxième chose à noter est l'opérateur IN utilisé dans la clause WHERE de la requête externe. Lorsqu'une sous-requête renvoie plusieurs lignes, nous ne pouvons pas utiliser l'opérateur equal (=) comme dans le premier exemple. À la place, nous utilisons l'opérateur IN, qui fonctionne comme l'opérateur "appartient à". En d'autres termes, la condition

department_id IN ( SELECT department_id
                         FROM   department
                         WHERE  building = ‘CentralPark’
                       )

renvoie VRAI lorsque la valeur de department_id existe dans l'ensemble de résultats de la sous-requête et FALSE lorsque la valeur de department_id ne figure pas dans l'ensemble de résultats de la sous-requête.

Essayez toujours d'identifier à l'avance le nombre d'enregistrements que votre sous-requête renvoie. S'agit-il d'une sous-requête à enregistrements multiples ou d'une sous-requête à enregistrement unique ? En fonction de cela, déterminez comment la connecter à la requête externe. Pour en savoir plus sur les sous-requêtes multi-enregistrements et mono-enregistrement, je vous conseille vivement les articles "Beginner's Guide to the SQL Subquery" et "What Are the Different Types of SQL Subqueries ?".

Pour ceux qui veulent approfondir les sous-requêtes, un autre article intéressant est "Sous-requête vs JOIN", qui vous apprend les différentes façons de créer des requêtes SQL équivalentes à l'aide de jointures et de sous-requêtes.

Utilisation de sous-requêtes SQL dans d'autres parties de la requête

Nous avons montré des exemples de sous-requêtes dans la clause WHERE de l'instruction SELECT. Dans cette section, nous présentons des sous-requêtes dans d'autres clauses.

La clause FROM est celle où nous spécifions généralement la table à lire dans la requête. Toutefois, nous pouvons placer une sous-requête dans la clause FROM pour créer une sorte d'ensemble de résultats intermédiaires. Ensuite, cet ensemble de résultats peut être utilisé comme une table virtuelle par la requête externe.

Prenons un exemple. Supposons que nous ayons des départements où le salaire total de tous les employés dépasse le budget du département. Pour détecter ces cas, nous voulons obtenir le budget et le montant total des salaires versés par chaque département. Nous ajoutons également au rapport une expression mathématique pour obtenir la partie non utilisée du budget. Voyons la requête :

SELECT 	d1.dept_name,
d1.budget,
total.total_salaries,
d1.budget - total.total_salaries AS budget_after_salaries
FROM		( SELECT department_id, SUM(salary) AS total_salaries
		  FROM employee
		 GROUP BY department_id
		) AS total
INNER JOIN    department d1 ON d1.department_id = total.department_id

La sous-requête en bleu dans la clause FROM crée une table intermédiaire nommée total avec les colonnes department_id et total_salaries. Ensuite, nous effectuons un JOIN entre la table intermédiaire total et la table régulière department. Dans la liste des colonnes de SELECT, nous calculons la différence entre le budget du département et le montant total des salaires. Nous appelons cette valeur budget_after_salaries. Voyons le résultat de la requête :

dept_namebudgettotal_salariesbudget_after_salaries
Sales240000340000-100000
Accounting28000020700073000
IT2490002500001000

Nous pouvons également placer des sous-requêtes dans d'autres clauses de l'instruction SELECT, comme la clause HAVING utilisée pour filtrer des groupes d'enregistrements. Supposons que nous voulions afficher les départements dont le montant total des salaires est supérieur à la moyenne des totaux des départements. Nous obtenons la moyenne des totaux des départements à l'aide d'une sous-requête. Voyons cette requête :

SELECT 	d1.dept_name,
SUM(salary)
FROM		employee e
INNER JOIN  department d1 ON d1.department_id = e.department_id
GROUP BY  d1.dept_name
HAVING SUM(salary) > (
SELECT SUM(salary)/COUNT(distinct department_id)
FROM   employee
   )

Nous obtenons le montant total des salaires dans chaque département avec l'expression SUM(salary). Ensuite, dans la clause HAVING, nous comparons ce montant avec le total moyen du département obtenu dans la sous-requête. Les départements dont SUM(salary) est supérieur au résultat de la sous-requête sont affichés dans le résultat de la requête, comme nous le voyons ci-dessous :

dept_nametotal_salaries
Sales340000

Pour ceux qui veulent apprendre où la sous-requête est prise en charge dans SQL, les deux articles suivants expliquent d'autres endroits où les sous-requêtes peuvent être placées. L'article "Subquery vs. CTE : A SQL Primer" explique les CTE, et dans l'article "How to Use Subqueries in INSERT, UPDATE, and DELETE Statements", comme le dit le titre, vous apprenez à utiliser les sous-requêtes SQL dans d'autres instructions comme INSERT, UPDATE et DELETE.

Pratique des sous-requêtes SQL pour améliorer vos compétences

Nous avons vu plusieurs sous-requêtes SQL dans différentes clauses. Les sous-requêtes SQL sont généralement utilisées dans une instruction SELECT; toutefois, il est possible de les utiliser dans d'autres instructions. Il existe également d'autres types de sous-requêtes SQL, comme les sous-requêtes corrélées et les CTE, qui ajoutent encore plus d'expressivité au langage SQL.

Il est facile et intuitif d'apprendre le langage SQL, surtout lors des premières étapes. Mais comme tout langage, vous devez vous exercer pour atteindre le niveau où vous pouvez gérer et créer toutes sortes de requêtes et de rapports. Plus vous passerez de temps à résoudre des problèmes dans le langage SQL, plus vous acquerrez de compétences dans ce domaine.

Pour terminer, je voudrais vous présenter d'excellentes ressources pour apprendre le langage SQL. Tout d'abord, voici deux articles consacrés à la pratique du langage SQL : "Combien de La pratique du SQL vous faut-il pour devenir un pro ?" et "Pourquoi le site Exercices Pratiques de SQL est-il mon cours en ligne préféré ?" Dans ces deux articles, vous trouverez de nombreuses suggestions et astuces pour pratiquer le langage SQL et atteindre le niveau de maître SQL. Deuxièmement, vous trouverez différentes façons de pratiquer SQL dans la pratique mensuelle de SQL en 2022 deLearnSQL.fr. Enfin, l'article "5 conseils pour vous d'un analyste de données SQL senior" décrit comment devenir analyste de données, une profession qui nécessite une solide connaissance de SQL.

Améliorez vos compétences et investissez en vous-même !