Exercices SQL corrigés : ORDER BY et LIMIT

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 · niveau 1

Affiche le nom et le salaire de tous les employés, du salaire le plus bas au plus élevé.

Table employees (8 lignes)
idnamedepartmentsalary
1AliceFinance32000
2BobIT41000
3ClaireFinance38000
4DavidHR29000
5EmmaIT50000
6FaridIT47000
7GaelleHR33000
8HugoFinance44000
Voir l’indice

Notions à utiliser : ORDER BY, LIMIT.

Structure de la requête :

SELECT …, …
FROM …
ORDER BY … ASC
Voir la correction
SELECT name, salary
FROM employees
ORDER BY salary ASC;

Résultat attendu (8 lignes, dans cet ordre) :

namesalary
David29000
Alice32000
Gaelle33000
Claire38000
Bob41000
Hugo44000
Farid47000
Emma50000

Exercice 2 · niveau 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.

Table employees (8 lignes)
idnamedepartmentsalary
1AliceFinance32000
2BobIT41000
3ClaireFinance38000
4DavidHR29000
5EmmaIT50000
6FaridIT47000
7GaelleHR33000
8HugoFinance44000
Voir l’indice

Notions à utiliser : ORDER BY, LIMIT.

Structure de la requête :

SELECT …, …, …
FROM …
ORDER BY … ASC, … DESC
Voir la correction
SELECT name, department, salary
FROM employees
ORDER BY department ASC, salary DESC;

Résultat attendu (8 lignes, dans cet ordre) :

namedepartmentsalary
HugoFinance44000
ClaireFinance38000
AliceFinance32000
GaelleHR33000
DavidHR29000
EmmaIT50000
FaridIT47000
BobIT41000

Exercice 3 · niveau 2

Affiche le nom des 3 produits les moins chers, du moins cher au plus cher.

Table products (6 lignes)
idnamecategorypricestock
1KeyboardOffice2540
2MouseOffice150
3ScreenDisplay18012
4HeadsetAudio608
5WebcamOffice450
6SpeakerAudio3525
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 · niveau 2

Affiche le nom des 2 employés les mieux payés, du plus élevé au plus bas salaire.

Table employees (8 lignes)
idnamedepartmentsalary
1AliceFinance32000
2BobIT41000
3ClaireFinance38000
4DavidHR29000
5EmmaIT50000
6FaridIT47000
7GaelleHR33000
8HugoFinance44000
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 · niveau 2

Affiche le nom et le nombre de buts des 3 meilleurs buteurs, du plus grand nombre de buts au plus petit.

Table players (9 lignes)
idnameteam_idpositiongoals
1Alex Moreau1FW9
2Bilal Sow1MF4
3Carl Weber2FW7
4Diego Ruiz2DF1
5Eli Novak3FW6
6Femi Adeyemi4FW11
7Goran Petrov4GK0
8Hugo Lamy5MF5
9Ivan Kral5DF2
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) :

namegoals
Femi Adeyemi11
Alex Moreau9
Carl Weber7

Exercice 6 · niveau 2

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).

Table readings (15 lignes)
idcitydaytemp_maxtemp_minrain_mm
1Paris2025-07-0124150
2Paris2025-07-0227170
3Paris2025-07-0322164.5
4Paris2025-07-04191412
5Paris2025-07-0523130
6Lyon2025-07-0126160
7Lyon2025-07-0229180
8Lyon2025-07-0331190
9Lyon2025-07-0424178.5
10Lyon2025-07-0522153
11Marseille2025-07-0130210
12Marseille2025-07-0232220
13Marseille2025-07-0333230
14Marseille2025-07-0429210
15Marseille2025-07-0528200
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) :

citydaytemp_max
Marseille2025-07-0333
Marseille2025-07-0232
Lyon2025-07-0331

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 · cours, niveau 4 · Guidé

Affiche le titre et l'année des films, du plus ancien au plus récent.

L’ordre des lignes compte.

Table movies (10 lignes)
idtitlegenreyeardurationratingdirector_id
1Night TrainThriller20151187.81
2Blue HarborDrama20181027.12
3Paper Moon CityComedy2012956.45
4Silent PeakDrama20201318.23
5Last SignalSci-Fi20191427.51
6Summer KeysComedy2016885.94
7Iron GardenSci-Fi202112583
8Dust and GoldWestern20141106.82
9The Quiet HourDrama2022977.45
10Deep CurrentThriller20171056.9NULL
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) :

