Cours SQL et MySQL · Module 8: Sous-requêtes

EXISTS et NOT EXISTS

2 min de lecture
Dans cette leçon3

La ruelle la plus profonde du Labyrinthe abrite les opérateurs EXISTS et NOT EXISTS. Ils ne se soucient ni de combien de lignes la sous-requête renvoie, ni de quelles valeurs elle contient - ils demandent seulement : existe-t-il quoi que ce soit ?

EXISTS - y a-t-il quelque chose ?

EXISTS renvoie vrai quand la sous-requête renvoie au moins une ligne :

1SELECT imie, nazwisko
2FROM autorzy
3WHERE EXISTS (
4  SELECT 1 FROM ksiazki WHERE ksiazki.autor_id = autorzy.id
5);

Cette requête renvoie les auteurs qui ont au moins un livre. Remarque SELECT 1 - avec EXISTS, peu importe ce que nous sélectionnons, car l'opérateur vérifie seulement si une ligne apparaît, quelle qu'elle soit.

NOT EXISTS - qu'est-ce qui manque ?

NOT EXISTS est l'inverse - vrai quand la sous-requête ne renvoie rien :

1SELECT imie, nazwisko
2FROM autorzy
3WHERE NOT EXISTS (
4  SELECT 1 FROM ksiazki WHERE ksiazki.autor_id = autorzy.id
5);

C'est ainsi que nous trouvons les créateurs « silencieux » - les auteurs qui n'ont laissé aucun parchemin dans la Bibliothèque.

EXISTS est une sous-requête corrélée

Remarque la condition ksiazki.autor_id = autorzy.id. EXISTS fonctionne presque toujours avec une sous-requête corrélée - pour chaque auteur à l'extérieur, il vérifie si une ligne apparentée existe à l'intérieur. C'est souvent plus rapide que IN, car la Bibliothèque peut arrêter sa recherche dès qu'elle trouve le premier parchemin correspondant.

Tu as repéré une erreur dans cette leçon ?

Teste tes connaissances

Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.

  1. 1. Que renvoie l'opérateur EXISTS ?

  2. 2. Pourquoi écrit-on souvent SELECT 1 à l'intérieur d'une sous-requête EXISTS ?

Voici 2 des 4 questions de cette leçon. Réponds aux autres dans le jeu.

Tâches pratiques dans le jeu

  • Éditeur de code

    Écris une requête qui récupère dans la table autorzy les colonnes imie et nazwisko des auteurs qui ont au moins un livre. Utilise EXISTS et une sous-requête faisant référence à autorzy.id (ksiazki.autor_id = autorzy.id).

  • Tri horizontal

    Ordonne sur une ligne (de gauche à droite) le début d'une condition avec l'opérateur NOT EXISTS :

  • Éditeur de code

    Écris une requête qui récupère dans la table autorzy (alias a) toutes les colonnes des auteurs qui n'ont absolument aucun livre. Utilise NOT EXISTS et une sous-requête faisant référence à a.id (k.autor_id = a.id), où ksiazki a l'alias k.