cours1 min de lecture
Interroger et mettre à jour une base relationnelle — SELECT, WHERE, JOIN, INSERT, UPDATE, DELETE, et les fonctions d'agrégation.
programme

Introduction

SQL (Structured Query Language) est le langage standardisé pour interroger et modifier les bases relationnelles. Apparu en 1974, il est aujourd'hui l'un des langages informatiques les plus diffusés au monde. Son originalité : il est déclaratif. Vous décrivez ce que vous voulez, le SGBD se charge de comment l'obtenir.

Comparez à la programmation Python que vous pratiquez : pour calculer la moyenne d'une liste de notes, vous écrivez l'algorithme — boucle, somme, division. C'est impératif. En SQL, vous dites simplement « donne-moi la moyenne des notes » et le SGBD invente la stratégie. C'est la différence entre commander un plat au restaurant (« je veux des frites ») et le préparer soi-même (peler, couper, faire chauffer l'huile, plonger…).

Pour tous les exemples, nous travaillons sur la base scolaire déjà introduite aux cours précédents :

Eleve(id_eleve, nom, prenom, classe)
Cours(id_cours, intitule, niveau)
Inscription(id_eleve*, id_cours*, date_inscription, note)

(clé primaire soulignée par convention dans les schémas ; clé étrangère marquée d'une étoile — voir le cours 1 pour la notation complète)

Interroger : SELECT … FROM … WHERE

La requête la plus simple sélectionne des colonnes d'une relation :

SELECT nom, prenom
FROM Eleve;

Pour filtrer, on ajoute WHERE avec une condition :

SELECT nom, prenom, classe
FROM Eleve
WHERE classe = 'TG1';

Pour éliminer les doublons du résultat, on utilise DISTINCT :

SELECT DISTINCT classe
FROM Eleve;

Pour trier le résultat, ORDER BY (ascendant par défaut, DESC pour descendant) :

SELECT nom, prenom
FROM Eleve
WHERE classe = 'TG1'
ORDER BY nom ASC;

Que retourne SELECT DISTINCT classe FROM Eleve ?

Joindre deux relations : JOIN … ON

Pour combiner des informations issues de plusieurs relations, on utilise une jointure. Elle s'appuie sur l'égalité entre une clé étrangère d'une relation et la clé primaire de l'autre. Pour obtenir la liste des inscriptions avec le nom de l'élève et l'intitulé du cours :

SELECT Eleve.nom, Eleve.prenom, Cours.intitule, Inscription.note
FROM Inscription
JOIN Eleve ON Inscription.id_eleve = Eleve.id_eleve
JOIN Cours ON Inscription.id_cours = Cours.id_cours;

On lit cette requête comme une recomposition : pour chaque ligne d'Inscription, on récupère l'élève correspondant par sa clé et le cours correspondant par sa clé.

Les fonctions d'agrégation

Les fonctions d'agrégation produisent une seule valeur à partir d'une colonne :

FonctionCalcul
COUNT(*)nombre de lignes
AVG(col)moyenne
MIN(col)minimum
MAX(col)maximum
SUM(col)somme

Exemple — la moyenne générale des notes :

SELECT AVG(note)
FROM Inscription;

La meilleure note attribuée en NSI :

SELECT MAX(Inscription.note)
FROM Inscription
JOIN Cours ON Inscription.id_cours = Cours.id_cours
WHERE Cours.intitule = 'NSI';
Le programme exclut explicitement GROUP BY et HAVING. Vous utilisez les fonctions d'agrégation sans regroupement — elles produisent toujours une seule ligne en sortie.

Mettre à jour : INSERT, UPDATE, DELETE

Ajouter une ligne :

INSERT INTO Eleve (id_eleve, nom, prenom, classe)
VALUES (42, 'Curie', 'Marie', 'TG2');

Modifier des lignes existantes — toujours avec un WHERE, sinon toutes les lignes sont touchées :

UPDATE Eleve
SET classe = 'TG3'
WHERE id_eleve = 42;

Supprimer des lignes :

DELETE FROM Inscription
WHERE id_eleve = 42 AND id_cours = 7;
DELETE FROM Inscription; sans WHERE vide entièrement la table. Vérifiez systématiquement votre WHERE avant d'exécuter une commande de mise à jour ou de suppression.

Que fait UPDATE Eleve SET classe = 'TG3'; (sans WHERE) ?

Anatomie d'une requête SELECT

Toute requête d'interrogation suit la même charpente, dans cet ordre :

SELECT  <colonnes à afficher>
FROM    <relation principale>
JOIN    <autre relation> ON <condition de jointure>
WHERE   <condition de filtrage>
ORDER BY <colonne(s) de tri>;

Les clauses JOIN, WHERE, ORDER BY sont facultatives. SELECT et FROM sont obligatoires. Mémoriser cet ordre vous fait gagner du temps : en cas d'erreur de syntaxe, c'est presque toujours un ordre cassé.