L2 Info : Bases de données
 
◃  Ch. 2 Interrogation des données avec SQL (DQL)  ▹
 

Cas des sous-requêtes synchronisées

  • sous-requêtes synchronisées : la requête interne reçoit des valeurs de la requête (appelante), une colonne de la table de la requête principale sera référencée dans la sous-requête.
    -- liste des diplomes avec plus de 30 étudiants inscrits
    SELECT * FROM Diplome D
      WHERE 30 < (SELECT COUNT(etud_num) FROM Etudiant E
                     WHERE E.dip_id = D.dip_id);
  • L'opérateur EXISTS
    • Mis en oeuvre particulière d'une sous-requête synchronisée
    • L'opérateur EXISTS vérifie s'il existe au moins une ligne satisfaisant la sous-requête
    • L'opérateur EXISTS retourne vrai lorsque la sous-requête synchronisée ne renvoie pas un ensemble vide
    • Exemple :
      SELECT * FROM Diplome
      WHERE EXISTS (SELECT * FROM Etudiant
                    WHERE Etudiant.Dip_id = Diplome.Dip_id);
       dip_id | dip_nom | dip_niveau | dip_discipline | prof_id 
      --------+---------+------------+----------------+---------
            1 | Licence | L3         | Informatique   |       3
      (1 row)
    • Cette requête (sans jointure !) retourne la liste des diplômes ayant des étudiants inscrits.
    • Explication : la clause WHERE de la requête principale procède par itération sur chaque ligne de la clause FROM ; lors de chaque itération, la sous-requête ne récupère qu'une seule valeur de l'attribut provenant de la requête principale.