But de la séance. Comprendre le sens des requêtes avant de les écrire en SQL : savoir sélectionner des colonnes, filtrer des lignes, croiser plusieurs tables, compter, regrouper, trier et détecter des situations particulières (livres sans emprunt, etc.). En annexe : les commandes de modification (INSERT, UPDATE, DELETE).

Schéma fil rouge

Eleve(id_eleve, nom, email, classe)
Auteur(id_auteur, nom)
Livre(id_livre, titre, id_auteur*, genre, editeur, annee_publication)
Emprunt(id_emprunt, id_eleve*, id_livre*, date_emprunt, date_retour)
-- FKs :
--   Livre.id_auteur   → Auteur.id_auteur
--   Emprunt.id_eleve  → Eleve.id_eleve
--   Emprunt.id_livre  → Livre.id_livre

Rappels pratiques

  • Les chaînes sont entre 'apostrophes' ; les dates au format 'AAAA-MM-JJ'.
  • Opérateurs logiques : =, <, >, <=, >=, <>, AND, OR, LIKE.
  • Les différences de syntaxe entre SGBD (SQLite, MySQL, PostgreSQL) sont mineures.

1. Comprendre les requêtes avant le SQL

Avant d’écrire une requête SQL, il est essentiel de comprendre ce qu’elle fait. L’algèbre relationnelle est le langage théorique sur lequel SQL a été bâti. Elle permet d’exprimer les opérations possibles sur une base de données avec des mots simples.

Les opérations de base (en mots simples)

  • Projection : choisir certaines colonnes d’une table (exemple : nom et email des élèves).
  • Sélection : choisir certaines lignes qui respectent une condition (exemple : élèves de T07).
  • Produit cartésien : combiner chaque ligne d’une table avec chaque ligne d’une autre (rare seul).
  • Jointure : relier deux tables grâce à une colonne commune (exemple : livres et auteurs).
  • Regroupement : rassembler des lignes qui ont une valeur commune (exemple : par classe ou par auteur).
  • Agrégation : effectuer un calcul sur un groupe (exemple : compter, faire la moyenne, etc.).

1.1 Exemples de traduction en SQL

Projection : « Je veux afficher seulement les noms et emails des élèves. »

SELECT nom, email
FROM Eleve;

Sélection : « Je veux seulement les élèves de la classe T07. »

SELECT *
FROM Eleve
WHERE classe = 'T07';

Jointure : « Je veux relier les livres à leurs auteurs. »

SELECT titre, nom AS auteur
FROM Livre
JOIN Auteur ON Livre.id_auteur = Auteur.id_auteur;

Regroupement : « Je veux connaître le nombre d’emprunts par classe. »

SELECT classe, COUNT(*) AS nb_emprunts
FROM Eleve
JOIN Emprunt ON Eleve.id_eleve = Emprunt.id_eleve
GROUP BY classe;

Anti-jointure : « Je veux voir les livres qui n’ont jamais été empruntés. »

SELECT l.id_livre, l.titre
FROM Livre l
LEFT JOIN Emprunt e ON e.id_livre = l.id_livre
WHERE e.id_livre IS NULL;
Méthode de lecture :
  1. Je prends (SELECT)
  2. dans (FROM)
  3. (WHERE)
  4. je relie (JOIN)
  5. je trie (ORDER BY)
  6. je regroupe (GROUP BY/HAVING).

2. Projeter des colonnes (SELECT … FROM)

SELECT nom, email
FROM Eleve;
nomemail
Martine Durandmartine.durand@mail.com
Hermine Nyaleuhermine.nyaleu@mail.com
Aïcha Djérouniaicha.djerouni@mail.com

3. Filtrer des lignes (WHERE)

SELECT *
FROM Eleve
WHERE classe = 'T07';
SELECT titre, editeur, annee_publication
FROM Livre
WHERE genre = 'roman' AND annee_publication >= 2021
ORDER BY annee_publication DESC;

4. Trier, limiter, dédoublonner

SELECT titre, editeur
FROM Livre
ORDER BY titre ASC;
SELECT DISTINCT editeur
FROM Livre
ORDER BY editeur;
SELECT titre, annee_publication
FROM Livre
ORDER BY annee_publication DESC
LIMIT 5;   -- 5 parutions les plus récentes

