TOP

Leçon SQL 9. Sous-requêtes

Jusqu'à présent, nous obtenions des données de la base de données à l'aide de requêtes simples et d'une seule instruction SELECT. Cependant, nous devrons tout de même sélectionner plus souvent des données qui remplissent de nombreuses conditions, et ici nous ne pouvons pas nous passer de requêtes avancées. Pour cela, dans SQL, il existe des sous-requêtes ou des requêtes imbriquées, où une instruction SELECT est imbriquée dans une autre.

Une sous-requête est une instruction SELECT imbriquée dans un autre SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE ou dans une autre sous-requête.

Le texte de la sous-requête doit être placé entre parenthèses. Les sous-requêtes sont souvent utilisées à la place de joindre des tables (JOIN).


1. Filtrage à l'aide de sous-requêtes

Les tables de base de données utilisées dans le SGBD Access sont des tables relationnelles, c'est-à-dire que toutes les tables peuvent être liées les unes aux autres par des champs communs. Supposons que nous stockions des données dans deux tables différentes et que nous devions sélectionner des données dans l'une d'elles, en fonction des données contenues dans l'autre. Pour cela, nous allons créer une autre table dans notre base de données. Ce sera par exemple la table Sellers avec des informations sur les fournisseurs :

Nous avons maintenant deux tables - Sumproduct et Sellers qui ont le même champ City. Disons que nous devons compter combien de produits ont été vendus au Canada seulement. Les sous-requêtes nous aideront à le faire. Alors, commençons par écrire une requête pour un échantillon de villes situées au Canada :

Run SQLSELECT City 
FROM Sellers 
WHERE Country = 'Canada'

Passons maintenant ces données à la requête suivante, qui sélectionnera les données de la table Sumproduct :

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN ('Montreal','Toronto')

Nous pouvons également combiner ces deux demandes en une seule. Ainsi, une requête qui génère des données sera la principale, et la deuxième requête qui transfère des données d'entrée sera une auxiliaire (sous-requête). Pour insérer une sous-requête, nous utiliserons la construction WHERE ... IN (...), qui a été abordée dans la section Filtrage avancé :

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN (SELECT City 
               FROM Sellers 
               WHERE Country = 'Canada')

Nous pouvons voir que nous avons obtenu les mêmes données qu’avec deux requêtes distinctes. De la même manière, nous pouvons augmenter la profondeur d’imbrication des requêtes en imbriquant les sous-requêtes autant de fois que nous le souhaitons.

2. Utilisation de sous-requêtes comme champs de règlement

Nous pouvons également utiliser des sous-requêtes comme champs calculés. Affichons par exemple le nombre de produits vendus pour chaque vendeur à l'aide de la requête suivante :

Run SQLSELECT Seller_name, (SELECT SUM(Quantity) 
                     FROM Sumproduct 
                     WHERE Sellers.City = Sumproduct.City) AS Qty 
FROM Sellers

La première instruction SELECT affiche deux colonnes - Seller_name et Qty. Le champ Qty est calculé, il est formé à la suite de l'exécution de la sous-requête, qui est entourée de parenthèses. Cette sous-requête est exécutée une fois pour chaque enregistrement dans le champ Seller_name, et sera exécutée quatre fois au total puisque quatre noms de vendeurs sont sélectionnés.

De plus, dans la sous-requête, la clause WHERE remplit la fonction de jointure, car avec l'aide de WHERE nous avons joint les deux tables par le champ City, en utilisant les noms complets des colonnes (Table.Field).