Breaking

jeudi 12 février 2026

Cours de SQL Structuré : De la Théorie à la Pratique


Cours de SQL Structuré : De la Théorie à la Pratique

1. Introduction au SQL

SQL (Structured Query Language) est le langage standard pour interagir avec les bases de données relationnelles. Il est divisé en plusieurs sous-familles de commandes selon l'objectif visé.

Tableau des familles de commandes SQL :

FamilleSignificationDescriptionCommandes principales
DDLData Definition LanguageDéfinit la structure de la base (le squelette).CREATE, ALTER, DROP
DMLData Manipulation LanguageManipule les données à l'intérieur des tables.INSERT, UPDATE, DELETE
DQLData Query LanguageInterroge et extrait les données.SELECT
DCLData Control LanguageGère la sécurité et les droits d'accès.GRANT, REVOKE

2. Scénario Pratique et Schéma de la Base de Données

Pour ce cours, nous allons gérer une petite Boutique en Ligne. Nous avons besoin de trois tables : les clients, les produits, et les commandes qui relient les deux.

Voici le schéma relationnel que nous allons utiliser pour tous les exemples.

Table A : clients (Liste des utilisateurs)

Nom de ColonneType de DonnéeDescription & Contraintes
client_idINTClé Primaire (PK), Identifiant unique, Auto-incrémenté.
nomVARCHAR(100)Nom complet, Obligatoire (NOT NULL).
emailVARCHAR(150)Adresse email, Unique et Obligatoire.
villeVARCHAR(50)Ville de résidence, Optionnel (peut être NULL).

Table B : produits (Catalogue)

Nom de ColonneType de DonnéeDescription & Contraintes
produit_idINTClé Primaire (PK), Auto-incrémenté.
nom_produitVARCHAR(100)Nom de l'article, Obligatoire.
prixDECIMAL(10,2)Prix unitaire, Obligatoire, doit être positif.
stockINTQuantité disponible, par défaut à 0.

