SQL et Bases de Données Relationnelles

Classe SDA 7 2025-2026

Quiz 2 - Modules 4, 5 et 6

Le Scénario : Une Boutique en Ligne

Imaginez que vous êtes le développeur en charge de la base de données d'une petite boutique en ligne. Votre base de données contient des informations sur les Clients, les Produits qu'ils achètent, et les Commandes qu'ils passent.

Mise en Place : Le Code SQL pour Créer et Remplir les Tables

Avant de commencer les exercices, exécutez ce code SQL dans votre SGBD (MySQL, PostgreSQL, SQLite, etc.) pour créer la structure et insérer les données de départ.

-- Création de la table des clients CREATE TABLE Clients ( id INT PRIMARY KEY AUTO_INCREMENT, nom VARCHAR(100) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, ville VARCHAR(100) ); -- Création de la table des produits CREATE TABLE Produits ( id INT PRIMARY KEY AUTO_INCREMENT, nom_produit VARCHAR(150) NOT NULL, categorie VARCHAR(50), prix DECIMAL(10, 2) NOT NULL ); -- Création de la table des commandes CREATE TABLE Commandes ( id INT PRIMARY KEY AUTO_INCREMENT, client_id INT, date_commande DATE, montant_total DECIMAL(10, 2), FOREIGN KEY (client_id) REFERENCES Clients(id) ); -- Insertion des données initiales INSERT INTO Clients (nom, email, ville) VALUES ('Alice Martin', 'alice@example.com', 'Paris'), ('Bob Durand', 'bob@example.com', 'Lyon'), ('Charlie Dupont', 'charlie@example.com', 'Marseille'), ('Diane Leroy', 'diane@example.com', 'Paris'); INSERT INTO Produits (nom_produit, categorie, prix) VALUES ('Livre SQL pour Débutants', 'Livres', 25.50), ('Clavier Mécanique', 'Électronique', 120.00), ('Souris Ergonomique', 'Électronique', 45.99), ('Tasse à Café', 'Maison', 12.00), ('Stylo Plume', 'Fournitures', 55.00); INSERT INTO Commandes (client_id, date_commande, montant_total) VALUES (1, '2024-01-15', 145.50), (2, '2024-01-17', 12.00), (1, '2024-02-05', 55.00), (4, '2024-02-12', 45.99), (2, '2024-03-21', 145.50);

Module 4 : Les Jointures

Objectif : Maîtriser INNER JOIN et LEFT JOIN pour combiner les données de plusieurs tables.

Question 4.1
Quelle requête affiche le nom du client et la date pour chaque commande ?
Réponse correcte : b) SELECT c.nom, cmd.date_commande FROM Clients c INNER JOIN Commandes cmd ON c.id = cmd.client_id;
Question 4.2
En supposant que Details_Commande est remplie, comment voir les produits de la commande 1 ?
Réponse correcte : a) SELECT p.nom_produit FROM Produits p JOIN Details_Commande dc ON p.id = dc.produit_id WHERE dc.commande_id = 1;
Question 4.3
Comment lister tous les clients, même ceux sans commande ?
Réponse correcte : c) SELECT c.nom, cmd.date_commande FROM Clients c LEFT JOIN Commandes cmd ON c.id = cmd.client_id;
Question 4.4
Quelle requête permet d'afficher le nom du client, la date de la commande, le nom du produit, et la quantité pour chaque entrée dans Details_Commande ?
Réponse correcte : b) Triple jointure complète.

Module 5 : Agrégation et Groupement

Objectif : Utiliser les fonctions d'agrégation et GROUP BY pour transformer les données brutes en analyses.

Question 5.1a
Quelle requête permet de trouver le nombre total de produits dans la table Produits ?
Réponse correcte : b) SELECT COUNT(*) FROM Produits;
Question 5.1b
Quelle requête calcule le prix moyen des produits ?
Réponse correcte : b) SELECT AVG(prix) FROM Produits;
Question 5.2
Comment compter le nombre de produits dans chaque catégorie ?
Réponse correcte : c) SELECT categorie, COUNT(id) FROM Produits GROUP BY categorie;
Question 5.3
Comment calculer le chiffre d'affaires total par client ?
Réponse correcte : a) SELECT c.nom, SUM(cmd.montant_total) FROM Clients c JOIN Commandes cmd ON c.id = cmd.client_id GROUP BY c.nom;
Question 5.4
Comment n'afficher que les clients ayant dépensé plus de 100€ ?
Réponse correcte : b) ... HAVING SUM(montant_total) > 100;

Module 6 : Optimisation des Requêtes

Objectif : Comprendre l'impact des index sur la performance.

Question 6.1
Vous exécutez EXPLAIN SELECT * FROM Clients WHERE email = 'alice@example.com'; sur la table initiale (sans index supplémentaire). Quel type d'opération le plan d'exécution affichera-t-il probablement ?
Réponse correcte : b) FULL TABLE SCAN
Résultat du Quiz