Aller au contenu

Chapitre 2 - Partie 4 : Le langage SQL


SQL (Structured Query Language, langage de requêtes structurées) est le langage standard pour communiquer avec une base de données relationnelle. Il permet de :

  • interroger les données (lire) ;
  • insérer de nouvelles données ;
  • modifier des données existantes ;
  • supprimer des données ;
  • créer et modifier la structure des tables.

Pour illustrer les requêtes, on utilisera la base de données suivante d'une médiathèque :

Table Livres :

idtitreauteur_idanneegenre
1Les Misérables11862Roman
2Notre-Dame de Paris11831Roman
3Germinal21885Roman
4Le Petit Prince31943Conte
5Vol de nuit31931Roman
6L'Étranger41942Roman

Table Auteurs :

idnomprenomnationalite
1HugoVictorFrançaise
2ZolaÉmileFrançaise
3Saint-ExupéryAntoine deFrançaise
4CamusAlbertFrançaise

Table Emprunts :

idlivre_idadherentdate_empruntdate_retour
11Lucie2025-09-012025-09-15
24Marc2025-09-03NULL
33Lucie2025-09-102025-09-24
46Sophie2025-09-12NULL
51Marc2025-09-20NULL

La requête de base permet de choisir quelles colonnes afficher et dans quelle table.

SELECT titre, annee FROM Livres;
titreannee
Les Misérables1862
Notre-Dame de Paris1831
Germinal1885
Le Petit Prince1943
Vol de nuit1931
L'Étranger1942

Pour sélectionner toutes les colonnes, on utilise * :

SELECT * FROM Auteurs;

La clause WHERE permet de ne garder que les lignes qui vérifient une condition.

SELECT titre, annee FROM Livres WHERE annee > 1900;
titreannee
Le Petit Prince1943
Vol de nuit1931
L'Étranger1942

Opérateurs de comparaison :

OpérateurSignification
=Égal à
<> ou !=Différent de
<, >Inférieur, supérieur
<=, >=Inférieur ou égal, supérieur ou égal
BETWEEN a AND bCompris entre a et b
LIKECorrespondance de motif (avec % et _)
IN (...)Appartient à un ensemble
IS NULLEst vide (NULL)
IS NOT NULLN'est pas vide

Combinaison de conditions avec AND, OR, NOT :

SELECT titre FROM Livres
WHERE genre = 'Roman' AND annee >= 1880;
titre
Germinal
L'Étranger

Recherche avec motif :

SELECT titre FROM Livres WHERE titre LIKE 'Le%';
titre
Les Misérables
Le Petit Prince

Le % remplace n'importe quelle suite de caractères ; le _ remplace un seul caractère.

SELECT DISTINCT genre FROM Livres;
genre
Roman
Conte
SELECT titre, annee FROM Livres ORDER BY annee;
titreannee
Notre-Dame de Paris1831
Les Misérables1862
Germinal1885
Vol de nuit1931
L'Étranger1942
Le Petit Prince1943

Par défaut, le tri est croissant (ASC). Pour un tri décroissant, on ajoute DESC :

SELECT titre, annee FROM Livres ORDER BY annee DESC;

Les fonctions d'agrégation effectuent un calcul sur un ensemble de valeurs et renvoient une seule valeur.

FonctionDescription
COUNT(*)Nombre de lignes
COUNT(attribut)Nombre de valeurs non NULL
SUM(attribut)Somme
AVG(attribut)Moyenne
MIN(attribut)Valeur minimale
MAX(attribut)Valeur maximale
SELECT COUNT(*) FROM Livres;

→ Résultat : 6 (il y a 6 livres)

SELECT MIN(annee), MAX(annee) FROM Livres;

→ Résultat : 1831, 1943

SELECT COUNT(*) FROM Livres WHERE genre = 'Roman';

→ Résultat : 5


On veut afficher le titre de chaque livre avec le nom de son auteur. Or, ces informations sont dans deux tables différentes (Livres et Auteurs), reliées par auteur_id / id.

La clause JOIN permet de combiner les lignes de deux tables en se basant sur une condition de correspondance.

