Les sous-requêtes
Jusqu’à maintenant, nous avons étudié des requêtes qui extraient des données d’une seule table
Il peut être intéressant d’extraire des lignes en fonction de leur liaison avec les autres tables
On parle alors de condition d’association ou de jointure
On pourra joindre des données de deux manières :
- En utilisant des jointures (présentées dans le prochain chapitre)
- En utilisant des sous-requêtes
Exemple
Sans sous-requête
Supposons que l’on veuille obtenir les commandes des clients habitant Grenoble
- On peut retrouver les numéros des clients habitant
Grenoble
en exécutant la requête :
1SELECT numero FROM Clients WHERE ville = 'Grenoble' ;
Clients |
---|
numero |
2 |
- Il est alors facile de retrouver les commandes des clients habitant à
Grenoble
:
1SELECT * FROM Commandes WHERE numero IN (2);
Clients | |||
---|---|---|---|
numero | numeroClient | dateCommande | statut |
2 | 1 | 2024-03-15 | livrée |
Cette procédure n’est pas pratique… surtout si de nouveaux clients de Grenoble
s’ajoutent à la base de données
Avec sous-requête
1SELECT * FROM Commandes WHERE numeroClient IN (2 SELECT numero FROM Clients WHERE ville = 'Grenoble'3);
Clients |
---|
Références multiples
Références multiples
Exemple 1
Une sous-requête peut être définie sur la même table que la requête qui la contient
Exemple : Quels sont les clients qui habitent dans la même ville que le client numéro 3 ?
1SELECT * FROM Clients WHERE ville IN (2 SELECT ville FROM Clients WHERE numero = 33);
Clients | ||||||||
---|---|---|---|---|---|---|---|---|
numero | nom | prenom | rue | codePostal | ville | telephone | categorie | compte |
3 | Da Costa | Léon | 18, boulevard Brigitte Faivre | 75000 | Paris | 0568740044 | C3 | -1500 |
6 | Berlioz | Diane | 27 avenue de la Chartreuse | 75000 | Paris | 123094 | ||
9 | Barda | Jérôme | 128 rue de la Paix | 75000 | Paris | C1 | -2000 | |
8 | Jacques | Chaoui | 1240 rue des Ateliers | 75001 | Paris | C1 | -1750 |
Références multiples
Exemple 2
Quelles commandes spécifient une quantité de produit numéro 1, inférieure à la commande numéro 6 pour le même produit ?
1SELECT * FROM Details WHERE numeroProduit = 1 AND quantite < (2 SELECT quantite FROM Details WHERE numeroCommande = 63);
Commandes | ||
---|---|---|
numeroCommande | numeroProduit | quantite |
1 | 1 | 3 |
3 | 1 | 4 |
4 | 1 | 7 |
5 | 1 | 2 |
7 | 1 | 1 |
On peut s’assurer de la quantite de produit numéro 1 dans la commande numéro 6 en exécutant la requête :
1SELECT quantite2FROM Details3WHERE numeroCommande = 6 AND numeroProduit = 1;
Commandes |
---|
quantite |
10 |
Ambiguité
Dans le cas d’ambiguité de noms d’attribut, il est possible :
- De préfixer le nom de l’attribut par celui de la relation
1SELECT Produits.numero FROM Produits WHERE Produits.numero IN (2 SELECT Details.numeroProduit FROM Details3);
- D’utiliser des alias
1SELECT P.numero FROM Produits AS P WHERE P.numero IN (2 SELECT D.numeroProduit FROM Details AS D3);
Opérations
Opérations
Comparaisons
Si la sous-requête renvoie une seule ligne et colonne, il est permis d’utiliser les opérateurs de comparaison classique
Exemple :
- Quel est le nom du client qui possède le compte le plus élevé ?
1SELECT nom FROM Clients WHERE compte = (2 SELECT MAX(compte) FROM Clients3);
Clients |
---|
nom |
Berlioz |
Opérations
Agrégation
Il est intéressant de sélectionner les lignes d’une table qui sont associées, non pas à au moins une des lignes d’une autre table qui vérifie une certaine condition, mais à un nombre défini de ces lignes
- Exemple : Quelles sont les commandes qui possèdent au moins 3 détails ?
1SELECT * FROM Commandes WHERE (2 SELECT COUNT(*) FROM Details WHERE numeroCommande = Commandes.numero3) >= 3;
Commandes | |||
---|---|---|---|
numero | numeroClient | dateCommande | statut |
1 | 1 | 2024-02-01 | livrée |
3 | 3 | 2024-04-28 | livrée |
5 | 5 | 2024-06-30 | en cours |
Conclusion
- Les sous-requêtes sont des requêtes imbriquées dans une requête principale
- Elles permettent de sélectionner des lignes d’une table en fonction de leur association avec les lignes d’une autre table
- Elles peuvent être utilisées pour des comparaisons, des agrégations, etc.