Cours SQL et MySQL · Module 8: Sous-requêtes
La sous-requête avec l'opérateur IN
Dans cette leçon3
Que faisons-nous quand une sous-requête renvoie plusieurs lignes ? Nous ne pouvons alors pas les comparer avec un simple =. L'opérateur IN vient à la rescousse - il vérifie si une valeur figure dans la liste renvoyée par la sous-requête.
Une valeur dans la liste
1SELECT tytul
2FROM ksiazki
3WHERE autor_id IN (SELECT id FROM autorzy WHERE kraj = 'Polska');La sous-requête renvoie d'abord la liste des id de tous les auteurs venus de Pologne. La requête externe choisit ensuite les livres dont l'autor_id figure dans cette liste. Ainsi, une seule requête relie deux rayons : ksiazki et autorzy.
Plus propre qu'à la main
Sans sous-requête, il faudrait d'abord noter les id des auteurs polonais, puis les coller manuellement dans la requête :
1SELECT tytul FROM ksiazki WHERE autor_id IN (1, 4, 7);La sous-requête fait cela pour nous - et met à jour la liste elle-même dès qu'un nouvel auteur arrive à la Bibliothèque.
NOT IN
L'opérateur NOT IN fonctionne à l'inverse - il choisit les lignes dont la valeur n'est pas dans la liste :
1SELECT tytul
2FROM ksiazki
3WHERE kategoria_id NOT IN (SELECT id FROM kategorie WHERE nazwa = 'Poezja');C'est ainsi que nous trouvons tous les livres en dehors du rayon de poésie.
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. À quoi sert l'opérateur IN combiné à une sous-requête ?
2. Que va sélectionner la condition kategoria_id NOT IN (SELECT id FROM kategorie WHERE nazwa = 'Poezja') ?
Tâches pratiques dans le jeu
- Éditeur de code
Écris une requête qui récupère dans la table ksiazki la colonne tytul des livres dont l'autor_id figure dans la liste des identifiants d'auteurs de la table autorzy venant du pays 'Polska'. Utilise l'opérateur IN et une sous-requête.
- Tri vertical
Ordonne (de haut en bas) les lignes de la requête qui récupère les livres d'auteurs venant de Grèce à l'aide de IN et d'une sous-requête :
- Éditeur de code
Écris une requête qui récupère dans la table ksiazki toutes les colonnes des livres dont l'autor_id figure dans la liste des identifiants d'auteurs de la table autorzy venant du pays 'Grecja'. Utilise l'opérateur IN et une sous-requête.
- Clique dans l'ordre
Clique sur les éléments dans l'ordre pour construire une condition avec l'opérateur IN et une sous-requête (une seule ligne) :
- Éditeur de code
Écris une requête qui récupère dans la table ksiazki la colonne tytul des livres dont le kategoria_id ne figure PAS dans la liste des identifiants de catégorie nommée 'Poezja' de la table kategorie. Utilise l'opérateur NOT IN et une sous-requête.