Archives par mot-clé : EXISTS

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.

Opérateur SQL EXISTS 

L’opérateur EXISTS teste l’existence de certaines lignes dans une sous-requête.

L’opérateur EXISTS renvoie true si la sous-requête renvoie un ou plusieurs enregistrements.

Le résultat de l’opérateur EXISTS :

  1. Est vrai uniquement si le nombre de lignes spécifié par la sous-requête est différent de zéro.
  2. Est faux uniquement si le nombre de lignes spécifié par la sous-requête est zéro.
  3. Ne peut pas être inconnu.

Syntaxe:

SELECT nom_colonne(s)
    FROM nom_table 
    WHERE EXISTS
    (SELECT nom_colonneFROM nom_table WHERE condition);

Examinons les données du tableau “Commandes” ci-dessous :

Numéro-CommandeNuméro-ClientDate-Commande
1001102020-09-08
1002992020-09-01
1003172020-08-25
1004762020-09-19
1005702020-09-19

Examinons les données du tableau “Clients” ci-dessous :

Numéro-ClientNom-ClientPays
76JackAmérique
17JancyAllemagne
20CarmenPakistan
10robertInde
99BrianChine
70AvrilAmérique

Exemple 1

L’instruction SQL suivante renvoie TRUE et répertorie les clients qui ont passé une commande.

SELECT Nom_Client
  FROM Clients
  WHERE EXISTS (SELECT Numero_Commande
                  FROM Commandes
                 WHERE Commandes.Numero_Commande = Clients.Numero_Commande
);
Résultat:
Nom-Cient
Jack
Jancy
robert
Brian
Avril

Exemple : 2

L’instruction SQL suivante renvoie TRUE et répertorie les clients qui ont passé une commande à la date ‘2020-09-19’.

SELECT Nom_Client
  FROM Clients
  WHERE EXISTS (SELECT Numero_Commande
                  FROM Clients
                  WHERE Clients.Numero_Commande = Client.Numero_Commande
                    AND Date_Commande='2020-09-19');
Résultat:
Nom-Client
Brian
Avril