Ch. 1 — Rappels : des bases de données au SQL
Tout ce qu'il faut savoir avant d'écrire une requête : à quoi sert une base de données, comment on la modélise, et comment se lit le langage SQL. Une page conçue pour partir de zéro.
Cette page est le chapitre de rappels de la ressource R3.07. Elle reprend l'ensemble des notions sur lesquelles le reste du semestre s'appuie : ce qu'est une base de données, comment on la dessine avant de la construire, et comment on lui parle en SQL.
Cette page part vraiment de zéro
Aucune connaissance préalable n'est supposée. Chaque terme technique est défini la première fois qu'il apparaît, en gras dans le texte. Les schémas sont là pour être lus lentement : ils portent une bonne partie de l'explication.
Si vous avez déjà fait du SQL, lisez au minimum les sections 6 (les objectifs du relationnel), 8 (le DDL et les actions référentielles) et 10 (les règles d'écriture) : ce sont celles qui reviennent en devoir.
1. Le problème que résolvent les bases de données
Trois mots à ne pas confondre
Avant de parler de « base de données », il faut poser trois mots que l'on emploie souvent l'un pour l'autre à tort.
| Terme | Définition | Exemple |
|---|---|---|
| Donnée | Un fait brut, sans interprétation. | 2002-07-12, Durand |
| Information | Une donnée replacée dans un contexte qui lui donne un sens. | « Paul Durand est né le 12 juillet 2002 » |
| Base de données | Un ensemble structuré de données, décrit une seule fois, et fait pour être interrogé. | Toutes les réservations du club LaRaquette |
À ces trois mots s'ajoute un quatrième, celui qui fait le travail :
- SGBD (système de gestion de base de données) : le logiciel qui range, retrouve, vérifie et protège les données. PostgreSQL en est un. C'est lui qui refuse une donnée incohérente, et c'est lui qui répond aux requêtes.
- Système d'information (SI) : l'ensemble formé par les personnes, les procédures, les applications et les données d'une organisation. La base de données n'en est qu'un morceau — mais c'est le morceau qui survit le plus longtemps.
Ce qui se passe quand on n'en a pas
L'exemple le plus simple est un tableur. Une association note ses réservations dans une seule feuille de calcul : une ligne par réservation, avec le nom du joueur, le sport, le terrain et la date.
Le nom du joueur, le nom du terrain et le sport sont répétés à chaque ligne. Cette répétition s'appelle une redondance. Elle n'est pas seulement laide : elle rend le fichier fragile.
Une anomalie est un dysfonctionnement de la base causé par sa mauvaise organisation. On en distingue trois, et elles suffisent à justifier toute la théorie qui suit :
- Anomalie d'insertion : on ne peut pas ajouter une information seule, parce qu'il faut remplir d'autres colonnes au passage.
- Anomalie de mise à jour : la même information existe à plusieurs endroits, et il suffit d'en oublier un pour que la base se contredise.
- Anomalie de suppression : effacer une ligne fait disparaître une information qui n'avait rien à voir avec elle.
Toute la conception des bases relationnelles consiste à rendre ces trois anomalies impossibles par construction, et non pas à les corriger après coup.
2. Cinq familles de bases de données
Une base de données n'a pas toujours ressemblé à un tableau. Depuis les années 1960, cinq grandes familles se sont succédé, chacune avec sa façon de représenter les données et sa façon de les interroger. Le mot important est ce « et » : changer de représentation oblige à changer de langage.
Le vocabulaire de ce schéma mérite d'être posé :
| Terme | Définition |
|---|---|
| Base navigationnelle | Une base où l'on se déplace manuellement de parent en enfant, en suivant des pointeurs. Il faut connaître le chemin d'avance pour retrouver une donnée. |
| Base relationnelle | Une base où les données sont des tables et où l'on décrit ce que l'on veut plutôt que comment y aller. C'est la famille de PostgreSQL. |
| Algèbre relationnelle | La théorie mathématique (union, projection, sélection, jointure…) qui définit ce qu'une requête relationnelle a le droit de faire. Le SQL en est une écriture concrète. |
| Prédicat | Une phrase qui est vraie ou fausse selon les valeurs, par exemple « l'élève X a la note Y ». |
| Logique du premier ordre | Le formalisme qui permet d'écrire des règles et de laisser la base en déduire de nouvelles informations. |
| NoSQL | « Not only SQL » : des bases qui abandonnent la table et le schéma fixe, pour des documents, des graphes ou des couples clé/valeur. |
| Map-Reduce | Un modèle de calcul qui découpe un gros traitement en deux phases (répartir, puis agréger) pour le faire tourner sur des milliers de machines. |
Pourquoi on apprend surtout le relationnel
Parce que c'est ce qui domine très largement le marché, et parce que ses fondations mathématiques sont solides : une requête relationnelle a un résultat prévisible. Le NoSQL arrive plus tard dans le cursus (R5.A10), et il se comprend mieux quand on maîtrise déjà le relationnel — ne serait-ce que pour savoir ce qu'on abandonne.
3. Où se situe la base de données
Quand on dit « le site est en panne », cela ne veut rien dire tant qu'on ne sait pas quelle couche est en panne. Un site web se décompose toujours à peu près de la même façon.
- Client : le programme qui demande. Un navigateur, une application mobile.
- Serveur : la machine qui répond. Elle héberge l'application et le SGBD.
- Instance : une installation de SGBD en train de tourner sur une machine. « L'instance de
psqlserv» désigne le PostgreSQL installé sur cette machine-là. - Transaction : un groupe d'opérations qui réussit ou échoue en bloc. Si l'une échoue, tout est annulé, comme si rien ne s'était passé.
L'idée à retenir est celle du schéma : le web dynamique, c'est d'abord une base de données. Refaire TikTok, ce n'est pas choisir la couleur du fil d'actualité. C'est répondre à quatre questions, toutes des questions de données :
- Comment stocker les amis, les « likes », les différents types de messages ?
- Quelles requêtes permettent de récupérer les données voulues ?
- Sur quoi s'appuyer pour calculer une recommandation ?
- Comment calculer efficacement des statistiques ?
4. Modéliser avant de coder
Voici la règle de méthode la plus importante de la ressource : on ne commence jamais par écrire du SQL. On commence par décrire le problème, puis on descend par étapes.
Les trois niveaux, et leur vocabulaire :
| Niveau | Nom complet | Ce qu'on y décide | Objet typique |
|---|---|---|---|
| Conceptuel | Modèle conceptuel de données (MCD) | Ce dont on parle, et ce qui le relie | Entité, association, cardinalité |
| Logique | Modèle logique de données (MLD) | Comment on le range dans le modèle relationnel | Table, colonne, clé primaire, clé étrangère |
| Physique | Modèle physique de données (MPD) | Sur quel SGBD, avec quels types et quels index | CREATE TABLE, INTEGER, VARCHAR |
Et les briques du niveau conceptuel :
- Entité : une « chose » dont on parle et qui a une existence propre. Un étudiant, un contrôle. On la dessine dans un rectangle.
- Attribut : une propriété d'une entité. Le nom d'un étudiant. On l'écrit à l'intérieur du rectangle.
- Identifiant : l'attribut (ou le groupe d'attributs) qui permet de reconnaître une entité sans ambiguïté. Deux étudiants peuvent s'appeler Paul Durand ; un seul a le numéro 42.
- Association : un lien entre deux entités. « Un contrôle porte sur une matière. »
- Cardinalité : le nombre de fois qu'une entité participe à une association. Elle s'écrit sous
la forme
0,n,1,1ou0,1, une valeur de chaque côté du trait.
Le MCD n'est pas un dessin décoratif
C'est la seule partie du travail qu'on peut discuter avec quelqu'un qui ne connaît pas l'informatique — un responsable de club, par exemple. Un MCD faux coûte dix fois plus cher à corriger une fois qu'il est devenu des tables.
5. Un exemple complet : la gestion des notes
Prenons un cas que tout le monde connaît : des étudiants, des contrôles, des matières, des notes.
Comment lire ce schéma, dans l'ordre :
Etudiant,ControleetMatieresont des entités : trois rectangles, trois « choses » dont on parle.Noten'est pas un rectangle ordinaire : c'est une association porteuse. Une note n'existe pas toute seule — elle est la note d'un étudiant à un contrôle. On la dessine donc attachée au trait, avec son propre attributvaleur.- Les cardinalités se lisent dans les deux sens. Entre
EtudiantetControle: « un étudiant a de 0 à n notes » (il peut n'avoir encore rien passé), et « un contrôle a de 0 à n notes » (personne ne l'a encore passé, ou tout le monde l'a passé). - Entre
ControleetMatiere:1,1côté contrôle (« un contrôle porte sur exactement une matière ») et0,ncôté matière (« une matière peut être évaluée par plusieurs contrôles »).
Du MCD au MLD : trois règles suffisent
Le passage du conceptuel au logique n'est pas une affaire d'intuition : c'est un ensemble de règles mécaniques.
En appliquant ces trois règles à l'exemple, on obtient quatre tables.
Quelques points de vigilance sur ce résultat :
- La table
Notea une clé primaire composée : le couple(eno, cno). Cela veut dire exactement ce qu'on veut dire : « un étudiant n'a qu'une seule note par contrôle ». Controleporte la clé étrangèremno, et non l'inverse. C'est la conséquence directe de la règle 2 : on met la clé du côté « 1 » dans la table du côté « n ».EtudiantetMatierene portent aucune clé étrangère : elles sont indépendantes. Ce sont les tables « racines » du modèle.
6. Pourquoi le relationnel a gagné
Quatre objectifs
Le modèle relationnel poursuit quatre buts, et tout le reste en découle :
- Éviter les redondances. Une information ne doit exister qu'à un seul endroit.
- Faciliter les mises à jour. Modifier une information doit se faire en un seul geste.
- Permettre l'accès multi-utilisateurs. Plusieurs personnes travaillent en même temps sur les mêmes données, sans se marcher dessus.
- Permettre d'exprimer de nombreuses contraintes. Le SGBD doit pouvoir refuser une donnée absurde — et non se contenter de l'enregistrer.
Redondance et formes normales
La normalisation est la démarche qui consiste à faire disparaître les redondances d'un modèle.
Elle s'appuie sur la notion de dépendance fonctionnelle : on dit que A → B (« A détermine B »)
si, connaissant A, on connaît forcément B. Dans Etudiant(eno, nom, prenom), on a eno → nom :
connaître le numéro suffit à connaître le nom.
Les formes normales sont des paliers numérotés (1NF, 2NF, 3NF… jusqu'à la 7NF dans la littérature) qui indiquent à quel point un schéma est débarrassé de ses redondances. Les trois premières suffisent dans la quasi-totalité des cas pratiques :
| Forme | Ce qu'elle interdit |
|---|---|
| 1NF | Les valeurs multiples dans une même case (une liste de téléphones dans une colonne). |
| 2NF | Qu'un attribut dépende d'une partie seulement de la clé primaire. |
| 3NF | Qu'un attribut non-clé dépende d'un autre attribut non-clé. |
À retenir pour le devoir
On ne vous demandera pas de démontrer qu'un schéma est en 3NF. En revanche, on vous demandera de repérer une redondance et de dire pourquoi elle est dangereuse. La réponse tient en une phrase : parce qu'une information écrite deux fois peut être corrigée une seule fois.
7. SQL : quatre familles d'ordres
SQL (Structured Query Language) est le langage normalisé pour dialoguer avec une base relationnelle. Ce n'est pas un langage unique : c'est une famille, organisée en quatre groupes.
| Sigle | Nom complet | Ce qu'il fait | Ordres typiques |
|---|---|---|---|
| DDL | Data Definition Language | Décrit la structure | CREATE, ALTER, DROP, TRUNCATE |
| DML | Data Manipulation Language | Manipule les données | SELECT, INSERT, UPDATE, DELETE |
| DCL | Data Control Language | Gère les droits | GRANT, REVOKE |
| TCL | Transaction Control Language | Gère les transactions | BEGIN, COMMIT, ROLLBACK |
Cette ressource ne travaille que les deux premiers. Le reste viendra plus tard dans le cursus — mais il faut savoir qu'ils existent, ne serait-ce que pour comprendre un message d'erreur.
8. Le DDL : décrire la structure
Un ordre DDL ne touche pas aux données : il crée, modifie ou détruit des objets (tables, vues,
index, séquences). Voici un CREATE TABLE typique, découpé en cinq mécanismes.
Les types de colonnes à connaître
| Type | Contient | Exemple |
|---|---|---|
INTEGER / INT | Un nombre entier | 42 |
NUMERIC(p, s) | Un décimal exact, p chiffres dont s après la virgule | NUMERIC(5,2) → 12.50 |
VARCHAR(n) | Une chaîne de au plus n caractères | VARCHAR(15) → 'Paul Durand' |
TEXT | Une chaîne de longueur libre | — |
DATE | Une date (jour, mois, année) | '2026-09-16' |
TIMESTAMP | Une date et une heure | '2026-09-16 14:00:00' |
BOOLEAN | Vrai ou faux | true, false |
Pourquoi le TP demande VARCHAR(15) plutôt que TEXT
Une chaîne de longueur libre empêche le SGBD d'optimiser le stockage et de prévoir la place. En donnant une longueur maximale, on lui rend la vie plus facile — et on documente au passage ce qu'on attend dans la colonne.
Les contraintes
Une contrainte est une règle que le SGBD vérifie à chaque écriture, et qui lui permet de refuser une donnée incohérente.
| Contrainte | Ce qu'elle garantit |
|---|---|
NOT NULL | La colonne ne peut pas être vide. |
UNIQUE | Deux lignes ne peuvent pas avoir la même valeur. |
PRIMARY KEY | NOT NULL + UNIQUE, et désigne la ligne de façon unique. Une seule par table. |
FOREIGN KEY … REFERENCES | La valeur doit exister dans la table visée. |
CHECK (condition) | La condition doit être vraie. Par exemple CHECK (qute > 0). |
DEFAULT valeur | Valeur utilisée quand on n'en fournit pas. |
Les actions référentielles
Une clé étrangère crée une dépendance : la ligne enfant ne peut pas exister sans la ligne parente. Que faire alors quand on modifie ou supprime le parent ? C'est la question à laquelle répondent les actions référentielles.
| Action | Sur un UPDATE du parent | Sur un DELETE du parent |
|---|---|---|
CASCADE | La nouvelle valeur est propagée aux enfants. | Les enfants sont supprimés aussi. |
RESTRICT | L'opération est refusée. | L'opération est refusée. |
SET NULL | La clé étrangère des enfants devient vide. | La clé étrangère des enfants devient vide. |
NO ACTION | Comme RESTRICT, mais la vérification peut être différée. | Idem. |
Ne confondez pas les deux sens
ON UPDATE CASCADE parle de la clé qui change (rare, mais utile pour renuméroter).
ON DELETE RESTRICT parle de la ligne qui disparaît (fréquent). Le TD 3.01 demande
précisément « RESTRICT en delete, CASCADE en update » : ce n'est pas une contradiction, ce
sont deux questions différentes.
9. Le DML : lire et écrire les données
Les quatre ordres d'écriture
| Ordre | Ce qu'il fait | Piège classique |
|---|---|---|
INSERT INTO t (…) VALUES (…) | Ajoute une ou plusieurs lignes. | Oublier une colonne NOT NULL. |
SELECT … | Lit des lignes. | Confondre WHERE et HAVING. |
UPDATE t SET c = v WHERE … | Modifie des lignes existantes. | Oublier le WHERE : toute la table est modifiée. |
DELETE FROM t WHERE … | Supprime des lignes. | Oublier le WHERE : toute la table est vidée. |
TRUNCATE est un ordre à part : il vide une table entière d'un coup, sans passer par le WHERE,
et de façon beaucoup plus rapide qu'un DELETE sans condition. Il appartient au DDL parce qu'il
réinitialise la structure, pas parce qu'il efface des lignes.
La requête SELECT complète
Voici une requête qui utilise toutes les clauses :
SELECT fno, nom
FROM fournisseurs LEFT JOIN commandes USING (fno)
GROUP BY fno, nom
HAVING AVG(qute) > (SELECT AVG(qute) FROM commandes)
ORDER BY fno DESC;Elle se lit de la façon suivante : « prends les fournisseurs, rapproche-les de leurs commandes, regroupe le tout par fournisseur, ne garde que ceux dont la quantité moyenne dépasse la moyenne générale, et trie le résultat par numéro décroissant ».
Ce qui compte, c'est que l'ordre des clauses est imposé, et qu'il ne correspond pas à l'ordre d'exécution.
WHERE et HAVING ne filtrent pas la même chose
La distinction tient en une phrase : le WHERE compare des valeurs d'une ligne, le HAVING
compare le résultat d'un agrégat.
Un agrégat est une fonction qui résume plusieurs lignes en une seule valeur :
| Agrégat | Calcule |
|---|---|
COUNT(*) | Le nombre de lignes |
SUM(x) | La somme |
AVG(x) | La moyenne |
MIN(x) / MAX(x) | Le minimum / le maximum |
L'erreur numéro un du semestre
SELECT fno, AVG(qute) FROM commandes WHERE AVG(qute) > 10 GROUP BY fno;Cette requête est refusée : un agrégat n'a pas de sens dans un WHERE, puisque le
regroupement n'a pas encore eu lieu. Il faut écrire HAVING AVG(qute) > 10.
Les sous-requêtes
Une sous-requête est une requête placée à l'intérieur d'une autre. Il en existe deux formes, et les confondre est une source d'erreur :
- Une sous-requête scalaire renvoie une ligne et une colonne — une seule valeur. Elle
s'utilise avec un opérateur de comparaison classique :
=,>,<. Exemple :WHERE qute > (SELECT AVG(qute) FROM commandes). - Une sous-requête ensembliste renvoie une colonne, mais autant de lignes qu'elle veut.
Elle s'utilise avec un opérateur ensembliste :
IN,NOT IN,EXISTS,ANY,ALL. Exemple :WHERE fno IN (SELECT fno FROM commandes).
Jointure ou sous-requête ?
Les deux répondent souvent à la même question. En pratique, les jointures sont en général plus efficaces : le SGBD sait mieux les optimiser. Utilisez la sous-requête quand elle exprime l'intention plus clairement, la jointure quand la performance compte.
Les jointures
Une jointure rapproche deux tables en les faisant correspondre sur une condition — le plus souvent une égalité entre une clé étrangère et la clé primaire qu'elle vise.
Deux écritures équivalentes, à connaître toutes les deux :
-- Avec ON : la condition est explicite, on peut comparer des colonnes de noms différents
SELECT * FROM fournisseurs f JOIN commandes c ON f.fno = c.fno;
-- Avec USING : plus court, quand la colonne porte le même nom des deux côtés
SELECT * FROM fournisseurs JOIN commandes USING (fno);Le mot-clé devant JOIN change ce qu'on garde des lignes sans correspondance :
| Écriture | Garde |
|---|---|
JOIN (= INNER JOIN) | Uniquement les paires qui correspondent. |
LEFT JOIN | Toutes les lignes de gauche, complétées par NULL si rien ne correspond à droite. |
RIGHT JOIN | L'inverse. |
FULL JOIN | Tout, des deux côtés. |
NULL mérite une définition : ce n'est pas zéro, ce n'est pas une chaîne vide. C'est
l'absence de valeur — « on ne sait pas » ou « il n'y a rien ». C'est pour cela qu'on ne peut pas
écrire = NULL en SQL : il faut écrire IS NULL ou IS NOT NULL.
Trier et limiter
ORDER BY trie le résultat final (ASC croissant par défaut, DESC décroissant). LIMIT n
ne garde que les n premières lignes. Les deux se combinent pour répondre à des questions du type
« les trois meilleures ventes ».
10. Les règles d'écriture à retenir
Ces cinq règles sont énoncées dans le support de cours. Elles méritent d'être développées, parce que chacune correspond à une erreur réellement fréquente.
L'ordre des clauses SQL est imposé. SELECT d'abord, ORDER BY en dernier. On ne peut pas
écrire FROM avant SELECT ni intervertir WHERE et GROUP BY. Cet ordre n'est pas une
convention de style : c'est la grammaire du langage.
WHERE filtre les valeurs des tables, HAVING filtre les agrégats. Une ligne à la fois
pour le premier, un groupe à la fois pour le second. Voir le schéma de la section 9.
Dans une requête avec GROUP BY, toute colonne du SELECT doit figurer dans le GROUP BY
— sauf si elle est enfermée dans un agrégat. Sinon, le SGBD ne saurait pas quelle valeur
afficher parmi celles du groupe.
Attention à l'accord entre ce que renvoie une sous-requête et l'opérateur utilisé dessus.
Un opérateur classique (=, >) attend une ligne et une colonne ; un opérateur ensembliste
(IN, EXISTS) attend une colonne. Un = sur une sous-requête qui renvoie plusieurs lignes
provoque une erreur à l'exécution.
Les jointures sont en général plus efficaces que les sous-requêtes. Quand les deux fonctionnent, préférez la jointure.
11. Travailler avec psql
psql est le client en ligne de commande de PostgreSQL. On s'y connecte avec une commande
toujours construite de la même façon :
psql -h psqlserv -U prenomnometu but2Une fois connecté, l'invite change de forme : elle devient but2=>. On distingue alors deux
familles de commandes :
| Type | Commence par | Se termine par | Exemple |
|---|---|---|---|
| Ordre SQL | une instruction | un point-virgule ; | SELECT * FROM abonne; |
| Méta-commande | un antislash \ | rien (Entrée suffit) | \d abonne |
Les méta-commandes les plus utilisées :
| Commande | Effet |
|---|---|
\? | La liste des méta-commandes disponibles |
\h | La liste des ordres SQL |
\h unOrdre | La syntaxe détaillée d'un ordre précis |
\d | La liste des tables de la base |
\d nomtable | La structure d'une table précise |
\i fichier | Exécute les commandes contenues dans un fichier |
\q | Quitte psql |
Le point-virgule oublié
C'est l'erreur la plus banale et la plus déroutante : sans ;, psql attend la suite de la
commande. L'invite devient but2-> (un tiret au lieu du supérieur) — c'est le signal qu'il
manque quelque chose. Tapez ; seul sur la ligne suivante pour débloquer la situation.
Le TP 3.01 détaille la prise en main complète : connexion, méta-commandes,
écriture d'un script SQL dans un fichier, et exécution avec \i.
12. Où ce cours s'inscrit
Ce chapitre n'arrive pas par hasard : il est le troisième maillon d'un fil rouge qui traverse les cinq semestres du BUT.
Le plan annoncé pour la suite de la ressource :
- Intégration de SQL dans les langages de programmation
- L'API JDBC
- Les systèmes transactionnels
- Les architectures client-serveur
- Les bases de Java EE
- La sécurité des sites web
- Le design pattern MVC pour le web
- Les architectures REST
Autrement dit : après avoir appris à interroger une base, on apprendra à la faire dialoguer avec un programme — et c'est là que les rappels de cette page deviennent indispensables.
Auto-évaluation
Parce qu'il répète la même information à plusieurs endroits. Une correction oubliée quelque part suffit à rendre le tableau contradictoire. On appelle cela une redondance, et elle provoque trois anomalies : insertion, mise à jour, suppression.
Le MCD décrit le métier avec des entités et des associations, sans référence à un ordinateur. Le MLD le traduit en tables, clés primaires et clés étrangères. Le MPD le traduit en SQL concret, pour un SGBD donné.
Quand elle est de type (n,n) : aucun des deux côtés ne peut porter la clé de l'autre, il faut donc une table intermédiaire avec les deux clés étrangères. Une association (1,n), elle, se traduit simplement par une clé étrangère placée côté « n ».
RESTRICT refuse la suppression du parent tant qu'un enfant le référence : la donnée est
protégée. CASCADE supprime aussi les enfants. Le premier est prudent et bruyant, le
second est pratique et silencieux — trop silencieux parfois.
Parce que le WHERE s'exécute avant le regroupement : à ce moment-là, la moyenne n'existe
pas encore. Il faut utiliser HAVING, qui s'exécute après le GROUP BY.
INNER JOIN ne garde que les lignes qui ont une correspondance des deux côtés. LEFT JOIN
garde toutes les lignes de la table de gauche, en remplissant par NULL les colonnes de
droite quand il n'y a pas de correspondance. Le nombre de lignes du résultat change.
Une seule ligne et une seule colonne — une valeur unique. Si elle en renvoie plusieurs,
PostgreSQL lève une erreur à l'exécution. Pour plusieurs lignes, il faut un opérateur
ensembliste : IN, ANY, EXISTS.
Il marque la fin d'un ordre SQL. Sans lui, psql continue d'attendre la suite : l'invite
passe de but2=> à but2->. Les méta-commandes, elles, commencent par \ et n'ont pas besoin
de point-virgule.
cours-rappels-bdd.pdf
transp_cours301_Rappels — présentation du cours et rappels BDD · 15 diapositives
Chargement du document…
Dernière mise à jour le