Guide Complet SQL
Maîtriser les bases de données relationnelles
Base Intermédiaire Avancé
CREATE, INSERT JOIN, GROUP BY Transactions
SELECT, UPDATE HAVING, ORDER BY Index, Vues
DELETE, DROP Sous-requêtes Procédures stockées
Ce guide couvre toutes les commandes SQL essentielles avec des exemples pratiques. Chaque
section est progressive : commence par les bases, puis avance vers les concepts plus complexes.
1. Gestion des Bases de Données
Créer et sélectionner une base
CREATE DATABASE ma_base;
USE ma_base;
SHOW DATABASES;
Supprimer une base
DROP DATABASE ma_base;
■ Attention : DROP supprime définitivement tout le contenu.
2. Gestion des Tables
Créer une table
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Types de données courants
Type Description Exemple
INT Nombre entier id INT
VARCHAR(n) Texte variable (max n) nom VARCHAR(100)
TEXT Texte long description TEXT
DECIMAL(p,s) Nombre décimal prix DECIMAL(10,2)
DATE Date (AAAA-MM-JJ) naissance DATE
DATETIME Date + heure created_at DATETIME
TIMESTAMP Horodatage auto updated_at TIMESTAMP
BOOLEAN Vrai / Faux actif BOOLEAN
ENUM Valeur parmi liste sexe ENUM('M','F')
Modifier une table (ALTER TABLE)
-- Ajouter une colonne
ALTER TABLE user ADD COLUMN telephone VARCHAR(20);
-- Modifier une colonne
ALTER TABLE user MODIFY COLUMN nom VARCHAR(200);
-- Supprimer une colonne
ALTER TABLE user DROP COLUMN telephone;
-- Renommer une table
RENAME TABLE user TO utilisateur;
Supprimer une table
DROP TABLE user;
SHOW TABLES;
3. Insérer des Données (INSERT)
Insérer une ligne
INSERT INTO user (nom, email, age)
VALUES ('Jean Dupont', 'jean@[Link]', 25);
Insérer plusieurs lignes
INSERT INTO user (nom, email, age) VALUES
('Marie', 'marie@[Link]', 30),
('Paul', 'paul@[Link]', 22),
('Lucie', 'lucie@[Link]', 28);
■ Les colonnes avec DEFAULT ou AUTO_INCREMENT sont optionnelles.
4. Lire les Données (SELECT)
Sélection de base
-- Tout afficher
SELECT * FROM user;
-- Colonnes spécifiques
SELECT nom, email FROM user;
-- Avec alias
SELECT nom AS 'Nom complet', email AS 'Adresse mail' FROM user;
Filtrer avec WHERE
-- Égalité
SELECT * FROM user WHERE nom = 'Jean';
-- Comparaisons
SELECT * FROM user WHERE age > 25;
SELECT * FROM user WHERE age BETWEEN 20 AND 30;
-- Plusieurs conditions
SELECT * FROM user WHERE age > 20 AND email LIKE '%@[Link]';
-- Valeurs multiples
SELECT * FROM user WHERE age IN (20, 25, 30);
-- Valeur nulle
SELECT * FROM user WHERE age IS NULL;
SELECT * FROM user WHERE age IS NOT NULL;
Trier avec ORDER BY
SELECT * FROM user ORDER BY nom ASC;
SELECT * FROM user ORDER BY age DESC;
SELECT * FROM user ORDER BY nom ASC, age DESC;
Limiter les résultats
-- Les 5 premiers
SELECT * FROM user LIMIT 5;
-- 5 résultats à partir du 10e (pagination)
SELECT * FROM user LIMIT 5 OFFSET 10;
Recherche avec LIKE
-- Commence par 'J'
SELECT * FROM user WHERE nom LIKE 'J%';
-- Contient 'an'
SELECT * FROM user WHERE nom LIKE '%an%';
-- Termine par 'on'
SELECT * FROM user WHERE nom LIKE '%on';
-- Exactement 4 caractères
SELECT * FROM user WHERE nom LIKE '____';
5. Modifier des Données (UPDATE)
-- Modifier une ligne
UPDATE user SET nom = 'Jean Martin' WHERE id = 1;
-- Modifier plusieurs colonnes
UPDATE user SET nom = 'Paul', age = 26 WHERE id = 3;
-- Modifier selon une condition
UPDATE user SET age = age + 1 WHERE age < 30;
■ Toujours utiliser WHERE avec UPDATE, sinon toutes les lignes sont modifiées !
6. Supprimer des Données (DELETE)
-- Supprimer une ligne
DELETE FROM user WHERE id = 1;
-- Supprimer selon condition
DELETE FROM user WHERE age < 18;
-- Vider toute la table (garde la structure)
TRUNCATE TABLE user;
■ DELETE sans WHERE supprime TOUTES les lignes. TRUNCATE est plus rapide mais non annulable.
7. Fonctions d'Agrégation
-- Compter les lignes
SELECT COUNT(*) FROM user;
SELECT COUNT(*) AS total FROM user WHERE age > 20;
-- Somme, Moyenne, Min, Max
SELECT SUM(age) FROM user;
SELECT AVG(age) AS moyenne_age FROM user;
SELECT MIN(age) AS plus_jeune FROM user;
SELECT MAX(age) AS plus_age FROM user;
GROUP BY et HAVING
-- Compter par groupe
SELECT age, COUNT(*) AS nb_users
FROM user
GROUP BY age;
-- Filtrer les groupes (HAVING = WHERE pour les groupes)
SELECT age, COUNT(*) AS nb
FROM user
GROUP BY age
HAVING nb > 2
ORDER BY nb DESC;
Fonctions sur les chaînes
SELECT UPPER(nom) FROM user; -- JEAN DUPONT
SELECT LOWER(email) FROM user; -- jean@[Link]
SELECT LENGTH(nom) FROM user; -- longueur
SELECT CONCAT(nom, ' - ', email) FROM user;
SELECT SUBSTRING(nom, 1, 3) FROM user; -- 3 premiers caractères
SELECT TRIM(' texte '); -- supprimer espaces
Fonctions sur les dates
SELECT NOW(); -- date et heure actuelles
SELECT CURDATE(); -- date du jour
SELECT YEAR(created_at) FROM user; -- année
SELECT MONTH(created_at) FROM user; -- mois
SELECT DATEDIFF(NOW(), created_at) FROM user; -- jours écoulés
8. Jointures (JOIN)
Les jointures permettent de combiner des données de plusieurs tables liées.
-- Table commande
CREATE TABLE commande (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
produit VARCHAR(100),
montant DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES user(id)
);
INNER JOIN — correspondances seulement
SELECT [Link], [Link], [Link]
FROM user u
INNER JOIN commande c ON [Link] = c.user_id;
LEFT JOIN — tous les users, même sans commande
SELECT [Link], [Link]
FROM user u
LEFT JOIN commande c ON [Link] = c.user_id;
RIGHT JOIN — toutes les commandes, même sans user
SELECT [Link], [Link]
FROM user u
RIGHT JOIN commande c ON [Link] = c.user_id;
Jointure sur 3 tables
SELECT [Link], [Link], [Link]
FROM user u
INNER JOIN commande c ON [Link] = c.user_id
INNER JOIN produit p ON c.produit_id = [Link];
Type Résultat
INNER JOIN Lignes avec correspondance dans les deux tables
LEFT JOIN Toutes les lignes de gauche + correspondances de droite
RIGHT JOIN Toutes les lignes de droite + correspondances de gauche
CROSS JOIN Toutes les combinaisons possibles (produit cartésien)
9. Sous-requêtes
-- Users ayant passé une commande
SELECT nom FROM user
WHERE id IN (SELECT user_id FROM commande);
-- Users sans commande
SELECT nom FROM user
WHERE id NOT IN (SELECT user_id FROM commande);
-- User avec la commande la plus chère
SELECT nom FROM user
WHERE id = (SELECT user_id FROM commande
ORDER BY montant DESC LIMIT 1);
10. Contraintes et Clés
CREATE TABLE produit (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
prix DECIMAL(10,2) NOT NULL DEFAULT 0.00,
stock INT CHECK (stock >= 0),
categorie_id INT,
UNIQUE (nom),
FOREIGN KEY (categorie_id) REFERENCES categorie(id)
ON DELETE SET NULL
ON UPDATE CASCADE
);
Contrainte Rôle
PRIMARY KEY Identifiant unique de chaque ligne
NOT NULL La valeur ne peut pas être vide
UNIQUE Valeur unique dans toute la colonne
DEFAULT Valeur par défaut si non fournie
CHECK Valide une condition sur la valeur
FOREIGN KEY Lie une colonne à une autre table
AUTO_INCREMENT Incrémente automatiquement (id)
11. Index
Les index accélèrent les recherches sur les grandes tables.
-- Créer un index
CREATE INDEX idx_nom ON user(nom);
CREATE INDEX idx_email ON user(email);
-- Index unique
CREATE UNIQUE INDEX idx_email_unique ON user(email);
-- Voir les index d'une table
SHOW INDEX FROM user;
-- Supprimer un index
DROP INDEX idx_nom ON user;
■ Crée des index sur les colonnes souvent utilisées dans WHERE, JOIN, ORDER BY.
12. Vues (VIEW)
Une vue est une requête sauvegardée qu'on peut utiliser comme une table.
-- Créer une vue
CREATE VIEW vue_commandes AS
SELECT [Link], [Link], [Link]
FROM user u
INNER JOIN commande c ON [Link] = c.user_id;
-- Utiliser la vue
SELECT * FROM vue_commandes;
SELECT * FROM vue_commandes WHERE montant > 100;
-- Supprimer une vue
DROP VIEW vue_commandes;
13. Transactions
Une transaction groupe plusieurs opérations : soit tout réussit, soit tout est annulé.
START TRANSACTION;
INSERT INTO commande (user_id, produit, montant)
VALUES (1, 'Laptop', 500.00);
UPDATE user SET solde = solde - 500 WHERE id = 1;
COMMIT; -- Valider si tout est OK
-- En cas d'erreur, annuler tout
START TRANSACTION;
DELETE FROM user WHERE id = 5;
ROLLBACK; -- Annuler
■ COMMIT = valider définitivement. ROLLBACK = tout annuler. Très utile pour les paiements.
14. Gestion des Utilisateurs MariaDB/MySQL
-- Créer un utilisateur
CREATE USER 'mt'@'localhost' IDENTIFIED BY 'motdepasse';
-- Donner tous les droits sur une base
GRANT ALL PRIVILEGES ON ma_base.* TO 'mt'@'localhost';
-- Droits limités (lecture seule)
GRANT SELECT ON ma_base.* TO 'mt'@'localhost';
-- Appliquer les changements
FLUSH PRIVILEGES;
-- Voir les droits
SHOW GRANTS FOR 'mt'@'localhost';
-- Supprimer un utilisateur
DROP USER 'mt'@'localhost';
15. Commandes Utilitaires
-- Décrire la structure d'une table
DESCRIBE user;
SHOW COLUMNS FROM user;
-- Voir la requête de création d'une table
SHOW CREATE TABLE user;
-- Voir toutes les tables
SHOW TABLES;
-- Voir toutes les bases
SHOW DATABASES;
-- Base de données active
SELECT DATABASE();
-- Version MariaDB/MySQL
SELECT VERSION();
16. Aide-Mémoire Rapide
Commande Action
CREATE DATABASE nom Créer une base
USE nom Sélectionner une base
CREATE TABLE ... Créer une table
INSERT INTO ... VALUES Insérer des données
SELECT * FROM ... Lire toutes les données
SELECT ... WHERE ... Lire avec filtre
UPDATE ... SET ... WHERE Modifier des données
DELETE FROM ... WHERE Supprimer des données
ALTER TABLE ... ADD Ajouter une colonne
DROP TABLE ... Supprimer une table
JOIN ... ON ... Lier deux tables
GROUP BY ... Regrouper les résultats
ORDER BY ... DESC Trier les résultats
COUNT / SUM / AVG Fonctions d'agrégation
LIKE '%texte%' Recherche partielle
LIMIT n Limiter les résultats
START TRANSACTION / COMMIT Démarrer / valider une transaction
ROLLBACK Annuler une transaction
Bonne pratique : toujours tester tes requêtes UPDATE/DELETE avec un SELECT d'abord !