Aller au contenu

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