Sous-requête corrélée SQL

Dans une sous-requête corrélée, la requête interne ne fonctionne pas indépendamment de la requête externe.

Dans ce cas, la requête interne est effectuée une fois pour chaque ligne de la requête externe.

Pour corréler la table de la requête interne avec la table de la requête externe, vous devez définir un alias pour la requête externe et l’utiliser comme qualificatif dans la requête interne.

  1. Lorsque vous utilisez l’alias dans ce contexte, il est appelé “nom de corrélation” et la connexion qu’il établit est appelée “référence corrélée”.
  2. Une sous-requête corrélée avec le mot-clé EXISTS ne nomme aucune colonne car aucune donnée n’est transférée lorsque vous utilisez EXISTS.

Exemple:

SELECT nom_conso
    FROM tb_conso A
      WHERE NOT EXISTS
      (SELECT * FROM tb_inv WHERE inv_conso = A.conso_no)

Opérateur EXISTS

  • L’opérateur EXISTS est utilisé pour les sous-requêtes corrélées.
  • Il teste si la sous-requête renvoie au moins une ligne.
  • L’opérateur EXISTS renvoie vrai ou faux, jamais inconnu.
  • Étant donné que EXISTS teste uniquement si une ligne existe, les colonnes affichées dans la liste SELECT de la sous-requête ne sont pas pertinentes. En règle générale, vous utilisez un littéral de texte à un seul caractère tel que ‘1’ ou ‘X’ ou le mot-clé NULL.

Exemple:

Il s’agit d’une sous-requête corrélée qui affiche les instructeurs où INSTRUCTEUR_ID a une ligne correspondante dans la table SECTION.

Le résultat affiche les valeurs des colonnes INSTRUCTEUR_ID , INSTRUCTEUR_PRENOM des enseignants affectés à au moins une section.

SELECT instructeur_id, instructeur_nom
    FROM tb_instructeur I
      WHERE EXISTS
      (SELECT 'X'
          FROM tb_section
            WHERE I.instructeur_id = instructeur_id)

Pour chaque ligne de la table INSTRUCTEUR, la requête externe évalue la requête interne. Il vérifie si la valeur INSTRUCTEUR_ID de la ligne actuelle existe pour la colonne INSTRUCTEUR_ID de la table SECTION. Seulement si une ligne avec la valeur appropriée est trouvée, la condition est vraie et la ligne externe est incluse dans le résultat.

Opérateur NOT EXISTS :

L’opérateur NOT EXISTS est l’opposé de l’opérateur EXISTS ; il teste si une ligne correspondante est introuvable.