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 :
| Famille | Signification | Description | Commandes principales |
| DDL | Data Definition Language | Définit la structure de la base (le squelette). | CREATE, ALTER, DROP |
| DML | Data Manipulation Language | Manipule les données à l'intérieur des tables. | INSERT, UPDATE, DELETE |
| DQL | Data Query Language | Interroge et extrait les données. | SELECT |
| DCL | Data Control Language | Gè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 Colonne | Type de Donnée | Description & Contraintes |
| client_id | INT | Clé Primaire (PK), Identifiant unique, Auto-incrémenté. |
| nom | VARCHAR(100) | Nom complet, Obligatoire (NOT NULL). |
| VARCHAR(150) | Adresse email, Unique et Obligatoire. | |
| ville | VARCHAR(50) | Ville de résidence, Optionnel (peut être NULL). |
Table B : produits (Catalogue)
| Nom de Colonne | Type de Donnée | Description & Contraintes |
| produit_id | INT | Clé Primaire (PK), Auto-incrémenté. |
| nom_produit | VARCHAR(100) | Nom de l'article, Obligatoire. |
| prix | DECIMAL(10,2) | Prix unitaire, Obligatoire, doit être positif. |
| stock | INT | Quantité disponible, par défaut à 0. |
Table C : commandes (Historique d'achats)
| Nom de Colonne | Type de Donnée | Description & Contraintes |
| commande_id | INT | Clé Primaire (PK), Auto-incrémenté. |
| client_id | INT | Clé Étrangère (FK). Fait référence à client_id de la table clients. |
| date_cmd | DATE | Date de l'achat, Obligatoire. |
| total | DECIMAL(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.
-- 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 :
| Action | Description et Mise en garde | Exemple 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 | 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 | 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érateur | Description | Exemple SQL |
| SELECT * | Sélectionne toutes les colonnes. | SELECT * FROM produits; |
| SELECT col1, col2 | Sélectionne des colonnes spécifiques. | SELECT nom, email FROM clients; |
| WHERE | Filtre les résultats selon une condition. | SELECT * FROM produits WHERE prix > 500; |
AND / OR | Combine plusieurs conditions dans un WHERE. | SELECT * FROM clients WHERE ville = 'Paris' OR ville = 'Lyon'; |
| LIKE | Recherche de motifs (ex: commence par...). | SELECT * FROM clients WHERE nom LIKE 'M%'; (Noms commençant par M) |
| ORDER BY | Trie les résultats. ASC (croissant, défaut) ou DESC (décroissant). | SELECT nom_produit, prix FROM produits ORDER BY prix DESC; |
| LIMIT | Limite 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 :
| Fonction | Description | Exemple SQL (Question : Réponse) |
| COUNT(*) | Compte le nombre de lignes. |
(Combien de clients avons-nous ?) |
| SUM(colonne) | Calcule la somme d'une colonne numérique. |
(Quel est le chiffre d'affaires total ?) |
| AVG(colonne) | Calcule la moyenne d'une colonne. |
(Quel est le prix moyen d'un article ?) |
| GROUP BY | Regroupe les résultats pour les agrégations. Nécessaire si on mélange colonnes normales et fonctions d'agrégation. |
(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).
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 Join | Diagramme | Description |
| INNER JOIN | ∩ | Ne retourne que les lignes où il y a une correspondance dans les DEUX tables (l'intersection). |
| LEFT JOIN | ⊂ | Retourne 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ée | Commande SQL | Exemple concret |
| Ajouter une colonne | ALTER TABLE ... ADD COLUMN ... | Ajoutons un numéro de téléphone aux clients :
|
| 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 :
|
| Supprimer une colonne | ALTER TABLE ... DROP COLUMN ... | Supprimons la colonne 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 DCL | Description | Exemple SQL |
| 1. Créer un utilisateur | Cré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 :
|
| Validation | Sur 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
| Question | Réponse Correcte | Explication rapide |
| 1 | B | ALTER est la commande DDL pour modifier une structure existante. |
| 2 | D | DELETE FROM clients; sans WHERE supprime toutes les données de la table. C'est très dangereux. |
| 3 | B | BETWEEN valeur1 AND valeur2 est la syntaxe dédiée pour les intervalles inclusifs. |
| 4 | D | AVG signifie Average (Moyenne). |
| 5 | C | INNER JOIN ne garde que les lignes où la correspondance existe des deux côtés. |
| 6 | B | GRANT (accorder) est la commande DCL standard. |
| 7 | C | DESC signifie "DESCending" (décroissant). |
| 8 | C | Pour changer le type d'une colonne existante sans la renommer, on utilise MODIFY COLUMN (sur MySQL/MariaDB). |

Aucun commentaire:
Enregistrer un commentaire