Cours SQL et MySQL · Module 11: Projet final
La Chambre des Énigmes - sous-requêtes et HAVING
Dans cette leçon3
Les questions les plus profondes exigent une question dans une question. Dans la Chambre des Énigmes, tu as appris les sous-requêtes et HAVING - un filtre pour des groupes entiers.
Sous-requête - une requête dans une requête
Une sous-requête est une requête imbriquée dans une autre, généralement entre parenthèses. Elle te permet de comparer une ligne au résultat d'un calcul séparé :
1SELECT tytul, cena
2FROM ksiazki
3WHERE cena > (SELECT AVG(cena) FROM ksiazki);La base de données calcule d'abord le prix moyen de tous les livres, puis ne renvoie que ceux qui sont plus chers que lui.
HAVING - un filtre après le regroupement
WHERE filtre les lignes individuelles avant le regroupement. HAVING filtre des groupes entiers, après GROUP BY - généralement en fonction du résultat d'une fonction d'agrégation :
1SELECT czytelnik_id, COUNT(*) AS liczba
2FROM wypozyczenia
3GROUP BY czytelnik_id
4HAVING COUNT(*) > 2;Cette requête ne renvoie que les lecteurs ayant emprunté plus de deux livres.
WHERE ou HAVING ?
- Filtrer des lignes individuelles ? →
WHERE. - Filtrer des groupes après un comptage (par exemple
COUNT,AVG) ? →HAVING.
Ces deux outils ensemble te permettent de poser à la Bibliothèque des questions vraiment avisées !
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. En quoi HAVING diffère-t-il de WHERE ?
2. Qu'est-ce qu'une sous-requête ?
Tâches pratiques dans le jeu
- Éditeur de code
Écris une requête qui récupère tytul et cena de la table ksiazki, seulement pour les livres dont cena est supérieur au prix moyen de tous les livres. Calcule la moyenne dans une sous-requête avec la fonction AVG(cena).
- Éditeur de code
Écris une requête qui regroupe les lignes de la table wypozyczenia par czytelnik_id et affiche czytelnik_id et le nombre d'emprunts sous le nom liczba, mais SEULEMENT pour les lecteurs ayant plus de 2 emprunts. Utilise GROUP BY et HAVING.
- Éditeur de code
Écris une requête qui regroupe les lignes de la table ksiazki par kategoria_id et affiche kategoria_id et le nombre de livres sous le nom liczba, mais SEULEMENT pour les catégories ayant plus de 5 livres. Utilise GROUP BY et HAVING.
- Tri vertical
Ordonne les clauses de la requête avec HAVING dans le bon ordre (de haut en bas) :