Accueil › Apprendre l’informatique › Leçon 12 sur 14

Intermédiaire · 12 min de lecture · gratuit, sans compte

Bases de données et SQL : interroger l’information

Tables, lignes, clés, SELECT, WHERE, JOIN, GROUP BY : le langage qui fait tourner presque tous les sites web.

Objectifs de cette leçon
  • Lire un schéma de tables liées par des clés
  • Écrire des requêtes SELECT filtrées et triées
  • Comprendre une jointure et une agrégation

Pourquoi pas juste des fichiers ?

Un site comme un réseau social, une boutique ou une banque gère des millions de lignes modifiées en même temps par des milliers de personnes. Un fichier texte ne suffit pas : il faut chercher vite, éviter les doublons, empêcher que deux modifications se contredisent. C’est le rôle d’une base de données relationnelle, interrogée avec le langage SQL.

Des tables liées entre elles

Une table est un tableau : chaque colonne a un nom et un type, chaque ligne est un enregistrement. Une clé primaire identifie une ligne de façon unique ; une clé étrangère pointe vers la clé primaire d’une autre table.

eleves                         notes
+----+---------+---------+    +----+-----------+---------+------+
| id | prenom  | classe  |    | id | eleve_id  | matiere | note |
+----+---------+---------+    +----+-----------+---------+------+
|  1 | Amina   | 3B      |    |  1 |        1  | maths   |   15 |
|  2 | Léo     | 3B      |    |  2 |        1  | info    |   18 |
|  3 | Inès    | 3A      |    |  3 |        2  | maths   |    9 |
+----+---------+---------+    +----+-----------+---------+------+

On ne recopie pas le prénom dans chaque note : on stocke l’eleve_id. Corriger une orthographe se fait à un seul endroit.

Les requêtes essentielles

-- Lire des colonnes, filtrer, trier
SELECT prenom, classe
FROM eleves
WHERE classe = '3B'
ORDER BY prenom;

-- Compter, faire des moyennes
SELECT matiere, AVG(note) AS moyenne, COUNT(*) AS nb
FROM notes
GROUP BY matiere;

-- Croiser deux tables : JOIN
SELECT eleves.prenom, notes.matiere, notes.note
FROM notes
JOIN eleves ON eleves.id = notes.eleve_id
WHERE notes.note >= 10;

L’ordre de lecture d’une requête : FROM (quelle table) → WHERE (quelles lignes) → GROUP BY (regrouper) → SELECT (quelles colonnes) → ORDER BY (trier).

Modifier les données

INSERT INTO eleves (prenom, classe) VALUES ('Noé', '3A');
UPDATE eleves SET classe = '3A' WHERE prenom = 'Léo';
DELETE FROM notes WHERE id = 3;

Sécurité : l’injection SQL

Si tu assembles une requête en collant le texte saisi par l’utilisateur, quelqu’un peut y glisser du SQL (' OR '1'='1) et lire ou détruire des données. La parade : les requêtes paramétrées, où les valeurs sont transmises séparément du code SQL.

import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE eleves (id INTEGER PRIMARY KEY, prenom TEXT, classe TEXT)")
conn.executemany("INSERT INTO eleves (prenom, classe) VALUES (?, ?)",
                 [("Amina", "3B"), ("Léo", "3B"), ("Inès", "3A")])

saisie = "3B"   # imagine que cela vient d'un formulaire
# BIEN : valeur passée en paramètre (?), jamais collée dans le texte
for ligne in conn.execute("SELECT prenom FROM eleves WHERE classe = ?", (saisie,)):
    print(ligne)

Erreurs courantes

  • Oublier le WHERE dans un UPDATE ou DELETE.
  • Utiliser = NULL : on écrit IS NULL, car NULL signifie « inconnu ».
  • Construire une requête par concaténation de texte venant de l’utilisateur : injection SQL.
  • Dupliquer les données dans plusieurs tables au lieu d’utiliser des clés étrangères.

Vérifie ce que tu as compris