Les sous-requêtes sont un outil puissant dans SQL Server qui vous permettent de contrôler dynamiquement les enregistrements affectés ou sélectionnés par une instruction T-SQL. Une sous-requête est une instruction SELECT qui est imbriquée dans une autre instruction T-SQL. Elle peut être utilisée dans différentes parties d’une requête, telles que la liste des colonnes, la clause WHERE, la clause FROM et la clause HAVING.
Utilisation d’une sous-requête dans la liste des colonnes
Une utilisation courante d’une sous-requête est de récupérer des informations spécifiques avec les résultats d’une requête. Par exemple, vous pouvez vouloir trouver le dernier OrderID et OrderDate pour la dernière commande expédiée à Paris, ainsi que l’OrderDate pour la dernière commande expédiée indépendamment de la ShipCity. Voici un exemple :
SELECT TOP 1 OrderId, CONVERT(char(10), OrderDate, 121) Dernière_Commande_Paris,
(SELECT CONVERT(char(10), MAX(OrderDate), 121) FROM Orders) Dernier_OrderDate,
DATEDIFF(dd, OrderDate, (SELECT MAX(OrderDate) FROM Orders)) Jour_Diff
FROM Orders
WHERE ShipCity = 'Paris'
ORDER BY OrderDate DESC
Dans cet exemple, nous utilisons deux sous-requêtes. La première sous-requête récupère l’OrderDate pour la dernière commande expédiée indépendamment de ShipCity, et la deuxième sous-requête calcule le nombre de jours entre les deux OrderDates différents. La première sous-requête est utilisée pour retourner une valeur de colonne dans le jeu de résultats final, tandis que la deuxième sous-requête est utilisée comme paramètre dans la fonction DATEDIFF.
Utilisation d’une sous-requête dans la clause WHERE
Une sous-requête peut également être utilisée pour contrôler les enregistrements renvoyés par une instruction SELECT en contrôlant les enregistrements qui satisfont les conditions d’une clause WHERE. Par exemple, vous pouvez vouloir récupérer une liste de pays où vivent les clients, mais où aucun fournisseur n’est situé dans ce pays. Voici un exemple :
SELECT DISTINCT country
FROM Customers
WHERE country NOT IN (SELECT DISTINCT country FROM Suppliers)
Dans cet exemple, la sous-requête renvoie une liste de pays où se trouvent les fournisseurs. La requête principale récupère ensuite les pays où vivent les clients mais qui ne sont pas présents dans les résultats de la sous-requête. Cela peut être utile pour cibler des pays spécifiques pour des fournisseurs supplémentaires ou des efforts de marketing.
Utilisation d’une sous-requête dans la clause FROM
Une sous-requête peut être utilisée dans la clause FROM d’une instruction SELECT pour la traiter comme une table. Cela peut être utile pour réduire la taille de l’ensemble qui doit être joint, améliorant les performances de la requête. Voici un exemple :
SELECT au_lname, au_fname, title
FROM (
SELECT au_lname, au_fname, au_id
FROM authors
WHERE state = 'CA'
) AS a
JOIN titleauthor ta ON a.au_id = ta.au_id
JOIN titles t ON ta.title_id = t.title_id
Dans cet exemple, la sous-requête sélectionne uniquement les enregistrements d’auteur avec une colonne state égale à ‘CA’. Les résultats de la sous-requête sont ensuite traités comme une table avec l’alias ‘a’, qui peut être utilisé dans les clauses JOIN pour faire référence aux colonnes de la sous-requête.
Utilisation d’une sous-requête dans la clause HAVING
Une sous-requête peut également être utilisée dans la clause HAVING pour filtrer les résultats d’une requête GROUP BY. Par exemple, vous pouvez vouloir trouver le nombre de livres publiés par des éditeurs qui ne sont pas situés dans l’état de Californie. Voici un exemple :
SELECT pub_name, COUNT(*) bookcnt
FROM titles t
JOIN publishers p ON t.pub_id = p.pub_id
GROUP BY pub_name
HAVING p.pub_name IN (SELECT pub_name FROM publishers WHERE state <> 'CA')
Dans cet exemple, la sous-requête renvoie les valeurs pub_name pour tous les éditeurs ayant une valeur d’état différente de ‘CA’. La condition HAVING vérifie ensuite si le pub_name est dans l’ensemble renvoyé par la sous-requête, vous permettant de filtrer les résultats en fonction de cette condition.
Conclusion
Les sous-requêtes sont un concept précieux dans SQL Server qui vous permettent d’atteindre des critères de sélection complexes dans une seule instruction T-SQL. Elles peuvent aider à éviter l’utilisation de tables temporaires et de curseurs, et en fonction de la requête, peuvent améliorer les performances en réduisant le nombre d’enregistrements à traiter. Comprendre comment utiliser les sous-requêtes efficacement peut grandement améliorer vos compétences en SQL Server.
Dans le prochain article, nous explorerons les sous-requêtes corrélées et leurs applications dans SQL Server.