Cours SQL et MySQL · Module 8: Sous-requêtes
Relier les couloirs du Labyrinthe
Dans cette leçon3
Tu connais maintenant tous les outils du Labyrinthe. Il est temps d'apprendre à les assembler - car les vraies questions posées à la Bibliothèque tiennent rarement dans une seule sous-requête simple.
Deux conditions à la fois
Rien ne nous empêche de combiner une sous-requête scalaire avec l'opérateur IN dans une seule requête. Il suffit de relier les conditions avec AND :
1SELECT tytul
2FROM ksiazki
3WHERE cena < (SELECT AVG(cena) FROM ksiazki)
4 AND autor_id IN (SELECT id FROM autorzy WHERE kraj = 'Grecja');Cette requête trouve les parchemins bon marché d'auteurs grecs - moins chers que la moyenne et écrits par un créateur venu de Grèce.
EXISTS imbriqué
Les sous-requêtes peuvent être imbriquées - l'une à l'intérieur de l'autre. C'est ainsi que nous demandons quels auteurs ont des livres, mais dont aucun n'a été emprunté :
1SELECT a.imie, a.nazwisko
2FROM autorzy AS a
3WHERE EXISTS (
4 SELECT 1 FROM ksiazki AS k
5 WHERE k.autor_id = a.id
6 AND NOT EXISTS (
7 SELECT 1 FROM wypozyczenia AS w WHERE w.ksiazka_id = k.id
8 )
9);EXISTS vérifie que l'auteur a un livre, et le NOT EXISTS imbriqué - que personne n'a emprunté ce livre.
Sous-requête dans SELECT
Une sous-requête scalaire peut aussi être placée dans la liste des colonnes de SELECT - comme une valeur calculée unique, à côté des colonnes ordinaires :
1SELECT tytul, cena, (SELECT AVG(cena) FROM ksiazki) AS srednia
2FROM ksiazki;Chaque ligne affichera le titre, le prix du livre et - juste à côté - le prix moyen de toute la Bibliothèque. C'est un moyen pratique de comparer une valeur à son contexte sans perdre les détails.
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. Quel outil répond le mieux à la question « une ligne liée existe-t-elle » ?
2. Tu veux sélectionner les livres dont l'autor_id fait partie des nombreux résultats renvoyés par une sous-requête. Quel opérateur utiliseras-tu ?
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 ksiazki la colonne tytul des livres dont le prix est inférieur au prix moyen de tous les livres ET dont l'autor_id figure dans la liste des identifiants d'auteurs du pays 'Grecja'. Utilise une sous-requête scalaire avec AVG et l'opérateur IN avec une sous-requête.
- Tri horizontal
Ordonne sur une ligne (de gauche à droite) les éléments qui joignent deux requêtes SELECT avec l'opérateur UNION :
- Éditeur de code
Écris une requête qui utilise UNION pour combiner en une seule liste la colonne imie de la table autorzy et la colonne imie de la table czytelnicy.
- Clique dans l'ordre
Clique sur les éléments dans l'ordre d'exécution d'une requête avec une sous-requête scalaire (de l'intérieur vers l'extérieur) :
- Tri horizontal
Ordonne sur une ligne (de gauche à droite) la condition avec l'opérateur NOT IN et une sous-requête :
- Tri vertical
Ordonne les étapes de construction d'une requête avec une table dérivée (de la première à la dernière étape) :
- Clique dans l'ordre
Clique sur les éléments dans l'ordre pour joindre les prénoms de deux tables avec l'opérateur UNION :
- Éditeur de code
Écris une requête qui récupère dans la table autorzy (alias a) les colonnes imie et nazwisko des auteurs qui ont des livres, mais dont aucun n'a été emprunté. Utilise d'abord une condition EXISTS pour vérifier que l'auteur a un livre (ksiazki k, k.autor_id = a.id), puis NOT EXISTS pour vérifier qu'aucun emprunt de ce livre n'existe (wypozyczenia w, w.ksiazka_id = k.id). Indice : utilise EXISTS avec un NOT EXISTS imbriqué.
- Tri horizontal
Ordonne sur une ligne (de gauche à droite) les éléments qui joignent deux requêtes avec l'opérateur UNION ALL :
- Tri horizontal
Ordonne sur une ligne (de gauche à droite) le début d'une table dérivée dans la clause FROM :
- Éditeur de code
Écris une requête qui récupère dans la table ksiazki les colonnes tytul, cena et - comme colonne supplémentaire nommée srednia - le résultat de la sous-requête scalaire (SELECT AVG(cena) FROM ksiazki). Place la sous-requête dans la liste des colonnes de SELECT.
- Clique dans l'ordre
Clique sur les éléments dans l'ordre pour construire une sous-requête dans SELECT (une seule ligne) :