Table C : commandes (Historique d'achats)

Nom de ColonneType de DonnéeDescription & Contraintes
commande_idINTClé Primaire (PK), Auto-incrémenté.
client_idINTClé Étrangère (FK). Fait référence à client_id de la table clients.
date_cmdDATEDate de l'achat, Obligatoire.
totalDECIMAL(10,2)Montant total de la commande, Obligatoire.

3. Module DDL : Création de la structure

Voici les commandes pour créer les tables définies ci-dessus.

SQL
-- Création des tables
CREATE TABLE clients (
    client_id INT AUTO_INCREMENT PRIMARY KEY,
    nom VARCHAR(100) NOT NULL,
    email VARCHAR(150) UNIQUE NOT NULL,
    ville VARCHAR(50)
);

CREATE TABLE produits (
    produit_id INT AUTO_INCREMENT PRIMARY KEY,
    nom_produit VARCHAR(100) NOT NULL,
    prix DECIMAL(10,2) NOT NULL CHECK (prix > 0),
    stock INT DEFAULT 0
);

CREATE TABLE commandes (
    commande_id INT AUTO_INCREMENT PRIMARY KEY,
    client_id INT NOT NULL,
    date_cmd DATE NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (client_id) REFERENCES clients(client_id)
);

4. Module DML : Manipulation des données

Ce module couvre l'ajout, la modification et la suppression des données.

Tableau des opérations DML :

ActionDescription et Mise en gardeExemple SQL

INSERT


(Insertion)

Ajoute de nouvelles lignes dans une table. Il faut respecter l'ordre des colonnes ou les spécifier.sql : INSERT INTO clients (nom, email, ville) VALUES ('Jean Dupont', 'jean@mail.com', 'Paris'), ('Marie Curie', 'marie@science.org', 'Lyon');
sql : INSERT INTO produits (nom_produit, prix, stock) VALUES ('Laptop X1', 1200.00, 10), ('Clavier Pro', 150.00, 50);

UPDATE


(Mise à jour)

Modifie des données existantes.


⚠️ Attention : Sans la clause WHERE, toutes les lignes de la table seront modifiées !

sql -- Le produit ID 2 augmente son prix : UPDATE produits SET prix = 175.00 WHERE produit_id = 2;

DELETE


(Suppression)

Supprime des lignes existantes.


⚠️ Attention : Sans la clause WHERE, toutes les données de la table seront effacées !

sql -- Supprime le client qui a l'email spécifié: DELETE FROM clients WHERE email = 'jean@mail.com';

5. Module DQL : Sélection et Interrogation

C'est le cœur de SQL : poser des questions à la base de données.

5.1. Sélections de base et Filtrage

Tableau des clauses de sélection :

Clause / OpérateurDescriptionExemple SQL
SELECT *Sélectionne toutes les colonnes.SELECT * FROM produits;
SELECT col1, col2Sélectionne des colonnes spécifiques.SELECT nom, email FROM clients;
WHEREFiltre les résultats selon une condition.SELECT * FROM produits WHERE prix > 500;
AND / ORCombine plusieurs conditions dans un WHERE.SELECT * FROM clients WHERE ville = 'Paris' OR ville = 'Lyon';
LIKERecherche de motifs (ex: commence par...).SELECT * FROM clients WHERE nom LIKE 'M%'; (Noms commençant par M)
ORDER BYTrie les résultats. ASC (croissant, défaut) ou DESC (décroissant).SELECT nom_produit, prix FROM produits ORDER BY prix DESC;
LIMITLimite le nombre de résultats retournés.SELECT * FROM commandes ORDER BY date_cmd DESC LIMIT 5; (Les 5 dernières commandes)

5.2. Fonctions d'Agrégation (Calculs)

Ces fonctions permettent de faire des statistiques sur un ensemble de données.

Tableau des agrégations :

FonctionDescriptionExemple SQL (Question : Réponse)
COUNT(*)Compte le nombre de lignes.

SELECT COUNT(*) FROM clients;


(Combien de clients avons-nous ?)

SUM(colonne)Calcule la somme d'une colonne numérique.

SELECT SUM(total) FROM commandes;


(Quel est le chiffre d'affaires total ?)

AVG(colonne)Calcule la moyenne d'une colonne.

SELECT AVG(prix) FROM produits;


(Quel est le prix moyen d'un article ?)

GROUP BYRegroupe les résultats pour les agrégations. Nécessaire si on mélange colonnes normales et fonctions d'agrégation.

SELECT ville, COUNT(*) FROM clients GROUP BY ville;


(Combien de clients par ville ?)

5.3. Les Jointures (JOINS)

Les jointures permettent de combiner les données de plusieurs tables en utilisant leurs clés (PK et FK).

Exemple : Nous voulons le nom du client (table clients) et le total de sa commande (table commandes).

SQL
SELECT clients.nom, commandes.date_cmd, commandes.total
FROM clients
INNER JOIN commandes ON clients.client_id = commandes.client_id;

Types de jointures courantes :

Type de JoinDiagrammeDescription
INNER JOINNe retourne que les lignes où il y a une correspondance dans les DEUX tables (l'intersection).
LEFT JOINRetourne TOUTES les lignes de la table de gauche (la première citée), même s'il n'y a pas de correspondance à droite (les valeurs manquantes seront NULL).

6. Module Gestion de Structure (DDL Avancé)

Comment modifier une table une fois qu'elle est créée et contient des données ? On utilise ALTER TABLE.

Tableau des modifications de structure :

Action souhaitéeCommande SQLExemple concret
Ajouter une colonneALTER TABLE ... ADD COLUMN ...

Ajoutons un numéro de téléphone aux clients :


ALTER TABLE clients ADD COLUMN telephone VARCHAR(20);

Modifier une colonne existante (Changer le type ou la taille)ALTER TABLE ... MODIFY COLUMN ... (Syntaxe MySQL/MariaDB)

Agrandissons le champ 'nom_produit' à 255 caractères :


ALTER TABLE produits MODIFY COLUMN nom_produit VARCHAR(255) NOT NULL;

Supprimer une colonneALTER TABLE ... DROP COLUMN ...

Supprimons la colonne ville :


ALTER TABLE clients DROP COLUMN ville;


7. Module Sécurité (DCL)

La gestion des utilisateurs et des permissions est cruciale pour sécuriser les données. On évite d'utiliser l'utilisateur "root" pour les applications.

Tableau de gestion des permissions :

Action DCLDescriptionExemple SQL
1. Créer un utilisateurCrée un compte avec un mot de passe, souvent restreint à un hôte spécifique (localhost).CREATE USER 'stagiaire'@'localhost' IDENTIFIED BY 'MotDePasse_TRES_Securise!';
2. Donner une permission (GRANT)Accorde des droits spécifiques (SELECT, INSERT...) sur des objets spécifiques (base.table) à un utilisateur.

Donnons au stagiaire le droit de seulement lire les produits :


GRANT SELECT ON ma_boutique.produits TO 'stagiaire'@'localhost';

ValidationSur MySQL, il faut souvent recharger les droits pour qu'ils prennent effet immédiatement.FLUSH PRIVILEGES;
3. Révoquer une permission (REVOKE)Retire un droit précédemment accordé.REVOKE SELECT ON ma_boutique.produits FROM 'stagiaire'@'localhost';


QCM de Validation

Vérifiez vos connaissances. Une seule bonne réponse par question.

1. Quelle commande permet de modifier la STRUCTURE d'une table (par exemple, ajouter une colonne) ?

A. UPDATE TABLE

B. ALTER TABLE

C. MODIFY TABLE

D. CHANGE TABLE

2. Vous voulez supprimer un client spécifique. Quelle est la commande DANGEREUSE car incomplète ?

A. DELETE FROM clients WHERE client_id = 5;

B. REMOVE FROM clients WHERE client_id = 5;

C. DELETE * FROM clients;

D. DELETE FROM clients;

3. Comment sélectionner tous les produits dont le prix est compris entre 100 et 500 euros inclus ?

A. SELECT * FROM produits WHERE prix > 100 OR prix < 500;

B. SELECT * FROM produits WHERE prix BETWEEN 100 AND 500;

C. SELECT * FROM produits WHERE prix => 100 AND prix <= 500;

D. SELECT * FROM produits WHERE prix IN (100, 500);

4. Quelle fonction d'agrégation permet de calculer la moyenne des prix ?

A. SUM(prix)

B. COUNT(prix)

C. MEAN(prix)

D. AVG(prix)

5. Pour obtenir la liste des commandes avec le nom du client associé, quel type de jointure est le plus standard pour n'avoir que les commandes liées à un client existant ?

A. OUTER JOIN

B. LEFT JOIN

C. INNER JOIN

D. CROSS JOIN

6. Laquelle de ces commandes est utilisée pour donner des droits d'accès à un utilisateur ?

A. ALLOW

B. GRANT

C. ACCESS

D. PERMIT

7. Dans la requête suivante, à quoi sert le DESC ?

SELECT * FROM commandes ORDER BY date_cmd DESC;

A. À décrire la structure de la table.

B. À trier les dates de la plus ancienne à la plus récente.

C. À trier les dates de la plus récente à la plus ancienne (descendant).

D. C'est une erreur de syntaxe.

8. Si vous souhaitez modifier le type d'une colonne "description" existante de VARCHAR(100) à TEXT, quelle commande utilisez-vous (syntaxe MySQL) ?

A. ALTER TABLE articles ADD COLUMN description TEXT;

B. UPDATE TABLE articles SET description = TEXT;

C. ALTER TABLE articles MODIFY COLUMN description TEXT;

D. CHANGE COLUMN description TEXT FROM articles;


Réponses du QCM

QuestionRéponse CorrecteExplication rapide
1BALTER est la commande DDL pour modifier une structure existante.
2DDELETE FROM clients; sans WHERE supprime toutes les données de la table. C'est très dangereux.
3BBETWEEN valeur1 AND valeur2 est la syntaxe dédiée pour les intervalles inclusifs.
4DAVG signifie Average (Moyenne).
5CINNER JOIN ne garde que les lignes où la correspondance existe des deux côtés.
6BGRANT (accorder) est la commande DCL standard.
7CDESC signifie "DESCending" (décroissant).
8CPour changer le type d'une colonne existante sans la renommer, on utilise MODIFY COLUMN (sur MySQL/MariaDB).

Aucun commentaire:

Enregistrer un commentaire