SELECT Livres.titre, Auteurs.nom, Auteurs.prenom
FROM Livres
JOIN Auteurs ON Livres.auteur_id = Auteurs.id;
titrenomprenom
Les MisérablesHugoVictor
Notre-Dame de ParisHugoVictor
GerminalZolaÉmile
Le Petit PrinceSaint-ExupéryAntoine de
Vol de nuitSaint-ExupéryAntoine de
L'ÉtrangerCamusAlbert

On peut combiner JOIN et WHERE :

SELECT Livres.titre, Auteurs.nom
FROM Livres
JOIN Auteurs ON Livres.auteur_id = Auteurs.id
WHERE Auteurs.nom = 'Hugo';
titrenom
Les MisérablesHugo
Notre-Dame de ParisHugo

On peut enchaîner plusieurs JOIN :

SELECT Emprunts.adherent, Livres.titre, Auteurs.nom
FROM Emprunts
JOIN Livres ON Emprunts.livre_id = Livres.id
JOIN Auteurs ON Livres.auteur_id = Auteurs.id
WHERE Emprunts.date_retour IS NULL;
adherenttitrenom
MarcLe Petit PrinceSaint-Exupéry
SophieL'ÉtrangerCamus
MarcLes MisérablesHugo

Cette requête affiche les emprunts en cours (non rendus).


INSERT INTO Auteurs (id, nom, prenom, nationalite)
VALUES (5, 'Dumas', 'Alexandre', 'Française');

Pour insérer plusieurs lignes :

INSERT INTO Livres (id, titre, auteur_id, annee, genre) VALUES
(7, 'Les Trois Mousquetaires', 5, 1844, 'Roman'),
(8, 'Le Comte de Monte-Cristo', 5, 1844, 'Roman');
UPDATE Emprunts
SET date_retour = '2025-10-01'
WHERE id = 2;

Cette requête enregistre le retour du livre emprunté par Marc (emprunt n° 2).

DELETE FROM Emprunts WHERE id = 1;

Supprime l'emprunt n° 1 (celui de Lucie, déjà rendu).


Une requête SELECT complète suit cet ordre :

SELECT colonnes -- 1. Quelles colonnes afficher
FROM table -- 2. Dans quelle(s) table(s)
JOIN table2 ON condition -- 3. Jointure (optionnel)
WHERE condition -- 4. Filtre sur les lignes (optionnel)
ORDER BY colonne -- 5. Tri (optionnel)
Mot-cléRôleType de requête
SELECTChoisir les colonnes à afficherInterrogation
FROMIndiquer la table sourceInterrogation
WHEREFiltrer selon une conditionInterrogation / Mise à jour
JOIN ... ONCombiner deux tablesInterrogation
DISTINCTÉliminer les doublonsInterrogation
ORDER BYTrier les résultatsInterrogation
COUNT, SUM, AVG, MIN, MAXFonctions d'agrégationInterrogation
INSERT INTO ... VALUESAjouter des enregistrementsMise à jour
UPDATE ... SETModifier des enregistrementsMise à jour
DELETE FROMSupprimer des enregistrementsMise à jour

On peut exécuter des requêtes SQL depuis Python avec le module sqlite3 :

import sqlite3
connexion = sqlite3.connect("mediatheque.db")
curseur = connexion.cursor()
curseur.execute("""
SELECT Livres.titre, Auteurs.nom
FROM Livres
JOIN Auteurs ON Livres.auteur_id = Auteurs.id
WHERE Livres.annee > 1900
ORDER BY Livres.annee
""")
for titre, nom in curseur.fetchall():
print(f"{titre} ({nom})")
connexion.close()
Vol de nuit (Saint-Exupéry)
L'Étranger (Camus)
Le Petit Prince (Saint-Exupéry)


OpérationSyntaxe SQL
Lire toutes les colonnesSELECT * FROM table
Lire certaines colonnesSELECT col1, col2 FROM table
FiltrerSELECT ... FROM ... WHERE condition
Sans doublonsSELECT DISTINCT col FROM table
TrierSELECT ... ORDER BY col ASC/DESC
CompterSELECT COUNT(*) FROM table
Joindre deux tablesSELECT ... FROM t1 JOIN t2 ON t1.cle = t2.cle
InsérerINSERT INTO table (cols) VALUES (vals)
ModifierUPDATE table SET col = val WHERE condition
SupprimerDELETE FROM table WHERE condition