SELECT#
essentiel
Syntaxe#
SELECT [DISTINCT | ALL] colonne [AS alias], ...
FROM table [AS alias]
[JOIN ... ON ...]
[WHERE condition]
[GROUP BY colonne, ...]
[HAVING condition]
[ORDER BY colonne [ASC|DESC], ...]
[LIMIT n [OFFSET m]];
Paramètres#
| Clause | Rôle |
|---|---|
DISTINCT |
Supprime les doublons |
WHERE |
Filtre les lignes avant regroupement |
GROUP BY |
Regroupe les lignes |
HAVING |
Filtre après regroupement |
ORDER BY |
Tri du résultat |
LIMIT n OFFSET m |
Pagination |
Exemples#
SELECT nom, age FROM etudiants WHERE age >= 18 ORDER BY nom LIMIT 10;
SELECT ville, COUNT(*) AS nb
FROM etudiants
GROUP BY ville
HAVING COUNT(*) > 5;
CASE#
SELECT nom,
CASE
WHEN age < 18 THEN 'mineur'
WHEN age < 26 THEN 'jeune'
ELSE 'adulte'
END AS categorie
FROM etudiants;
Sous-requêtes#
-- Dans WHERE (liste)
SELECT nom FROM etudiants
WHERE ville_id IN (SELECT id FROM villes WHERE pays = 'France');
-- Test d'existence
SELECT nom FROM etudiants e
WHERE EXISTS (SELECT 1 FROM inscriptions i WHERE i.etudiant_id = e.id);
-- Sous-requête scalaire dans SELECT
SELECT nom, (SELECT COUNT(*) FROM inscriptions i WHERE i.etudiant_id = e.id) AS nb
FROM etudiants e;
-- Sous-requête comme table dérivée
SELECT * FROM (SELECT ville, COUNT(*) AS nb FROM etudiants GROUP BY ville)
WHERE nb > 10;
Opérateurs ensemblistes courant#
SELECT nom FROM a
UNION [ALL] -- INTERSECT | EXCEPT
SELECT nom FROM b
ORDER BY nom; -- s'applique au résultat complet
UNION dédoublonne, UNION ALL non (et est plus rapide).
Ordre des clauses
Dans une requête composée, ORDER BY et LIMIT ne peuvent apparaître qu'une seule fois, à la fin, et portent sur le résultat global.
CTE (WITH) avancé#
Alternative lisible à une sous-requête dans FROM, surtout quand elle est réutilisée plusieurs fois.
WITH totaux AS (
SELECT ville, COUNT(*) AS nb FROM etudiants GROUP BY ville
)
SELECT * FROM totaux WHERE nb > 10;
CTE récursive — rarement nécessaire
Réservée aux structures hiérarchiques (arbres, graphes) ou à la génération de séries.
-- Génération d'une série 1..10
WITH RECURSIVE compte(x) AS (
SELECT 1
UNION ALL
SELECT x + 1 FROM compte WHERE x < 10
)
SELECT * FROM compte;
-- Parcours d'une hiérarchie
WITH RECURSIVE sous_categories(id, nom) AS (
SELECT id, nom FROM categories WHERE parent_id IS NULL
UNION ALL
SELECT c.id, c.nom
FROM categories c JOIN sous_categories s ON c.parent_id = s.id
)
SELECT * FROM sous_categories;
La branche récursive doit comporter une condition d'arrêt, sinon la requête boucle indéfiniment.
SQLite
LIMIT sans ORDER BY : ordre non garanti. OFFSET seul impossible sans LIMIT (utiliser LIMIT -1 OFFSET n).