5. Joindre des tables (JOIN)

But : croiser Élève–Emprunt–Livre (et Auteur) via leurs clés étrangères.

SELECT e.nom AS eleve, e.classe, l.titre, a.nom AS auteur, em.date_emprunt
FROM Emprunt em
JOIN Eleve  e ON e.id_eleve  = em.id_eleve
JOIN Livre  l ON l.id_livre  = em.id_livre
JOIN Auteur a ON a.id_auteur = l.id_auteur
ORDER BY e.nom, em.date_emprunt DESC;

Les emprunts de l’éditeur « Flammarion » :

SELECT e.nom, l.titre, em.date_emprunt
FROM Emprunt em
JOIN Eleve e ON e.id_eleve = em.id_eleve
JOIN Livre l ON l.id_livre = em.id_livre
WHERE l.editeur = 'Flammarion'
ORDER BY em.date_emprunt DESC;

6. Compter, regrouper, filtrer les groupes

-- Nombre total d'élèves
SELECT COUNT(*) AS total_eleves
FROM Eleve;
-- Nombre d'emprunts par classe
SELECT e.classe, COUNT(*) AS nb_emprunts
FROM Emprunt em
JOIN Eleve e ON e.id_eleve = em.id_eleve
GROUP BY e.classe
ORDER BY nb_emprunts DESC;
-- Auteurs les plus empruntés
SELECT a.nom AS auteur, COUNT(*) AS nb_emprunts
FROM Emprunt em
JOIN Livre  l ON l.id_livre  = em.id_livre
JOIN Auteur a ON a.id_auteur = l.id_auteur
GROUP BY a.nom
ORDER BY nb_emprunts DESC;
-- Classes ayant au moins 2 emprunts
SELECT e.classe, COUNT(*) AS nb
FROM Emprunt em
JOIN Eleve e ON e.id_eleve = em.id_eleve
GROUP BY e.classe
HAVING COUNT(*) >= 2;

6 bis. Cas utiles : livres sans emprunt, DISTINCT, dates

Livres sans aucun emprunt
SELECT l.id_livre, l.titre
FROM Livre l
LEFT JOIN Emprunt em ON em.id_livre = l.id_livre
WHERE em.id_livre IS NULL
ORDER BY l.titre;
Nombre de livres distincts empruntés par élève
SELECT e.nom, COUNT(DISTINCT em.id_livre) AS nb_livres
FROM Eleve e
LEFT JOIN Emprunt em ON em.id_eleve = e.id_eleve
GROUP BY e.nom
ORDER BY nb_livres DESC, e.nom;
Filtrer sur une période
SELECT e.nom, l.titre, em.date_emprunt
FROM Emprunt em
JOIN Eleve e ON e.id_eleve = em.id_eleve
JOIN Livre l ON l.id_livre = em.id_livre
WHERE em.date_emprunt BETWEEN '2024-09-01' AND '2024-09-30'
ORDER BY em.date_emprunt;

7. Modifier les données

INSERT : ajouter un élève
INSERT INTO Eleve(id_eleve, nom, email, classe)
VALUES (9, 'Yaël Duclair', 'yael.duclair@mail.com', 'T01');
UPDATE : changer de classe
UPDATE Eleve
SET classe = 'T02'
WHERE id_eleve = 5;
DELETE : supprimer un emprunt
DELETE FROM Emprunt
WHERE id_emprunt = 50;

8. Exercices

Exercice A : Bases

  1. Afficher nom et email des élèves de T07, triés par nom.
  2. Afficher la liste sans doublon des éditeurs.
  3. Donner les titres et l’auteur des livres de genre « roman ».

Exercice B : Jointures

  1. Pour chaque emprunt, afficher élève, titre, auteur, date d’emprunt.
  2. Afficher les élèves ayant emprunté un livre de l’éditeur « Flammarion ».

Exercice C : Agrégats

  1. Compter le nombre d’emprunts par auteur (auteur + nb).
  2. Donner les classes ayant au moins 2 emprunts.
  3. Quel livre est le plus emprunté ?

Exercice D : Cas utiles

  1. Lister les livres sans emprunt.
  2. Donner, pour chaque élève, le nombre de livres distincts empruntés (0 inclus).
  3. Afficher les emprunts du mois de septembre 2024.