01 C'est quoi SQL ?
SQL (Structured Query Language) est le langage universel pour communiquer avec les bases de données relationnelles. Créé en 1974 par IBM, il est encore aujourd'hui la compétence fondamentale de tout développeur.
SQL est divisé en 3 catégories :
- DDL (Data Definition Language) — créer et modifier la structure :
CREATE,ALTER,DROP - DML (Data Manipulation Language) — manipuler les données :
SELECT,INSERT,UPDATE,DELETE - DCL (Data Control Language) — gérer les accès :
GRANT,REVOKE
💡 La syntaxe SQL est quasi identique entre MySQL, PostgreSQL, SQLite et SQL Server. Quelques différences mineures existent, mais apprendre SQL = savoir travailler avec toutes ces BDD.
02 SELECT — lire des données
SELECT est la requête la plus utilisée. Elle lit des données sans les modifier.
-- Lire toutes les colonnes de tous les utilisateurs
SELECT * FROM users;
-- Lire seulement certaines colonnes
SELECT nom, email FROM users;
-- Filtrer les utilisateurs premium, triés par nom
SELECT nom, email FROM users
WHERE is_premium = TRUE
ORDER BY nom ASC;
-- Limiter le nombre de résultats (pagination)
SELECT * FROM articles
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;
-- Recherche avec LIKE (% = n'importe quelle suite de caractères)
SELECT * FROM users WHERE email LIKE '%@gmail.com';
-- Plusieurs conditions
SELECT * FROM users
WHERE age >= 18 AND ville = 'Paris'
ORDER BY nom;
💡 Évite
SELECT * en production : récupère seulement les colonnes dont tu as besoin. C'est plus rapide et plus sécurisé (tu n'exposes pas des champs sensibles par accident).03 INSERT, UPDATE, DELETE — modifier les données
-- Insérer un utilisateur
INSERT INTO users (nom, email, age)
VALUES ('Alaa', 'alaa@example.com', 22);
-- Insérer plusieurs lignes d'un coup
INSERT INTO users (nom, email, age) VALUES
('Marie', 'marie@example.com', 28),
('Lucas', 'lucas@example.com', 25),
('Sofia', 'sofia@example.com', 31);
-- Mettre à jour — passer Alaa en premium
UPDATE users
SET is_premium = TRUE, updated_at = NOW()
WHERE email = 'alaa@example.com';
-- Supprimer les utilisateurs mineurs
DELETE FROM users WHERE age < 18;
-- Supprimer TOUTES les lignes (attention !)
DELETE FROM users; -- supprime ligne par ligne
TRUNCATE TABLE users; -- plus rapide, remet l'auto-increment à 0
⚠️ Toujours mettre un
WHERE sur un UPDATE ou DELETE — sinon tu modifies/supprimes TOUTES les lignes. En production, utilise des transactions pour pouvoir annuler en cas d'erreur.04 WHERE, ORDER BY, LIMIT, GROUP BY
Ces clauses permettent de filtrer, trier et regrouper les résultats.
-- GROUP BY : compter les inscrits par ville
SELECT ville, COUNT(*) AS total
FROM users
GROUP BY ville
ORDER BY total DESC;
-- HAVING : filtrer APRÈS le GROUP BY (pas WHERE)
SELECT ville, COUNT(*) AS total
FROM users
GROUP BY ville
HAVING COUNT(*) > 5
ORDER BY total DESC;
-- Pagination : page 3, 10 résultats par page
-- OFFSET = (page - 1) * limit = (3-1) * 10 = 20
SELECT * FROM articles
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;
-- DISTINCT : éviter les doublons
SELECT DISTINCT ville FROM users ORDER BY ville;
-- IN : vérifier si une valeur est dans une liste
SELECT * FROM users WHERE ville IN ('Paris', 'Lyon', 'Bordeaux');
-- BETWEEN : plage de valeurs
SELECT * FROM products WHERE price BETWEEN 10 AND 50;
05 Fonctions d'agrégation
Les fonctions d'agrégation calculent une valeur à partir de plusieurs lignes.
| Fonction | Rôle | Exemple |
|---|---|---|
COUNT(*) | Nombre de lignes | SELECT COUNT(*) FROM users; |
SUM(col) | Somme | SELECT SUM(price) FROM orders; |
AVG(col) | Moyenne | SELECT AVG(age) FROM users; |
MAX(col) | Maximum | SELECT MAX(price) FROM products; |
MIN(col) | Minimum | SELECT MIN(created_at) FROM users; |
-- Stats complètes sur les commandes
SELECT
COUNT(*) AS nb_commandes,
SUM(total) AS chiffre_affaires,
AVG(total) AS panier_moyen,
MAX(total) AS plus_grosse_commande,
MIN(total) AS plus_petite_commande
FROM orders
WHERE created_at >= '2026-01-01';
-- Revenus par mois
SELECT
DATE_FORMAT(created_at, '%Y-%m') AS mois,
COUNT(*) AS nb_orders,
SUM(total) AS revenus
FROM orders
GROUP BY mois
ORDER BY mois DESC;
💡
COUNT(*) compte toutes les lignes y compris celles avec des valeurs NULL. COUNT(col) ne compte que les valeurs non-NULL d'une colonne spécifique.06 À retenir
- SQL est le langage universel pour toutes les BDD relationnelles
SELECTlit sans modifier — ajouteWHERE,ORDER BY,LIMITpour filtrerINSERT INTO table (cols) VALUES (...)— toujours préciser les colonnesUPDATE ... SET ... WHERE ...— toujours un WHEREDELETE FROM ... WHERE ...— toujours un WHEREGROUP BY+ fonctions d'agrégation (COUNT, SUM, AVG...) pour les statistiquesHAVINGfiltre les groupes (comme WHERE mais après GROUP BY)