Question 1Laquelle des descriptions suivantes décrit correctement SELECT DISTINCT ?
DISTINCT, ORDER BY, LIMIT — Mettre en forme l'ensemble de résultats
Cet article fait partie du Cours de SQL, qui vous permet de maîtriser à partir de zéro des compétences SQL concrètes, des bases jusqu'aux requêtes complexes et à l'optimisation SQL.
DISTINCT pour dédupliquer, ORDER BY pour trier, LIMIT et OFFSET pour paginer. Démonstration des 4 constructions sur des données de scores au format CSV pour mettre en forme le résultat.
Les données qu'on va utiliser — la table score chargée depuis CSV
Cet article utilise une table score chargée automatiquement depuis un fichier CSV pour parcourir les quatre constructions qui mettent en forme la sortie de SELECT — DISTINCT (déduplication), ORDER BY (tri), LIMIT (compte de lignes) et OFFSET (saut depuis le début).
La table score a 5 colonnes — id / name / subject / score / recorded_on — avec 15 lignes au total : 5 étudiants (Alice / Bob / Carol / Dave / Eve) ayant chacun passé 3 matières (Math / English / Science).
DISTINCT — ne renvoyer que les lignes uniques
Un résultat de SELECT peut contenir plusieurs fois la même ligne. Par exemple, extraire seulement la colonne name de score renvoie 15 lignes — Alice / Bob / Carol / Dave / Eve, trois matières chacun.
Écrire SELECT DISTINCT col, ... fusionne les lignes en doublon en une seule dans l'ensemble de résultats. Avec plusieurs colonnes, les lignes sont considérées comme doublons quand la combinaison de colonnes correspond.
-- Liste les noms d'étudiants uniques
SELECT DISTINCT name FROM score;
-- Liste les matières uniques
SELECT DISTINCT subject FROM score;
-- Dédup sur la combinaison (name, subject) (= les 15 lignes sont uniques)
SELECT DISTINCT name, subject FROM score;
ORDER BY — trier le résultat
SQL ne garantit pas l'ordre des lignes par défaut — SELECT * FROM score; laisse l'implémentation de la base décider de l'ordre dans lequel les lignes reviennent. Quand tu veux un ordre spécifique, ajoute ORDER BY col [ASC|DESC].
- ASC (ascendant / petit → grand) est la valeur par défaut et peut être omis
- DESC (descendant / grand → petit) doit être écrit explicitement
- Une liste de plusieurs colonnes séparées par des virgules te donne un tri à plusieurs niveaux : les lignes ex æquo sur la première colonne sont ordonnées par la seconde
-- 1) Tri ascendant sur une colonne (ASC peut être omis)
SELECT name, score FROM score ORDER BY score;
-- 2) Tri descendant sur une colonne
SELECT name, score FROM score ORDER BY score DESC;
-- 3) Tri multi-colonnes (par subject, puis du score le plus haut au plus bas dans une matière)
SELECT name, subject, score FROM score ORDER BY subject ASC, score DESC;
Détails sur ORDER BY
- ORDER BY se place après WHERE et avant LIMIT. Mémorise l'ordre SELECT cols FROM table WHERE condition ORDER BY col DESC LIMIT N; et tu ne te tromperas pas.
- Le côté droit d'ORDER BY accepte un numéro de colonne (ORDER BY 2 DESC trie par la 2e colonne sélectionnée), mais ça nuit à la lisibilité — la convention est d'utiliser les noms de colonnes.
- Dans la console de ce cours, le tri de chaînes est majuscule → minuscule (ordre ASCII). Certaines bases traitent 'A' et 'a' comme équivalents.
LIMIT et OFFSET — restreindre le compte et paginer
Quand les ensembles de résultats deviennent gros — 100 lignes, 10 000 lignes — tout déverser à l'écran est lourd et l'utilisateur n'arrive pas à l'absorber. Ajouter LIMIT N ne renvoie que les N premières lignes. Combine avec OFFSET M pour sauter les M premières lignes puis prendre N, ce qui te donne la pagination pour des choses comme « éléments 6–10 » ou « éléments 11–20 ».
-- 1) Prendre le top 5 (classement TOP 5)
SELECT name, subject, score FROM score
ORDER BY score DESC
LIMIT 5;
-- 2) Prendre les éléments 6 à 10 (page 2)
SELECT name, subject, score FROM score
ORDER BY score DESC
LIMIT 5 OFFSET 5;
-- 3) Formule de pagination : page N, K lignes par page
-- LIMIT K OFFSET (N - 1) * K
-- ex. page 3, 5 par page → LIMIT 5 OFFSET 10
| Page | Lignes par page | OFFSET | LIMIT | Rang ciblé |
|---|---|---|---|---|
| 1 | 5 | 0 | 5 | 1–5 |
| 2 | 5 | 5 | 5 | 6–10 |
| 3 | 5 | 10 | 5 | 11–15 |
| 1 | 10 | 0 | 10 | 1–10 |
| 2 | 10 | 10 | 10 | 11–20 |
| 1 | 20 | 0 | 20 | 1–20 |
LIMIT sans ORDER BY ne garantit pas l'ordre
Écrire juste LIMIT en sautant ORDER BY comme SELECT * FROM score LIMIT 5; laisse le choix des 5 lignes qui reviennent à l'implémentation de la base. Même sur une base qui tend à renvoyer les lignes dans l'ordre d'insertion (comme SQLite), le standard SQL dit que l'ordre est indéfini. Sous MySQL / PostgreSQL, les index et les plans d'exécution peuvent changer les lignes que tu obtiens.
Pour tout ce où l'ordre compte — classements, pagination, « N premiers éléments » — écris toujours ORDER BY avant LIMIT.
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Que renvoie SELECT name, score FROM score ORDER BY score DESC; ?
Question 3Quelles lignes renvoie SELECT * FROM score ORDER BY score DESC LIMIT 5 OFFSET 10; ?