Aller au contenu principal

Aide-mémoire SQL

Interroger et modifier une base, avec des requêtes qui s'exécutent sur une vraie table.

L'ordre des clauses, qui ne se discute pas

SELECT    quelles colonnes
FROM      quelle table
JOIN      quelles autres tables
WHERE     quelles lignes garder            (avant regroupement)
GROUP BY  comment les regrouper
HAVING    quels groupes garder             (après regroupement)
ORDER BY  dans quel ordre les rendre
LIMIT     combien en garder

Choisir les colonnes

ÉcrireCe que ça fait
SELECT *Toutes les colonnes. Commode pour explorer, à éviter ensuite.
SELECT nom, serviceSeulement celles-là.
SELECT DISTINCT serviceSans les doublons.
SELECT salaire * 12 AS annuelUne colonne calculée, renommée.
SELECT nom || ' ' || prenomColler deux textes.

Garder certaines lignes

ÉcrireCe que ça fait
WHERE salaire >= 2500Comparer.
WHERE nom = 'Girard'Guillemets simples pour le texte.
WHERE service IN ('Etudes', 'Support')Dans une liste de valeurs.
WHERE salaire BETWEEN 2000 AND 3000Bornes comprises.
WHERE nom LIKE 'G%'Commence par G. % remplace n'importe quelle suite.
WHERE salaire IS NULLValeur absente. Jamais = NULL.
AND OR NOTCombiner. Les parenthèses évitent les surprises.

Compter, sommer, moyenner

ÉcrireCe que ça fait
COUNT(*)Le nombre de lignes.
COUNT(colonne)Le nombre de valeurs non nulles de cette colonne.
SUM(x) AVG(x)Somme, moyenne.
MIN(x) MAX(x)Le plus petit, le plus grand.
ROUND(AVG(x), 2)Arrondir le résultat.

Regrouper

ÉcrireCe que ça fait
GROUP BY serviceUn paquet par valeur de service.
GROUP BY a, bUn paquet par couple de valeurs.
HAVING COUNT(*) > 5Ne garder que les paquets d'au moins six lignes.
SELECT service, COUNT(*)Toute colonne du SELECT doit être regroupée ou agrégée.
ORDER BY COUNT(*) DESCTrier les paquets par leur taille.

Relier deux tables

ÉcrireCe que ça fait
JOIN … ON …Garde les lignes qui se correspondent des deux côtés.
LEFT JOINGarde toutes les lignes de gauche, avec des NULL à droite quand rien ne correspond.
FROM Employe eUn alias, qui rend la requête lisible dès deux tables.

Modifier les données

ÉcrireCe que ça fait
INSERT INTO t (a, b) VALUES (…)Ajouter une ligne.
UPDATE t SET a = … WHERE …Modifier. Sans WHERE, toutes les lignes.
DELETE FROM t WHERE …Supprimer. Sans WHERE, la table entière.
BEGIN ; … ; COMMIT ;Tout ou rien. ROLLBACK annule.

Ce qui se trompe le plus souvent

Le piègeCe qu'il faut faire
= NULL ne vaut jamais vraiIS NULL, IS NOT NULL
COUNT(colonne) ignore les valeurs absentesCOUNT(*) pour compter les lignes
Une jointure sans ON produit toutes les pairestoujours écrire la condition de jointure
Une agrégation dans WHERE échouela mettre dans HAVING
UPDATE ou DELETE sans WHERE touche toutécrire d'abord le SELECT équivalent
AVG ignore les NULL, pas les zérosCOALESCE(x, 0) si l'absence vaut zéro
Les démonstrations qui s'exécutent, les exemples et les explications sont surpagevive.fr/ressources/sql