Cours SQL et MySQL · Module 6: Agrégations et regroupements
Regrouper par plusieurs colonnes et ORDER BY
Dans cette leçon3
Tu sais déjà regrouper par une seule colonne et filtrer des groupes. Nous allons maintenant ajouter deux astuces puissantes : regrouper par plusieurs colonnes à la fois et trier le rapport final. Voilà ce qui transforme une table brute en un document clair et ordonné.
GROUP BY sur plusieurs colonnes
Tu peux donner à GROUP BY plus d'une colonne, en les séparant par une virgule. MySQL créera alors un groupe séparé pour chaque combinaison unique de ces valeurs de colonnes.
1SELECT kategoria_id, rok_wydania, COUNT(*)
2FROM ksiazki
3GROUP BY kategoria_id, rok_wydania;Cela signifie : « Pour chaque paire (catégorie, année de publication), donne le nombre de livres ». Si la catégorie 1 a des livres de 2010 et de 2020, deux groupes séparés se forment : (1, 2010) et (1, 2020).
| kategoria_id | rok_wydania | COUNT(*) |
|---|---|---|
| 1 | 2010 | 5 |
| 1 | 2020 | 8 |
| 2 | 2020 | 3 |
Retiens la règle de la chambre précédente : chaque colonne de la liste SELECT qui n'est pas un agrégat doit apparaître dans GROUP BY. Ici, nous listons kategoria_id et rok_wydania dans SELECT - et les deux sont dans GROUP BY.
Trier le rapport : ORDER BY
Un résultat de regroupement peut aussi être trié - avec la clause ORDER BY que tu connais des chambres précédentes. Fait important : ORDER BY peut aussi trier selon une fonction d'agrégat.
1SELECT kategoria_id, COUNT(*)
2FROM ksiazki
3GROUP BY kategoria_id
4ORDER BY COUNT(*) DESC;Cela signifie : « Montre le nombre de livres dans chaque catégorie, et arrange le résultat de la catégorie la plus nombreuse à la moins nombreuse ». Le mot DESC (de descending) signifie l'ordre décroissant ; ASC (ou l'absence de mot) - l'ordre croissant.
La place d'ORDER BY dans une requête
ORDER BY se place toujours tout à la fin - après GROUP BY et après HAVING :
1SELECT kategoria_id, COUNT(*)
2FROM ksiazki
3GROUP BY kategoria_id
4HAVING COUNT(*) > 3
5ORDER BY COUNT(*) DESC;Nous regroupons d'abord, puis nous écartons les petits groupes (HAVING), et enfin nous arrangeons le reste dans l'ordre voulu. Regrouper par plusieurs colonnes et trier sont les touches finales qui transforment des nombres en un rapport achevé !
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. Que fait GROUP BY kategoria_id, rok_wydania ?
2. Comment trie-t-on un résultat de regroupement du groupe le plus nombreux au moins nombreux ?
Voici 2 des 5 questions de cette leçon. Réponds aux autres dans le jeu.
Tâches pratiques dans le jeu
- Tri vertical
Ordonne les clauses d'une requête d'agrégation complète dans le bon ordre (de haut en bas) :
- Éditeur de code
Écris une requête qui sélectionne kategoria_id et COUNT(*) dans la table ksiazki, regroupe par kategoria_id, et trie le résultat par ordre décroissant de COUNT(*) (ORDER BY COUNT(*) DESC).
- Tri vertical
Ordonne les clauses d'une requête regroupant par deux colonnes dans le bon ordre (de haut en bas) :
- Tri horizontal
Ordonne les éléments sur une seule ligne pour former une clause qui trie par ordre décroissant selon le nombre de lignes :
- Éditeur de code
Écris une requête qui sélectionne kategoria_id et COUNT(*) dans la table ksiazki, ne prend que les lignes où dostepna = 1, regroupe par kategoria_id, garde les groupes ayant COUNT(*) > 5, et trie par ordre décroissant de COUNT(*).
- Éditeur de code
Écris une requête qui renvoie à la fois COUNT(*), AVG(cena), MIN(cena) et MAX(cena) depuis la table ksiazki.
- Tri vertical
Ordonne les étapes dans lesquelles MySQL exécute une requête d'agrégation (de la première à la dernière) :
- Clique dans l'ordre
Clique sur les clauses dans l'ordre où MySQL traite une requête d'agrégation avec un tri :