Aide-mémoire SQL
L'ordre des clauses
SELECT›FROM›JOIN … ON›WHERE›GROUP BY›HAVING›ORDER BY›LIMIT
On écrit les clauses dans cet ordre, mais SQL les exécute dans un autre : FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. C'est pour cela que l'on filtre les groupes avec HAVING : au moment du WHERE, les groupes n'existent pas encore.
La syntaxe par thème
Filtrer
WHERE prix > 10 AND ville IN ('Lyon', 'Paris')
WHERE nom LIKE 'B%' -- commence par B
WHERE age IS NULLLire le cours →Supprimer les doublons
SELECT DISTINCT ville FROM clients;
SELECT COUNT(DISTINCT ville) FROM clients;Lire le cours →Grouper et filtrer les groupes
SELECT ville, COUNT(*) AS nb
FROM clients
GROUP BY ville
HAVING COUNT(*) > 5;Lire le cours →Joindre deux tables
SELECT o.id, c.nom
FROM commandes o
JOIN clients c ON c.id = o.client_id;Lire le cours →Jointure externe
SELECT c.nom
FROM clients c
LEFT JOIN commandes o ON o.client_id = c.id
WHERE o.id IS NULL; -- clients sans commandeLire le cours →Sous-requêtes
WHERE prix > (SELECT AVG(prix) FROM produits)
WHERE id IN (SELECT client_id FROM commandes)
WHERE NOT EXISTS (SELECT 1 FROM … WHERE …)Lire le cours →CTE
WITH etape AS (
SELECT client_id, COUNT(*) AS nb
FROM commandes GROUP BY client_id
)
SELECT * FROM etape WHERE nb > 5;Lire le cours →Fonctions de fenêtre
RANK() OVER (PARTITION BY categorie ORDER BY prix DESC)
ROW_NUMBER() OVER (ORDER BY date_commande)
SUM(ca) OVER (ORDER BY mois) -- cumulLire le cours →Modifier les données
INSERT INTO t (a, b) VALUES (1, 'x');
UPDATE t SET a = a + 1 WHERE id = 3;
DELETE FROM t WHERE id = 3;Lire le cours →Créer une structure
CREATE TABLE t (id INTEGER PRIMARY KEY, nom TEXT);
ALTER TABLE t ADD COLUMN age INTEGER;
CREATE VIEW v AS SELECT * FROM t;Fonctions SQLite utiles
ROUND(x, 2) LENGTH(s) UPPER(s) LOWER(s)
COALESCE(x, 0) a || b substr(s, 1, 3)
strftime('%Y', date) date('now')Lire le cours →Les valeurs manquantes (NULL)
On ne compare jamais avec = NULL : on écrit IS NULL ou IS NOT NULL. Les fonctions SUM, AVG, MIN, MAX et COUNT(colonne) ignorent les NULL, alors que COUNT(*) compte toutes les lignes. Voir le cours sur NULL.