Aide-mémoire SQL (PostgreSQL)
Les instructions dont vous avez le plus besoin, avec un exemple pour chacune. Les exemples s'exécutent sur la base d'exercices de boulangerie et utilisent la syntaxe PostgreSQL. Les autres bases de données diffèrent sur de petits détails, signalés là où ils comptent.
Lire et filtrer
SELECT choisit les colonnes, FROM nomme la table, WHERE garde les lignes qui correspondent, ORDER BY trie et LIMIT coupe le résultat. Le texte se met entre guillemets simples.
SELECT name, unit_price FROM products WHERE category = 'pastry' AND unit_price < 3 ORDER BY unit_price DESC LIMIT 5;
Résultat : Les viennoiseries à moins de 3.00, de la plus chère à la moins chère.
Motifs, listes, plages et NULL
LIKE compare à un motif (% représente n'importe quel texte, _ un seul caractère ; ILIKE ignore la casse). IN teste une liste, BETWEEN teste une plage incluant ses bornes, IS NULL trouve les valeurs manquantes.
SELECT first_name, loyalty_tier FROM customers WHERE first_name LIKE 'A%' OR loyalty_tier IS NULL ORDER BY first_name;
Résultat : Les clients dont le nom commence par A, ou qui n'ont pas de niveau de fidélité.
Résumer avec GROUP BY
COUNT, SUM, AVG, MIN et MAX transforment les lignes en une valeur par groupe. WHERE filtre les lignes avant le regroupement, HAVING filtre les groupes.
SELECT channel, COUNT(*) AS orders FROM orders GROUP BY channel HAVING COUNT(*) > 5 ORDER BY channel;
Résultat : Seulement le canal en ligne, avec 7 commandes.
Joindre des tables
INNER JOIN garde les correspondances, LEFT JOIN garde chaque ligne de la table de gauche. Donnez aux tables des alias courts et joignez toujours sur la clé.
SELECT p.name, SUM(oi.quantity) AS units FROM products AS p JOIN order_items AS oi ON oi.product_id = p.product_id GROUP BY p.name ORDER BY units DESC, p.name LIMIT 3;
Résultat : Les trois produits les plus vendus.
CASE : si/alors/sinon en SQL
CASE renvoie la valeur de la première condition vraie, comme IFS dans Excel. Sans ELSE, il renvoie NULL.
SELECT name,
CASE WHEN unit_price < 3 THEN 'budget' WHEN unit_price <= 4 THEN 'standard' ELSE 'premium' END AS band
FROM products
ORDER BY product_id;Résultat : Chaque produit reçoit l'étiquette budget, standard ou premium.
Sous-requêtes et WITH
Une sous-requête est une requête placée dans une autre. WITH la nomme, pour que vous puissiez lire la requête principale comme un récit.
WITH spend AS ( SELECT o.customer_id, SUM(oi.quantity * p.unit_price) AS total FROM orders AS o JOIN order_items AS oi ON oi.order_id = o.order_id JOIN products AS p ON p.product_id = oi.product_id GROUP BY o.customer_id ) SELECT customer_id, total FROM spend WHERE total > 30 ORDER BY total DESC;
Résultat : Le client 1 (Lopez) avec 37.10, et le client 3 (Dubois) avec 36.00.
Fonctions de fenêtrage
OVER ajoute un calcul sur plusieurs lignes sans les regrouper : rangs, totaux cumulés, et LAG/LEAD pour la ligne précédente et la suivante.
SELECT order_id, order_date,
RANK() OVER (ORDER BY order_date) AS day_rank,
LAG(order_date) OVER (ORDER BY order_id) AS prev_date
FROM orders
ORDER BY order_id;Résultat : Chaque commande avec son rang de date et la date de la commande précédente.
Modifier des données
INSERT ajoute des lignes, UPDATE les modifie, DELETE les supprime. Incluez toujours WHERE dans UPDATE et DELETE, et exécutez d'abord la requête en SELECT pour voir ce qu'elle touche. Entourez les modifications risquées de BEGIN et ROLLBACK.
UPDATE products SET unit_price = unit_price + 0.10 WHERE category = 'drinks' RETURNING name, unit_price;
Résultat : Les deux boissons avec leurs nouveaux prix.
Questions fréquentes
- Dans quel ordre SQL exécute-t-il une requête ?
- FROM et JOIN, puis WHERE, GROUP BY, HAVING, SELECT, ORDER BY et enfin LIMIT. C'est pourquoi un WHERE ne peut pas utiliser un alias de colonne défini dans SELECT, mais ORDER BY le peut.
- SQL est-il sensible à la casse ?
- Les mots-clés et les noms de tables ou de colonnes ne le sont pas (PostgreSQL met en minuscules les noms non entre guillemets). Les valeurs de texte le sont : 'Paris' et 'paris' sont différents, sauf si vous utilisez ILIKE ou LOWER().
- Cela fonctionne-t-il avec MySQL, SQL Server ou SQLite ?
- Le noyau (SELECT, WHERE, GROUP BY, JOIN, CASE) fonctionne. Les différences concernent LIMIT (TOP dans SQL Server), la concaténation de texte, les fonctions de date et RETURNING. Consultez la documentation de votre base de données pour ces points.