Le langage SQL
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 :
| Fonction | Calcul |
|---|---|
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';
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é.