Tuto SQL

Tuto SQL complet : apprenez à maîtriser les bases de donnée

Tuto SQL complet : apprenez à maîtriser les bases de données

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 ?

Comparatif SGBD libres et propriétaires SGBD relationnels : licences & usages Libres & Open Source • MySQL – Web, WordPress • MariaDB – Fork MySQL • PostgreSQL – Robustesse • Firebird – Embarqué • SQLite – Mobile/IoT • Apache Derby – Java Propriétaires • Oracle Database – ERP • Microsoft SQL Server – BI • IBM Db2 – Big Blue • SAP MaxDB – SAP • 4D – RAD Mac/Win • FileMaker – PME Apple Choisissez en fonction de la volumétrie, la haute disponibilité et votre budget

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

Flux d’un SELECT avec DISTINCT et LIMIT Exécution d’un SELECT simplifié 1. Requête SELECT DISTINCT nom FROM clients 2. Scan table Lignes candidates (avec ou sans index) 3. DISTINCT Suppression doublons 4. LIMIT Retour 10 lignes Résultat final

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

Opérateurs WHERE : AND, OR, IN, BETWEEN, LIKE, IS NULL Filtrer avec WHERE : les 6 opérateurs incontournables AND Toutes conditions vraies OR Au moins une vraie IN Liste de valeurs BETWEEN Plage incluse LIKE Motif % _ IS NULL Valeur manquante Exemples concrets prix BETWEEN 100 AND 500 ville IN ('Paris','Lyon') nom LIKE 'Pro%' email IS NOT NULL stock > 0 AND promo = 1 Wildcards LIKE : % (chaîne) _ (1 car.) 'Pro%' commence par Pro | '%dig%' contient dig | '_oogle' 6 lettres finissant par oogle

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

Flux GROUP BY + WITH ROLLUP + HAVING Agrégation GROUP BY & ROLLUP Table ventes Paris 300 Lyon 200 Paris 100 Lyon 400 GROUP BY ville Paris 400 Lyon 600 Total 1000 HAVING SUM > 500 Lyon 600 WITH ROLLUP Ligne total général

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

ORDER BY ASC/DESC + LIMIT OFFSET Tri & pagination ORDER BY / LIMIT Avant tri id 3 prix 700 id 1 prix 200 id 4 prix 500 id 2 prix 300 id 5 prix 900 ORDER BY prix DESC id 5 prix 900 id 3 prix 700 id 4 prix 500 id 2 prix 300 id 1 prix 200 LIMIT 2 OFFSET 1 id 3 prix 700 id 4 prix 500 Page 2 / 3 lignes

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 toujours ORDER BY avec LIMIT sans quoi le tri est non déterministe.

Combiner plusieurs tables : les JOIN

Schéma des 7 types de JOIN Les 7 JOIN SQL visuellement Table A Table B INNER : intersection A∩B LEFT : A complet + match B RIGHT : B complet + match A FULL : A union B (NULL si absent) CROSS : produit cartésien A×B SELF : A jointe à elle-même NATURAL : JOIN sur noms identiques Choisissez le JOIN adapté pour ne pas perdre de lignes ni multiplier inutilement.

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

Sous-requête corrélation EXISTS vs IN Sous-requêtes : EXISTS plus rapide que IN ? SELECT nom FROM clients c WHERE … EXISTS (SELECT 1 FROM commandes co WHERE co.client_id = c.id) Arrêt dès la 1ᵉ ligne trouvée → index unique suffisant IN (SELECT client_id FROM commandes) Construit la liste complète puis filtre → plus gourmand Résultat identique, performance différente : testez avec EXPLAIN

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

Arbre B+ d’un index vs scan séquentiel Index B+ : 3 niveaux vs scan table 10 000 pages Scan table Page 1 … 10 000 Lectures : 10 000 Temps : 2 s Arbre B+ Racine → 1 page Nœuds → 3 pages Feuilles → 4 pages Temps : 5 ms Gain x400 CPU ↓ 99 % IO ↓ 99 % Utilisateur heureux

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, indexez wp_postmeta.meta_key et meta_value pour 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

Diagramme CREATE → ALTER → DROP vs INSERT → UPDATE → DELETE DDL vs DML : deux familles distinctes DDL (Data Definition) CREATE DATABASE / TABLE ALTER TABLE … ADD COLUMN DROP TABLE / DATABASE TRUNCATE (vide structure) DML (Data Manipulation) INSERT INTO … VALUES … UPDATE … SET … WHERE … DELETE … WHERE … MERGE (UPSERT) Impact structure : rollback difficile Impact données : rollback possible (transaction)

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 un SELECT avant le UPDATE/DELETE pour 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.

Optimiser mon SQL maintenant Demander un audit SQL gratuit

Publications similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *