1
Commandes de base (DML)
SELECT - Sélectionner des données
SELECT colonne1, colonne2 FROM table;
SELECT * FROM clients;
SELECT DISTINCT ville FROM clients;
INSERT - Insérer des données
INSERT INTO clients (nom, prenom, ville)
VALUES ('Dupont', 'Jean', 'Paris');
UPDATE - Modifier des données
UPDATE clients
SET ville = 'Lyon'
WHERE id = 5;
DELETE - Supprimer des données
DELETE FROM clients
WHERE ville = 'Paris';
2
Clause WHERE - Filtrer les données
-
Opérateurs de comparaison : =, !=, <, >, <=, >=
SELECT * FROM produits
WHERE prix > 50;
-
Opérateurs logiques : AND, OR, NOT
SELECT * FROM produits
WHERE prix > 50 AND stock > 0;
-
BETWEEN : intervalle de valeurs
SELECT * FROM produits
WHERE prix BETWEEN 10 AND 50;
-
IN : valeurs dans une liste
SELECT * FROM clients
WHERE ville IN ('Paris', 'Lyon', 'Marseille');
-
LIKE : recherche de motifs (% = plusieurs caractères, _ = un caractère)
SELECT * FROM clients
WHERE nom LIKE 'Dup%';
-
IS NULL / IS NOT NULL : valeurs nulles
SELECT * FROM clients
WHERE email IS NULL;
3
Tri et limitation
ORDER BY - Trier les résultats
SELECT * FROM produits
ORDER BY prix ASC;
SELECT * FROM produits
ORDER BY prix DESC;
SELECT * FROM clients
ORDER BY ville ASC, nom ASC;
LIMIT - Limiter le nombre de résultats
SELECT * FROM produits
ORDER BY prix DESC
LIMIT 5;
4
Fonctions d'agrégation
-
COUNT() : compte le nombre de lignes
SELECT COUNT(*) FROM clients;
-
SUM() : somme des valeurs
SELECT SUM(prix) AS total FROM commandes;
-
AVG() : moyenne des valeurs
SELECT AVG(prix) AS prix_moyen FROM produits;
-
MAX() / MIN() : valeur maximale / minimale
SELECT MAX(prix), MIN(prix) FROM produits;
5
GROUP BY et HAVING
GROUP BY - Regroupement
SELECT ville, COUNT(*) AS nb_clients
FROM clients
GROUP BY ville;
📊 Résultat exemple :
| ville |
nb_clients |
| Paris |
25 |
| Lyon |
18 |
| Marseille |
12 |
HAVING - Filtrer les groupes
SELECT ville, COUNT(*) AS nb_clients
FROM clients
GROUP BY ville
HAVING COUNT(*) > 10;
-
⚠️ Différence WHERE vs HAVING : WHERE filtre avant regroupement, HAVING filtre après
6
Jointures (JOINS)
INNER JOIN - Jointure interne
Retourne uniquement les lignes qui ont une correspondance dans les deux tables.
SELECT clients.nom, commandes.numero
FROM clients
INNER JOIN commandes ON clients.id = commandes.client_id;
LEFT JOIN - Jointure externe gauche
Retourne toutes les lignes de la table de gauche + les correspondances de droite.
SELECT clients.nom, commandes.numero
FROM clients
LEFT JOIN commandes ON clients.id = commandes.client_id;
RIGHT JOIN - Jointure externe droite
Retourne toutes les lignes de la table de droite + les correspondances de gauche.
SELECT clients.nom, commandes.numero
FROM clients
RIGHT JOIN commandes ON clients.id = commandes.client_id;
Jointures multiples
SELECT c.nom, cmd.numero, p.libelle
FROM clients c
INNER JOIN commandes cmd ON c.id = cmd.client_id
INNER JOIN produits p ON cmd.produit_id = p.id;
7
Sous-requêtes
Sous-requête dans WHERE
SELECT nom FROM produits
WHERE prix > (SELECT AVG(prix) FROM produits);
Sous-requête avec IN
SELECT nom FROM clients
WHERE id IN (
SELECT client_id FROM commandes
WHERE date > '2024-01-01'
);
Sous-requête dans SELECT
SELECT nom, prix,
(SELECT AVG(prix) FROM produits) AS prix_moyen
FROM produits;
8
Définition de données (DDL)
CREATE TABLE - Créer une table
CREATE TABLE clients (
id INT PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(50) NOT NULL,
prenom VARCHAR(50),
email VARCHAR(100) UNIQUE,
date_inscription DATE DEFAULT CURRENT_DATE
);
Contraintes importantes
- PRIMARY KEY : clé primaire (unique et non nulle)
- FOREIGN KEY : clé étrangère (référence une autre table)
- NOT NULL : valeur obligatoire
- UNIQUE : valeur unique dans la colonne
- DEFAULT : valeur par défaut
- AUTO_INCREMENT : incrémentation automatique
Clé étrangère (FOREIGN KEY)
CREATE TABLE commandes (
id INT PRIMARY KEY AUTO_INCREMENT,
client_id INT,
date_commande DATE,
FOREIGN KEY (client_id) REFERENCES clients(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
ALTER TABLE - Modifier une table
ALTER TABLE clients
ADD COLUMN telephone VARCHAR(15);
ALTER TABLE clients
DROP COLUMN telephone;
ALTER TABLE clients
MODIFY COLUMN nom VARCHAR(100);
DROP TABLE - Supprimer une table
DROP TABLE clients;
9
Transactions et vues
Transactions - Garantir l'intégrité
START TRANSACTION;
UPDATE comptes SET solde = solde - 100 WHERE id = 1;
UPDATE comptes SET solde = solde + 100 WHERE id = 2;
COMMIT;
ROLLBACK;
-
Propriétés ACID : Atomicité, Cohérence, Isolation, Durabilité
Vues (VIEWS)
Table virtuelle basée sur une requête SQL.
CREATE VIEW clients_actifs AS
SELECT nom, prenom, email
FROM clients
WHERE actif = 1;
SELECT * FROM clients_actifs;
DROP VIEW clients_actifs;
10
Index et performances
Index - Accélérer les requêtes
Créer un index pour optimiser les recherches sur une colonne.
CREATE INDEX idx_nom ON clients(nom);
CREATE INDEX idx_ville_nom ON clients(ville, nom);
DROP INDEX idx_nom ON clients;
-
✅ Utiliser un index si : recherches fréquentes, tri, jointures sur la colonne
-
❌ Éviter un index si : table petite, nombreuses insertions/modifications, colonne rarement utilisée
💡
Conseils et pièges à éviter
-
Toujours utiliser WHERE avec UPDATE/DELETE : sinon toutes les lignes seront affectées !
-
Attention à la casse : SQL n'est pas sensible à la casse pour les mots-clés, mais peut l'être pour les noms de tables/colonnes selon le SGBD
-
Alias utiles : utilisez AS pour renommer colonnes et tables (plus lisible)
-
COUNT(*) vs COUNT(colonne) : COUNT(*) compte toutes les lignes, COUNT(colonne) ignore les NULL
-
Ordre d'exécution SQL : FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
-
Jointures : bien comprendre la différence entre INNER, LEFT, RIGHT JOIN
-
Injection SQL : toujours utiliser des requêtes préparées pour sécuriser (ne jamais concaténer des variables utilisateur directement)
-
Performances : éviter SELECT *, utiliser des index, limiter les résultats
-
Normes de nommage : utiliser snake_case pour les tables/colonnes, noms explicites