Tuto SQL complet : apprenez à maîtriser les bases de donnée
De SELECT à JOIN, en passant par les index et les sous-requêtes : apprenez le langage SQL étape par étape, avec des exemples concrets et visuels.
Système de Gestion de Base de Données
Un Système de Gestion de Base de Données (SGBD) est un logiciel qui permet de stocker des informations dans une base de données. Un tel système permet de lire, écrire, modifier, trier, transformer ou même imprimer les données qui sont contenues dans la base de données.
Parmi les logiciels les plus connus, il est possible de citer : MySQL, PostgreSQL, SQLite, Oracle Database, Microsoft SQL Server, Firebird ou Ingres.
Ce guide vous accompagne pas à pas pour comprendre et maîtriser le langage SQL, utilisé par tous ces systèmes, que vous soyez développeur, administrateur ou curieux de comprendre ce qui se cache derrière vos applications.
Qu’est-ce qu’un SGBD ?
Définition et rôle d’un SGBD
Un Système de Gestion de Base de Données (SGBD) est un logiciel qui stocke, structure et sécurise vos informations. Il répond au langage SQL pour créer, lire, mettre à jour ou supprimer des données.
⚠️ Sans SGBD, pas de site e-commerce, pas de gestion de stock, pas d’applications métier.
Les poids-lourds propriétaires
Oracle Database domine le marché des grandes entreprises avec des fonctionnalités de clustering et de reprise d’activité. Microsoft SQL Server s’intègre parfaitement aux écosystèmes .NET et Power BI. IBM Db2 reste incontournable dans les banques et l’industrie. Ces solutions sont payantes par cœur CPU ou par utilisateur ; comptez plusieurs milliers d’euros par an.
Les champions du libre
MySQL est le plus répandu : il alimente plus de 40 % des sites mondiaux. MariaDB en est un fork 100 % compatible mais plus rapide grâce au moteur Aria. PostgreSQL excelle en conformité SQL et extensibilité. SQLite tient dans un fichier unique : idéal pour applications mobiles ou tests unitaires.
💡 Tous ces moteurs répondent aux mêmes ordres SQL présentés ci-dessous ; seule la syntaxe des fonctions avancées varie.
Les fondamentaux du SELECT
SELECT, DISTINCT, SQL_NO_CACHE
La commande SELECT permet de lire des colonnes. Ajoutez DISTINCT pour éliminer les doublons ou SQL_NO_CACHE (MySQL) pour forcer le moteur à ne pas utiliser le cache et ainsi mesurer le temps réel d’exécution.
SELECT DISTINCT ville FROM clients;
💡 Toujours préciser les colonnes nécessaires ; évitez SELECT * en production.
Alias et LIMIT
Renommez une colonne avec AS et limitez le nombre de lignes retournées via LIMIT (MySQL, PostgreSQL) ou TOP (SQL Server).
SELECT nom AS client_name
FROM commandes
LIMIT 50;
Filtrer ses données avec WHERE
AND, OR, IN, BETWEEN
Combinez plusieurs critères avec AND (tout vrai) ou OR (au moins un vrai). IN remplace plusieurs OR et BETWEEN définit une plage inclusive.
SELECT * FROM produits
WHERE prix BETWEEN 100 AND 500
AND categorie IN ('Livres','DVD');
LIKE et wildcards
% remplace une chaîne de longueur quelconque, _ un seul caractère. Pratique pour les recherches approximatives.
SELECT nom FROM clients
WHERE nom LIKE 'Pro%';
✅ Indexez la colonne ou passez à FULLTEXT pour éviter un scan complet.
Agréger des données avec GROUP BY
GROUP BY et fonctions d’agrégation
Réunissez les lignes ayant une même valeur puis appliquez COUNT(), SUM(), AVG(), MIN(), MAX().
SELECT ville, COUNT(*) AS nb_clients
FROM clients
GROUP BY ville;
WITH ROLLUP
Ajoute une ligne « total général » après les sous-totaux.
SELECT ville, SUM(ca) AS total
FROM ventes
GROUP BY ville WITH ROLLUP;
✅ ROLLUP est disponible dans MySQL, PostgreSQL (GROUPING SETS) et Oracle.
Trier et paginer avec ORDER BY & LIMIT
Tri simple et multicritères
ORDER BY classe les lignes selon une ou plusieurs colonnes, croissant (ASC) ou décroissant (DESC).
SELECT * FROM produits
ORDER BY categorie ASC, prix DESC;
LIMIT & OFFSET
Parfait pour la pagination : LIMIT 20 OFFSET 40 renvoie la 3ᵉ page de 20 lignes.
💡 Combinez toujoursORDER BYavecLIMITsans quoi le tri est non déterministe.
Combiner plusieurs tables : les JOIN
INNER JOIN
Ne retient que les lignes qui ont un correspondant dans les deux tables.
SELECT c.nom, COUNT(co.id) AS nb_cmd
FROM clients c
INNER JOIN commandes co ON c.id = co.client_id
GROUP BY c.nom;
LEFT / RIGHT / FULL
LEFT JOIN garde toutes les lignes de la table de gauche, même sans correspondance. FULL JOIN (PostgreSQL, SQL Server) combine LEFT et RIGHT.
🚫 MySQL ne connaît pas FULL JOIN ; utilisez UNION de LEFT et RIGHT.
Sous-requêtes et EXISTS
EXISTS corrélé
Teste l’existence d’une ligne sans renvoyer de données ; souvent plus rapide qu’un IN sur gros volume.
SELECT nom FROM clients c
WHERE EXISTS (SELECT 1
FROM commandes co
WHERE co.client_id = c.id);
ALL / ANY
> ALL() signifie « supérieur à chaque valeur retournée ». ANY (ou SOME) est vrai dès qu’au moins une valeur correspond.
SELECT * FROM produits
WHERE prix > ALL (SELECT prix FROM produits WHERE promo = 0);
Accélérer avec les INDEX
CREATE INDEX
Un index B+ réduit drastiquement le nombre de pages lues. Créez-le sur les colonnes fréquemment filtrées ou jointes.
CREATE INDEX idx_prix ON produits(prix);
💡 Sur WordPress, indexezwp_postmeta.meta_keyetmeta_valuepour accélérer les requêtes ACF.
EXPLAIN et OPTIMIZE
EXPLAIN (MySQL) ou EXPLAIN (ANALYZE) (PostgreSQL) affiche le plan d’exécution. Surveillez le type ALL (scan intégral) et la colonne rows.
EXPLAIN SELECT * FROM produits WHERE prix = 150;
MySQL offre aussi OPTIMIZE TABLE pour défragmenter les index et recalculer les statistiques.
Créer, modifier, supprimer : DDL & DML
CREATE TABLE & clés
Définissez la structure, les types et les contraintes : PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK.
CREATE TABLE clients (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT, UPDATE, DELETE
Insérez des lignes avec INSERT INTO … VALUES ou INSERT … SELECT. Modifiez via UPDATE … WHERE et supprimez avec DELETE … WHERE. Oubliez le WHERE et c’est la cata !
⚠️ Toujours effectuer unSELECTavant leUPDATE/DELETEpour vérifier le scope.
Besoin d’un audit SQL de votre base de données ?
Chez Pro-Dig-It, nous optimisons vos requêtes SQL, configurons vos index et réduisons le temps de réponse de vos applications. Disponible du lundi au samedi, 8 h-19 h.