Question 1Laquelle des descriptions suivantes décrit correctement SELECT DISTINCT ?
DISTINCT, ORDER BY, LIMIT — Mettre en forme l'ensemble de résultats
Apprends SQL DISTINCT, ORDER BY, LIMIT et OFFSET. Couvre la déduplication, le tri, la limite de lignes et la pagination avec OFFSET — tout s'exécute en direct dans ton navigateur sur un jeu de données score chargé depuis CSV.
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; ?