Aller au contenu

UGA - MIASHS - S7 - BDD - Pierre Blarre

Sous-requêtes

Icône Présentation
1 / 1

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 :

  1. En utilisant des jointures (présentées dans le prochain chapitre)
  2. En utilisant des sous-requêtes

Exemple

Sans sous-requête

Supposons que l’on veuille obtenir les commandes des clients habitant Grenoble

  1. On peut retrouver les numéros des clients habitant Grenoble en exécutant la requête :
SELECT numero FROM Clients WHERE ville = 'Grenoble' ;
Clients
numero
2
  1. Il est alors facile de retrouver les commandes des clients habitant à Grenoble :
SELECT * FROM Commandes WHERE numero IN (2);
Clients
numeronumeroClientdateCommandestatut
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

SELECT * FROM Commandes WHERE numeroClient IN (
SELECT numero FROM Clients WHERE ville = 'Grenoble'
);
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 ?

SELECT * FROM Clients WHERE ville IN (
SELECT ville FROM Clients WHERE numero = 3
);
Clients
numeronomprenomruecodePostalvilletelephonecategoriecompte
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 ?

SELECT * FROM Details WHERE numeroProduit = 1 AND quantite < (
SELECT quantite FROM Details WHERE numeroCommande = 6
);
Commandes
numeroCommandenumeroProduitquantite
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 :

SELECT quantite
FROM Details
WHERE numeroCommande = 6 AND numeroProduit = 1;
Commandes
quantite
10

Ambiguité

Dans le cas d’ambiguité de noms d’attribut, il est possible :

  1. De préfixer le nom de l’attribut par celui de la relation
SELECT Produits.numero FROM Produits WHERE Produits.numero IN (
SELECT Details.numeroProduit FROM Details
);
  1. D’utiliser des alias
SELECT P.numero FROM Produits AS P WHERE P.numero IN (
SELECT D.numeroProduit FROM Details AS D
);

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é ?
SELECT nom FROM Clients WHERE compte = (
SELECT MAX(compte) FROM Clients
);
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 ?
SELECT * FROM Commandes WHERE (
SELECT COUNT(*) FROM Details WHERE numeroCommande = Commandes.numero
) >= 3;
Commandes
numeronumeroClientdateCommandestatut
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.