Exercices SQL corrigés : ORDER BY et LIMIT
Mis à jour le
ORDER BY trie (ASC croissant, DESC décroissant) ; LIMIT garde les n premières lignes. Ces 6 exercices vont du niveau 1 au niveau 2 ; ils utilisent la syntaxe de SQLite, le moteur SQL de SpeedQL.
Conseil : Ajoute une deuxième colonne de tri pour départager les égalités.
Relire la fiche « ORDER BY, LIMIT » de l’aide-mémoire
Exercice 1
Affiche le nom et le salaire de tous les employés, du salaire le plus bas au plus élevé.
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | Finance | 32000 |
| 2 | Bob | IT | 41000 |
| 3 | Claire | Finance | 38000 |
| 4 | David | HR | 29000 |
| 5 | Emma | IT | 50000 |
| 6 | Farid | IT | 47000 |
| 7 | Gaelle | HR | 33000 |
| 8 | Hugo | Finance | 44000 |
Voir l’indice
Notions à utiliser : ORDER BY, LIMIT.
Structure de la requête :
SELECT …, …
FROM …
ORDER BY … ASCVoir la correction
SELECT name, salary
FROM employees
ORDER BY salary ASC;Résultat attendu (8 lignes, dans cet ordre) :
| name | salary |
|---|---|
| David | 29000 |
| Alice | 32000 |
| Gaelle | 33000 |
| Claire | 38000 |
| Bob | 41000 |
| Hugo | 44000 |
| Farid | 47000 |
| Emma | 50000 |
Exercice 2
Affiche le nom, le département et le salaire des employés, triés par département (ordre alphabétique) puis, dans chaque département, du salaire le plus élevé au plus bas.
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | Finance | 32000 |
| 2 | Bob | IT | 41000 |
| 3 | Claire | Finance | 38000 |
| 4 | David | HR | 29000 |
| 5 | Emma | IT | 50000 |
| 6 | Farid | IT | 47000 |
| 7 | Gaelle | HR | 33000 |
| 8 | Hugo | Finance | 44000 |
Voir l’indice
Notions à utiliser : ORDER BY, LIMIT.
Structure de la requête :
SELECT …, …, …
FROM …
ORDER BY … ASC, … DESCVoir la correction
SELECT name, department, salary
FROM employees
ORDER BY department ASC, salary DESC;Résultat attendu (8 lignes, dans cet ordre) :
| name | department | salary |
|---|---|---|
| Hugo | Finance | 44000 |
| Claire | Finance | 38000 |
| Alice | Finance | 32000 |
| Gaelle | HR | 33000 |
| David | HR | 29000 |
| Emma | IT | 50000 |
| Farid | IT | 47000 |
| Bob | IT | 41000 |
Exercice 3
Affiche le nom des 3 produits les moins chers, du moins cher au plus cher.
| id | name | category | price | stock |
|---|---|---|---|---|
| 1 | Keyboard | Office | 25 | 40 |
| 2 | Mouse | Office | 15 | 0 |
| 3 | Screen | Display | 180 | 12 |
| 4 | Headset | Audio | 60 | 8 |
| 5 | Webcam | Office | 45 | 0 |
| 6 | Speaker | Audio | 35 | 25 |
Voir l’indice
Notions à utiliser : ORDER BY, LIMIT.
Structure de la requête :
SELECT …
FROM …
ORDER BY … ASC
LIMIT …Voir la correction
SELECT name
FROM products
ORDER BY price ASC
LIMIT 3;Résultat attendu (3 lignes, dans cet ordre) :
| name |
|---|
| Mouse |
| Keyboard |
| Speaker |
Exercice 4
Affiche le nom des 2 employés les mieux payés, du plus élevé au plus bas salaire.
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | Finance | 32000 |
| 2 | Bob | IT | 41000 |
| 3 | Claire | Finance | 38000 |
| 4 | David | HR | 29000 |
| 5 | Emma | IT | 50000 |
| 6 | Farid | IT | 47000 |
| 7 | Gaelle | HR | 33000 |
| 8 | Hugo | Finance | 44000 |
Voir l’indice
Notions à utiliser : ORDER BY, LIMIT.
Structure de la requête :
SELECT …
FROM …
ORDER BY … DESC
LIMIT …Voir la correction
SELECT name
FROM employees
ORDER BY salary DESC
LIMIT 2;Résultat attendu (2 lignes, dans cet ordre) :
| name |
|---|
| Emma |
| Farid |
Exercice 5
Affiche le nom et le nombre de buts des 3 meilleurs buteurs, du plus grand nombre de buts au plus petit.
| id | name | team_id | position | goals |
|---|---|---|---|---|
| 1 | Alex Moreau | 1 | FW | 9 |
| 2 | Bilal Sow | 1 | MF | 4 |
| 3 | Carl Weber | 2 | FW | 7 |
| 4 | Diego Ruiz | 2 | DF | 1 |
| 5 | Eli Novak | 3 | FW | 6 |
| 6 | Femi Adeyemi | 4 | FW | 11 |
| 7 | Goran Petrov | 4 | GK | 0 |
| 8 | Hugo Lamy | 5 | MF | 5 |
| 9 | Ivan Kral | 5 | DF | 2 |
Voir l’indice
Notions à utiliser : ORDER BY, LIMIT.
Structure de la requête :
SELECT …, …
FROM …
ORDER BY … DESC
LIMIT …Voir la correction
SELECT name, goals
FROM players
ORDER BY goals DESC
LIMIT 3;Résultat attendu (3 lignes, dans cet ordre) :
| name | goals |
|---|---|
| Femi Adeyemi | 11 |
| Alex Moreau | 9 |
| Carl Weber | 7 |
Exercice 6
Affiche la ville, le jour et la température maximale des 3 relevés les plus chauds, du plus chaud au moins chaud (en cas d'égalité, par jour puis par ville).
| id | city | day | temp_max | temp_min | rain_mm |
|---|---|---|---|---|---|
| 1 | Paris | 2025-07-01 | 24 | 15 | 0 |
| 2 | Paris | 2025-07-02 | 27 | 17 | 0 |
| 3 | Paris | 2025-07-03 | 22 | 16 | 4.5 |
| 4 | Paris | 2025-07-04 | 19 | 14 | 12 |
| 5 | Paris | 2025-07-05 | 23 | 13 | 0 |
| 6 | Lyon | 2025-07-01 | 26 | 16 | 0 |
| 7 | Lyon | 2025-07-02 | 29 | 18 | 0 |
| 8 | Lyon | 2025-07-03 | 31 | 19 | 0 |
| 9 | Lyon | 2025-07-04 | 24 | 17 | 8.5 |
| 10 | Lyon | 2025-07-05 | 22 | 15 | 3 |
| 11 | Marseille | 2025-07-01 | 30 | 21 | 0 |
| 12 | Marseille | 2025-07-02 | 32 | 22 | 0 |
| 13 | Marseille | 2025-07-03 | 33 | 23 | 0 |
| 14 | Marseille | 2025-07-04 | 29 | 21 | 0 |
| 15 | Marseille | 2025-07-05 | 28 | 20 | 0 |
Voir l’indice
Notions à utiliser : ORDER BY, LIMIT.
Structure de la requête :
SELECT …, …, …
FROM …
ORDER BY … DESC, …, …
LIMIT …Voir la correction
SELECT city, day, temp_max
FROM readings
ORDER BY temp_max DESC, day, city
LIMIT 3;Résultat attendu (3 lignes, dans cet ordre) :
| city | day | temp_max |
|---|---|---|
| Marseille | 2025-07-03 | 33 |
| Marseille | 2025-07-02 | 32 |
| Lyon | 2025-07-03 | 31 |
Plus d’exercices : niveau 4 du cours SQL, « Trier, limiter, dédoublonner »
Ces 5 exercices viennent du niveau 4 du cours, sur d’autres tables. Chacun a des indices écrits et sa correction, repliés par défaut.
Exercice 7
Affiche le titre et l'année des films, du plus ancien au plus récent.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
Voir les indices
Indice : ORDER BY year trie par ordre croissant.
Voir la correction
SELECT title, year
FROM movies
ORDER BY year;Résultat attendu (10 lignes) :
| title | year |
|---|---|
| Paper Moon City | 2012 |
| Dust and Gold | 2014 |
| Night Train | 2015 |
| Summer Keys | 2016 |
| Deep Current | 2017 |
| Blue Harbor | 2018 |
| Last Signal | 2019 |
| Silent Peak | 2020 |
| Iron Garden | 2021 |
| The Quiet Hour | 2022 |
ASC est implicite : ORDER BY year et ORDER BY year ASC sont identiques.
Exercice 8
Affiche la liste des genres de films, sans doublon.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
Voir les indices
Indice 1 · piste : Un mot-clé placé juste après SELECT supprime les lignes en double.
Indice 2 · méthode : SELECT DISTINCT genre …
Voir la correction
SELECT DISTINCT genre
FROM movies;Résultat attendu (5 lignes) :
| genre |
|---|
| Thriller |
| Drama |
| Comedy |
| Sci-Fi |
| Western |
Il y a 10 films mais seulement 5 genres différents.
Exercice 9
Affiche le titre et l'identifiant du réalisateur (director_id) de chaque film, triés par identifiant croissant, avec les films sans réalisateur à la fin. À identifiant égal, trie par titre.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
Voir les indices
Indice 1 · piste : Dans SQLite, où arrivent les NULL dans un tri croissant ?
Indice 2 · méthode : ORDER BY director_id NULLS LAST, title.
Voir la correction
SELECT title, director_id
FROM movies
ORDER BY director_id NULLS LAST, title;Résultat attendu (10 lignes) :
| title | director_id |
|---|---|
| Last Signal | 1 |
| Night Train | 1 |
| Blue Harbor | 2 |
| Dust and Gold | 2 |
| Iron Garden | 3 |
| Silent Peak | 3 |
| Summer Keys | 4 |
| Paper Moon City | 5 |
| The Quiet Hour | 5 |
| Deep Current | NULL |
Sans NULLS LAST, Deep Current arriverait en tête : SQLite place les NULL en premier dans un tri croissant.
Exercice 10
Affiche le nom, le service et le salaire des employés, triés par service (ordre alphabétique), puis par salaire décroissant, puis par nom.
| id | name | department | salary | manager_id | hired |
|---|---|---|---|---|---|
| 1 | Alice | Finance | 52000 | NULL | 2015-03-01 |
| 2 | Bob | IT | 41000 | 1 | 2018-06-15 |
| 3 | Claire | Finance | 38000 | 1 | 2019-01-10 |
| 4 | David | HR | 29000 | 1 | 2020-09-01 |
| 5 | Emma | IT | 50000 | 2 | 2017-11-20 |
| 6 | Farid | IT | 47000 | 2 | 2021-02-14 |
| 7 | Gaelle | HR | 33000 | 4 | 2022-05-30 |
| 8 | Hugo | Finance | 44000 | 3 | 2016-08-08 |
| 9 | Iris | IT | 47000 | 5 | 2023-01-09 |
| 10 | Jules | Finance | 44000 | 3 | 2024-03-18 |
Voir les indices
Indice 1 · piste : Trois critères de tri, chacun avec son propre sens.
Indice 2 · méthode : ORDER BY department, salary DESC, name.
Voir la correction
SELECT name, department, salary
FROM staff
ORDER BY department, salary DESC, name;Résultat attendu (10 lignes) :
| name | department | salary |
|---|---|---|
| Alice | Finance | 52000 |
| Hugo | Finance | 44000 |
| Jules | Finance | 44000 |
| Claire | Finance | 38000 |
| Gaelle | HR | 33000 |
| David | HR | 29000 |
| Emma | IT | 50000 |
| Farid | IT | 47000 |
| Iris | IT | 47000 |
| Bob | IT | 41000 |
Chaque colonne de tri départage les égalités de la précédente : Hugo et Jules gagnent tous deux 44000.
Exercice 11
Affiche la compagnie, la destination et le prix du deuxième vol le moins cher au départ de 'CDG'.
| id | airline | origin | dest | departs | duration_min | price | seats_sold | capacity |
|---|---|---|---|---|---|---|---|---|
| 1 | SkyJet | CDG | MAD | 2025-06-01 08:10 | 125 | 89 | 150 | 180 |
| 2 | AirNova | CDG | LIS | 2025-06-01 11:40 | 155 | 120 | 160 | 170 |
| 3 | BlueWing | LYS | FCO | 2025-06-02 07:30 | 95 | 75 | 110 | 150 |
| 4 | SkyJet | MAD | CDG | 2025-06-02 18:20 | 120 | 95 | 170 | 180 |
| 5 | AirNova | BER | CDG | 2025-06-03 09:05 | 110 | 105 | 140 | 160 |
| 6 | BlueWing | NCE | BER | 2025-06-03 13:50 | 130 | 140 | 90 | 150 |
| 7 | SkyJet | CDG | FCO | 2025-06-04 06:45 | 135 | 99 | 175 | 180 |
| 8 | AirNova | LIS | MAD | 2025-06-04 16:15 | 75 | 65 | 60 | 120 |
| 9 | BlueWing | FCO | LYS | 2025-06-05 20:30 | 100 | 82 | 130 | 150 |
| 10 | SkyJet | CDG | BER | 2025-06-05 10:00 | 105 | 110 | 120 | 180 |
| 11 | AirNova | MAD | LIS | 2025-06-06 12:25 | 80 | 70 | 95 | 120 |
| 12 | BlueWing | LYS | MAD | 2025-06-06 15:40 | 115 | 79 | 100 | 150 |
Voir les indices
Indice 1 · piste : Filtre, trie, puis saute la première ligne.
Indice 2 · méthode : Filtre sur origin, trie par prix, puis LIMIT 1 OFFSET 1.
Voir la correction
SELECT airline, dest, price
FROM flights
WHERE origin = 'CDG'
ORDER BY price
LIMIT 1 OFFSET 1;Résultat attendu (1 ligne) :
| airline | dest | price |
|---|---|---|
| SkyJet | FCO | 99 |
OFFSET 1 saute le vol le moins cher, LIMIT 1 garde le suivant.
S’entraîner avec correction automatique
Dans SpeedQL, tu écris ta requête et elle est vérifiée tout de suite, sur ces tables puis sur un jeu de données caché.