titleyear
Paper Moon City2012
Dust and Gold2014
Night Train2015
Summer Keys2016
Deep Current2017
Blue Harbor2018
Last Signal2019
Silent Peak2020
Iron Garden2021
The Quiet Hour2022

ASC est implicite : ORDER BY year et ORDER BY year ASC sont identiques.

Exercice 8 · cours, niveau 4 · Entraînement

Affiche la liste des genres de films, sans doublon.

Table movies (10 lignes)
idtitlegenreyeardurationratingdirector_id
1Night TrainThriller20151187.81
2Blue HarborDrama20181027.12
3Paper Moon CityComedy2012956.45
4Silent PeakDrama20201318.23
5Last SignalSci-Fi20191427.51
6Summer KeysComedy2016885.94
7Iron GardenSci-Fi202112583
8Dust and GoldWestern20141106.82
9The Quiet HourDrama2022977.45
10Deep CurrentThriller20171056.9NULL
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 · cours, niveau 4 · Entraînement

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.

L’ordre des lignes compte.

Table movies (10 lignes)
idtitlegenreyeardurationratingdirector_id
1Night TrainThriller20151187.81
2Blue HarborDrama20181027.12
3Paper Moon CityComedy2012956.45
4Silent PeakDrama20201318.23
5Last SignalSci-Fi20191427.51
6Summer KeysComedy2016885.94
7Iron GardenSci-Fi202112583
8Dust and GoldWestern20141106.82
9The Quiet HourDrama2022977.45
10Deep CurrentThriller20171056.9NULL
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) :

titledirector_id
Last Signal1
Night Train1
Blue Harbor2
Dust and Gold2
Iron Garden3
Silent Peak3
Summer Keys4
Paper Moon City5
The Quiet Hour5
Deep CurrentNULL

Sans NULLS LAST, Deep Current arriverait en tête : SQLite place les NULL en premier dans un tri croissant.

Exercice 10 · cours, niveau 4 · Entraînement

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.

L’ordre des lignes compte.

Table staff (10 lignes)
idnamedepartmentsalarymanager_idhired
1AliceFinance52000NULL2015-03-01
2BobIT4100012018-06-15
3ClaireFinance3800012019-01-10
4DavidHR2900012020-09-01
5EmmaIT5000022017-11-20
6FaridIT4700022021-02-14
7GaelleHR3300042022-05-30
8HugoFinance4400032016-08-08
9IrisIT4700052023-01-09
10JulesFinance4400032024-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) :

namedepartmentsalary
AliceFinance52000
HugoFinance44000
JulesFinance44000
ClaireFinance38000
GaelleHR33000
DavidHR29000
EmmaIT50000
FaridIT47000
IrisIT47000
BobIT41000

Chaque colonne de tri départage les égalités de la précédente : Hugo et Jules gagnent tous deux 44000.

Exercice 11 · cours, niveau 4 · Défi

Affiche la compagnie, la destination et le prix du deuxième vol le moins cher au départ de 'CDG'.

L’ordre des lignes compte.

Table flights (12 lignes)
idairlineorigindestdepartsduration_minpriceseats_soldcapacity
1SkyJetCDGMAD2025-06-01 08:1012589150180
2AirNovaCDGLIS2025-06-01 11:40155120160170
3BlueWingLYSFCO2025-06-02 07:309575110150
4SkyJetMADCDG2025-06-02 18:2012095170180
5AirNovaBERCDG2025-06-03 09:05110105140160
6BlueWingNCEBER2025-06-03 13:5013014090150
7SkyJetCDGFCO2025-06-04 06:4513599175180
8AirNovaLISMAD2025-06-04 16:15756560120
9BlueWingFCOLYS2025-06-05 20:3010082130150
10SkyJetCDGBER2025-06-05 10:00105110120180
11AirNovaMADLIS2025-06-06 12:25807095120
12BlueWingLYSMAD2025-06-06 15:4011579100150
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) :

airlinedestprice
SkyJetFCO99

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é.

S’entraîner sur les 7 questions « ORDER BY, LIMIT »