LES REQUÊTES
SQL
Exposé complet — Du débutant à l'avancé
SELECT INSERT UPDATE DELETE JOIN GROUP BY
Mai 2026
Les Requêtes SQL — Exposé complet Page 2
Sommaire
1. Introduction au SQL
2. Structure d'une base de données
3. La requête SELECT
4. Filtrage avec WHERE
5. Tri et limitation (ORDER BY, LIMIT)
6. Les fonctions d'agrégation
7. Les JOIN — Jointures
8. Sous-requêtes
9. Requêtes de modification (INSERT, UPDATE, DELETE)
10. Création de tables (DDL)
11. Index et performances
12. Conseils et bonnes pratiques
© 2026 — Document pédagogique SQL
Les Requêtes SQL — Exposé complet Page 3
1. Introduction au SQL
Le SQL (Structured Query Language) est le langage standard utilisé pour communiquer avec les bases de
données relationnelles. Créé dans les années 1970 par IBM et normalisé par l'ANSI, il permet de stocker,
manipuler et récupérer des données de façon déclarative.
SQL se divise en plusieurs sous-langages :
DQL Data Query Language SELECT
DML Data Manipulation Language INSERT, UPDATE, DELETE
DDL Data Definition Language CREATE, ALTER, DROP
DCL Data Control Language GRANT, REVOKE
TCL Transaction Control Language COMMIT, ROLLBACK
2. Structure d'une base de données
Une base de données relationnelle est organisée en tables (aussi appelées relations). Chaque table est
composée de colonnes (attributs) et de lignes (enregistrements ou tuples).
Exemple : table employes
id nom departement salaire date_embauche
1 Alice Martin Informatique 52 000 € 2020-03-15
2 Bob Dupont Marketing 45 000 € 2019-07-01
3 Claire Morel Informatique 58 000 € 2018-01-20
4 David Roux Finance 61 000 € 2021-11-05
5 Emma Leroy Marketing 47 500 € 2022-04-18
3. La requête SELECT
La requête SELECT est la plus utilisée en SQL. Elle permet de lire et d'extraire des données depuis une
ou plusieurs tables.
Syntaxe générale
SELECT colonne1, colonne2, ...
FROM nom_table
WHERE condition
ORDER BY colonne [ASC | DESC]
LIMIT n;
Structure de base d'une requête SELECT
© 2026 — Document pédagogique SQL
Les Requêtes SQL — Exposé complet Page 4
Exemples pratiques
-- Sélectionner toutes les colonnes
SELECT * FROM employes;
-- Sélectionner des colonnes spécifiques
SELECT nom, salaire FROM employes;
-- Alias de colonnes
SELECT nom AS 'Nom complet', salaire AS 'Rémunération'
FROM employes;
-- Valeurs distinctes
SELECT DISTINCT departement FROM employes;
Exemples de requêtes SELECT
■ Conseil
Évitez SELECT * en production : listez explicitement les colonnes nécessaires pour améliorer les
performances et la lisibilité.
4. Filtrage avec WHERE
La clause WHERE filtre les lignes retournées selon une ou plusieurs conditions. Les opérateurs
disponibles sont nombreux :
Opérateur Description Exemple
= Égalité salaire = 52000
<>, != Différence departement != 'Finance'
<, >, <=, >= Comparaison salaire >= 50000
BETWEEN Intervalle inclusif salaire BETWEEN 40000 AND 60000
IN Liste de valeurs departement IN ('IT','RH')
LIKE Motif textuel nom LIKE 'A%'
IS NULL Valeur nulle manager IS NULL
AND / OR Combinaison logique ... AND ... OR ...
NOT Négation NOT (salaire > 60000)
-- Employés du département Informatique avec salaire > 50 000
SELECT nom, salaire
FROM employes
WHERE departement = 'Informatique'
AND salaire > 50000;
-- Noms commençant par 'A' ou 'C'
© 2026 — Document pédagogique SQL
Les Requêtes SQL — Exposé complet Page 5
SELECT nom FROM employes
WHERE nom LIKE 'A%' OR nom LIKE 'C%';
-- Salaires dans un intervalle
SELECT nom, salaire FROM employes
WHERE salaire BETWEEN 45000 AND 60000;
Exemples de filtrage WHERE
5. Tri et limitation
ORDER BY trie les résultats selon une ou plusieurs colonnes. LIMIT restreint le nombre de lignes
retournées (utile pour la pagination).
-- Trier par salaire décroissant
SELECT nom, salaire FROM employes
ORDER BY salaire DESC;
-- Multi-critères : département ASC, salaire DESC
SELECT nom, departement, salaire FROM employes
ORDER BY departement ASC, salaire DESC;
-- Les 3 mieux payés
SELECT nom, salaire FROM employes
ORDER BY salaire DESC
LIMIT 3;
-- Pagination : page 2 (enregistrements 6 à 10)
SELECT nom FROM employes
ORDER BY id
LIMIT 5 OFFSET 5;
Tri et pagination
6. Fonctions d'agrégation et GROUP BY
Les fonctions d'agrégation calculent une valeur unique à partir d'un ensemble de lignes. Elles s'utilisent
souvent avec GROUP BY pour regrouper les données, et HAVING pour filtrer les groupes.
Fonction Description
COUNT(*) Nombre total de lignes
COUNT(col) Lignes dont col n'est pas NULL
SUM(col) Somme des valeurs
AVG(col) Moyenne des valeurs
MIN(col) Valeur minimale
© 2026 — Document pédagogique SQL
Les Requêtes SQL — Exposé complet Page 6
MAX(col) Valeur maximale
-- Nombre total d'employés
SELECT COUNT(*) AS total FROM employes;
-- Salaire moyen par département
SELECT departement,
COUNT(*) AS nb_employes,
AVG(salaire) AS salaire_moyen,
MAX(salaire) AS salaire_max
FROM employes
GROUP BY departement;
-- Départements avec salaire moyen > 50 000
SELECT departement, AVG(salaire) AS moy
FROM employes
GROUP BY departement
HAVING AVG(salaire) > 50000
ORDER BY moy DESC;
Fonctions d'agrégation et GROUP BY / HAVING
■■ Attention — WHERE vs HAVING
WHERE filtre les lignes AVANT le regroupement. HAVING filtre les groupes APRÈS le regroupement. On
ne peut pas utiliser une fonction d'agrégation dans WHERE.
© 2026 — Document pédagogique SQL
Les Requêtes SQL — Exposé complet Page 7
7. Les JOIN — Jointures
Les jointures permettent de combiner des données provenant de plusieurs tables en les reliant via des
colonnes communes (généralement des clés étrangères).
Type Description
INNER JOIN Retourne uniquement les lignes correspondantes dans les deux tables
LEFT JOIN Toutes les lignes de la table gauche + correspondances à droite (NULL sinon)
RIGHT JOIN Toutes les lignes de la table droite + correspondances à gauche (NULL sinon)
FULL JOIN Toutes les lignes des deux tables (NULL où il n'y a pas de correspondance)
CROSS JOIN Produit cartésien : toutes les combinaisons possibles
-- Tables utilisées : employes et departements
-- departements : id, nom_dept, budget
-- INNER JOIN : employés avec leur département
SELECT [Link], d.nom_dept, [Link]
FROM employes e
INNER JOIN departements d ON e.departement_id = [Link];
-- LEFT JOIN : tous les employés, même sans département
SELECT [Link], d.nom_dept
FROM employes e
LEFT JOIN departements d ON e.departement_id = [Link];
-- Jointure multiple (3 tables)
SELECT [Link], d.nom_dept, [Link] AS projet
FROM employes e
INNER JOIN departements d ON e.departement_id = [Link]
INNER JOIN projets p ON p.responsable_id = [Link];
Exemples de jointures
8. Sous-requêtes (Subqueries)
Une sous-requête est une requête imbriquée dans une autre. Elle peut apparaître dans SELECT, FROM,
WHERE ou HAVING.
-- WHERE : employés gagnant plus que la moyenne
SELECT nom, salaire
FROM employes
WHERE salaire > (SELECT AVG(salaire) FROM employes);
© 2026 — Document pédagogique SQL
Les Requêtes SQL — Exposé complet Page 8
-- IN : employés dans des départements avec budget > 100 000
SELECT nom FROM employes
WHERE departement_id IN (
SELECT id FROM departements WHERE budget > 100000
);
-- EXISTS : vérifier l'existence
SELECT nom FROM employes e
WHERE EXISTS (
SELECT 1 FROM projets p WHERE p.responsable_id = [Link]
);
-- Sous-requête dans FROM (table dérivée)
SELECT dept, moy_salaire
FROM (SELECT departement AS dept, AVG(salaire) AS moy_salaire
FROM employes GROUP BY departement) AS stats
WHERE moy_salaire > 50000;
Exemples de sous-requêtes
9. Requêtes de modification
Le DML (Data Manipulation Language) permet d'insérer, modifier et supprimer des données.
INSERT — Insertion
-- Insérer une ligne
INSERT INTO employes (nom, departement, salaire, date_embauche)
VALUES ('Sophie Bernard', 'Informatique', 55000, '2024-09-01');
-- Insérer plusieurs lignes
INSERT INTO employes (nom, departement, salaire)
VALUES ('Paul Girard', 'RH', 42000),
('Lucie Blanc', 'Finance', 59000),
('Marc Noir', 'Marketing',48000);
-- Insérer depuis une autre table
INSERT INTO employes_archive
SELECT * FROM employes WHERE date_embauche < '2020-01-01';
UPDATE — Mise à jour
-- Augmenter le salaire d'un employé
UPDATE employes
SET salaire = 57000
© 2026 — Document pédagogique SQL
Les Requêtes SQL — Exposé complet Page 9
WHERE nom = 'Alice Martin';
-- Augmentation générale de 5% pour l'Informatique
UPDATE employes
SET salaire = salaire * 1.05
WHERE departement = 'Informatique';
DELETE — Suppression
-- Supprimer un enregistrement
DELETE FROM employes WHERE id = 5;
-- Supprimer selon une condition
DELETE FROM employes
WHERE date_embauche < '2018-01-01'
AND salaire < 40000;
-- Vider une table (TRUNCATE est plus rapide)
TRUNCATE TABLE employes_archive;
■■ Danger
Toujours inclure une clause WHERE dans UPDATE et DELETE. Sans WHERE, TOUTES les lignes de la
table sont modifiées ou supprimées ! Testez d'abord avec SELECT pour vérifier les enregistrements
ciblés.
© 2026 — Document pédagogique SQL
Les Requêtes SQL — Exposé complet Page 10
10. Création de tables (DDL)
-- Créer une table avec contraintes
CREATE TABLE employes (
id INT PRIMARY KEY AUTO_INCREMENT,
nom VARCHAR(100) NOT NULL,
email VARCHAR(200) UNIQUE,
departement VARCHAR(50),
salaire DECIMAL(10,2) DEFAULT 0.00,
date_embauche DATE,
manager_id INT,
FOREIGN KEY (manager_id) REFERENCES employes(id)
);
-- Modifier une table
ALTER TABLE employes ADD COLUMN telephone VARCHAR(20);
ALTER TABLE employes MODIFY salaire DECIMAL(12,2);
ALTER TABLE employes DROP COLUMN telephone;
-- Supprimer une table
DROP TABLE IF EXISTS employes_archive;
Définition de tables avec CREATE TABLE
11. Index et performances
Un index est une structure de données qui accélère les requêtes de lecture. Il est indispensable sur les
colonnes fréquemment utilisées dans WHERE, JOIN ou ORDER BY.
-- Créer un index simple
CREATE INDEX idx_departement ON employes(departement);
-- Index composite (plusieurs colonnes)
CREATE INDEX idx_dept_sal ON employes(departement, salaire);
-- Index unique
CREATE UNIQUE INDEX idx_email ON employes(email);
-- Supprimer un index
DROP INDEX idx_departement ON employes;
-- Analyser une requête
EXPLAIN SELECT * FROM employes WHERE departement = 'Finance';
Gestion des index
12. Bonnes pratiques
© 2026 — Document pédagogique SQL
Les Requêtes SQL — Exposé complet Page 11
■ Nommer clairement tables et colonnes (snake_case recommandé)
■ Lister explicitement les colonnes dans SELECT (éviter *)
■ Utiliser des alias lisibles (AS) pour les colonnes calculées
■ Toujours spécifier WHERE dans UPDATE et DELETE
■ Indenter et formater les requêtes longues pour la lisibilité
■ Utiliser des transactions (BEGIN/COMMIT) pour les opérations critiques
■ Créer des index sur les colonnes de jointures et de filtres fréquents
■ Utiliser EXPLAIN pour analyser et optimiser les requêtes lentes
■ Paramétrer les requêtes (requêtes préparées) pour éviter les injections SQL
■ Ne pas stocker des données multivaluées dans une seule colonne
■ Ne pas utiliser de noms réservés SQL comme noms de colonnes
■ Ne pas négliger les index sur les clés étrangères
■ Injection SQL — Sécurité critique
Ne jamais construire des requêtes SQL en concaténant directement des données utilisateur. Utilisez
toujours des requêtes paramétrées ou des ORM pour prévenir les attaques par injection SQL.
Ce document couvre les fondamentaux des requêtes SQL. Pour aller plus loin, explorez les CTE
(Common Table Expressions), les fonctions de fenêtrage (WINDOW FUNCTIONS), les procédures
stockées et les triggers.
© 2026 — Document pédagogique SQL