Objectif : Découvrir pourquoi les bases de données remplacent avantageusement les fichiers tableurs (CSV), comprendre l'architecture du modèle relationnel (clés primaires et étrangères) et maîtriser l'écriture de requêtes SQL (sélection, filtrage, calculs, jointures, modifications).
Lors de notre TP précédent sur le fichier catalogue_films.csv, nous avons manipulé des données dans un tableur. Mais imaginez une plateforme comme Netflix, Spotify ou Pronote avec des millions d'utilisateurs simultanés. Un simple fichier CSV ou Excel montre immédiatement ses faiblesses critiques :
Pour résoudre ces problèmes, l'informatique utilise des Bases de Données Relationnelles (BDD) pilotées par un logiciel spécialisé appelé SGBD (Système de Gestion de Bases de Données) : PostgreSQL, MySQL, Oracle, SQLite, MariaDB.
Inventé en 1970 par Edgar F. Codd (chercheur chez IBM), le modèle relationnel repose sur une idée de génie : séparer les données dans plusieurs tables spécialisées et créer des liens (relations) entre elles.
Client, la table Commande).nom, annee_naissance, prix).Eleve(id_eleve: INT, nom: TEXT, prenom: TEXT).C'est le mécanisme central qui garantit l'intégrité des données :
@1 Cas pratique de modélisation :
Un lycée souhaite gérer ses classes et ses élèves.
- On crée une table Classe avec les attributs : id_classe (clé primaire) et nom_classe (ex: "Terminale 3").
- On crée une table Eleve avec les attributs : id_eleve (clé primaire), nom, prenom.
Quel attribut doit-on ajouter à la table Eleve pour savoir dans quelle classe se trouve chaque élève sans dupliquer le nom de la classe ? Comment qualifie-t-on cet attribut ?
(Contenu masqué)
Pour interroger et manipuler une base, on utilise le langage déclaratif universel SQL (Structured Query Language).
SELECTSELECT prenom, nom
FROM Eleve
WHERE prenom = 'Alice'
ORDER BY nom ASC;
SELECT : les colonnes à afficher (* pour afficher toutes les colonnes).FROM : la table ciblée.WHERE : les conditions de filtrage (=, <>, >, <, AND, OR, NOT, BETWEEN, LIKE).ORDER BY : trier le résultat (ASC croissant, DESC décroissant).INSERT INTOINSERT INTO Eleve (id_eleve, nom, prenom, id_classe)
VALUES (15, 'Curie', 'Marie', 2);
UPDATEUPDATE Eleve
SET nom = 'Sklodowska-Curie'
WHERE id_eleve = 15;
⚠️ ATTENTION : Si vous oubliez la clause
WHERE, tous les élèves de la table prendront ce nom !
DELETEDELETE FROM Eleve
WHERE id_eleve = 15;
⚠️ ATTENTION : Sans clause
WHERE, vous videz intégralement la table !
@2 Écrivez la requête SQL permettant de récupérer uniquement le titre et l'annee de tous les films sortis strictement après 2015, triés du plus récent au plus vieux.
(Contenu masqué)
Sur LibreOffice Calc, nous écrivions =MOYENNE(G2:G2001) ou =NB(A2:A2001). En SQL, ces opérations statistiques se font directement dans le SELECT :
COUNT(*) : compte le nombre total de lignes retournées.AVG(attribut) : calcule la moyenne numérique d'une colonne.SUM(attribut) : calcule la somme totale.MIN(attribut) et MAX(attribut) : renvoie la valeur minimale ou maximale.-- Exemple : calculer la note moyenne et le nombre de films sortis en 2020
SELECT COUNT(*), AVG(note)
FROM Film
WHERE annee = 2020;
JOIN ... ON ...)C'est la commande la plus puissante du SQL. Lorsque nos informations sont réparties entre deux tables reliées, comment reconstituer l'information complète dans un seul tableau ? Réponse : la jointure !
SELECT Eleve.nom, Eleve.prenom, Classe.nom_classe
FROM Eleve
JOIN Classe ON Eleve.id_classe = Classe.id_classe;
FROM Eleve : on part de la première table.JOIN Classe : on la fusionne avec la seconde table.ON Eleve.id_classe = Classe.id_classe : la condition de jointure (on associe les lignes où la clé étrangère de l'élève est égale à la clé primaire de la classe).Pour cette séance pratique, nous n'avons rien à installer sur les ordinateurs. Nous utilisons un simulateur SGBD complet dans le navigateur : SQLiteOnline.
🌐 Rendez-vous sur : sqliteonline.com
Effacez le texte présent dans la fenêtre principale, copiez-collez l'intégralité du script SQL ci-dessous, puis cliquez sur le bouton vert "Run" :
-- Création des tables
CREATE TABLE Artiste (
id_artiste INTEGER PRIMARY KEY,
nom TEXT,
pays TEXT
);
CREATE TABLE Album (
id_album INTEGER PRIMARY KEY,
titre TEXT,
annee INTEGER,
genre TEXT,
id_artiste INTEGER,
FOREIGN KEY(id_artiste) REFERENCES Artiste(id_artiste)
);
-- Insertion des artistes
INSERT INTO Artiste VALUES (1, 'Daft Punk', 'France');
INSERT INTO Artiste VALUES (2, 'Orelsan', 'France');
INSERT INTO Artiste VALUES (3, 'Queen', 'Royaume-Uni');
INSERT INTO Artiste VALUES (4, 'Stromae', 'Belgique');
INSERT INTO Artiste VALUES (5, 'Billie Eilish', 'USA');
-- Insertion des albums
INSERT INTO Album VALUES (101, 'Discovery', 2001, 'Electro', 1);
INSERT INTO Album VALUES (102, 'Random Access Memories', 2013, 'Electro', 1);
INSERT INTO Album VALUES (103, 'Civilisation', 2021, 'Rap', 2);
INSERT INTO Album VALUES (104, 'Perdu d''avance', 2009, 'Rap', 2);
INSERT INTO Album VALUES (105, 'A Night at the Opera', 1975, 'Rock', 3);
INSERT INTO Album VALUES (106, 'Racine carrée', 2013, 'Pop', 4);
INSERT INTO Album VALUES (107, 'Cheese', 2010, 'Pop', 4);
INSERT INTO Album VALUES (108, 'Happier Than Ever', 2021, 'Pop', 5);
Effacez la console SQL et résolvez les défis suivants en écrivant la requête adaptée. Cliquez sur Run pour tester votre résultat !
@3 Défi 1 (Sélection simple) : Affichez la liste de tous les albums (titre, année, genre) sortis strictement après 2010, classés par année croissante.
(Contenu masqué)
@4 Défi 2 (Agrégation) :
Combien d'albums dans notre base sont du genre 'Pop' ?
Écrivez la requête qui calcule ce nombre automatiquement.
(Contenu masqué)
@5 Défi 3 (Première Jointure) : Affichez pour chaque album : son titre, son année de sortie ainsi que le nom de l'artiste qui l'a composé.
(Contenu masqué)
@6 Défi 4 (Jointure + Filtre) :
Affichez tous les titres d'albums composés par des artistes dont le pays est la 'France'.
(Contenu masqué)
@7 Défi 5 (Modification avec UPDATE) :
Orelsan a sorti un nouvel album ou on a fait une faute dans l'année de l'album 'Civilisation' (qui est bien sorti en 2021, mais imaginons qu'on veuille modifier son genre pour mettre 'Hip-Hop' au lieu de 'Rap').
Écrivez la requête SQL de mise à jour pour effectuer cette modification.
(Contenu masqué)
@8 Défi 6 (Défi Expert) :
Quel est le titre de l'album le plus ancien de toute notre base, son année et le nom de son groupe/artiste ?
(Indice : vous pouvez combiner une jointure, un tri ORDER BY ... ASC et la clause LIMIT 1).
(Contenu masqué)