Cours BUT Info

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.

TermeDéfinitionExemple
DonnéeUn fait brut, sans interprétation.2002-07-12, Durand
InformationUne donnée replacée dans un contexte qui lui donne un sens.« Paul Durand est né le 12 juillet 2002 »
Base de donnéesUn 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.

À gauche, tout est dans un seul tableau : l'information est répétée. À droite, chaque information n'existe qu'une fois, et les tables se répondent par des numéros.

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.

Les trois accidents classiques d'un tableau unique. Toute la théorie des bases relationnelles consiste à les rendre impossibles.

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.

Cinq familles, cinq façons de représenter et d'interroger les données. Elles se sont succédé sans s'éliminer : plusieurs coexistent encore aujourd'hui.

Le vocabulaire de ce schéma mérite d'être posé :

TermeDéfinition
Base navigationnelleUne 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 relationnelleUne 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 relationnelleLa 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édicatUne phrase qui est vraie ou fausse selon les valeurs, par exemple « l'élève X a la note Y ».
Logique du premier ordreLe 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-ReduceUn 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.

Le SGBD n'est qu'une couche parmi quatre. Savoir où se situe chaque problème évite de chercher au mauvais endroit.
  • 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 :

  1. Comment stocker les amis, les « likes », les différents types de messages ?
  2. Quelles requêtes permettent de récupérer les données voulues ?
  3. Sur quoi s'appuyer pour calculer une recommandation ?
  4. 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.

On ne passe jamais directement de l'énoncé au SQL : chaque niveau répond à une question différente, et on ne redescend pas en arrière sans raison.

Les trois niveaux, et leur vocabulaire :

NiveauNom completCe qu'on y décideObjet typique
ConceptuelModèle conceptuel de données (MCD)Ce dont on parle, et ce qui le relieEntité, association, cardinalité
LogiqueModèle logique de données (MLD)Comment on le range dans le modèle relationnelTable, colonne, clé primaire, clé étrangère
PhysiqueModèle physique de données (MPD)Sur quel SGBD, avec quels types et quels indexCREATE 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,1 ou 0,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.

Un MCD de la gestion des notes. Les rectangles sont des entités (ce dont on parle), les traits sont des associations (ce qui les relie), et les couples comme « 0,n » sont les cardinalités (combien de fois).

Comment lire ce schéma, dans l'ordre :

  1. Etudiant, Controle et Matiere sont des entités : trois rectangles, trois « choses » dont on parle.
  2. Note n'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 attribut valeur.
  3. Les cardinalités se lisent dans les deux sens. Entre Etudiant et Controle : « 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é).
  4. Entre Controle et Matiere : 1,1 côté contrôle (« un contrôle porte sur exactement une matière ») et 0,n cô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.

Trois règles suffisent pour passer d'un MCD à un MLD dans 95 % des cas. Le reste (héritage, associations n-aires) se traite au cas par cas.

En appliquant ces trois règles à l'exemple, on obtient quatre tables.

Le MLD correspondant au MCD précédent. Les flèches matérialisent les clés étrangères : elles disent « cette valeur doit exister dans l'autre table ».

Quelques points de vigilance sur ce résultat :

  • La table Note a 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 ».
  • Controle porte la clé étrangère mno, 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 ».
  • Etudiant et Matiere ne 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 :

  1. Éviter les redondances. Une information ne doit exister qu'à un seul endroit.
  2. Faciliter les mises à jour. Modifier une information doit se faire en un seul geste.
  3. Permettre l'accès multi-utilisateurs. Plusieurs personnes travaillent en même temps sur les mêmes données, sans se marcher dessus.
  4. 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 :

FormeCe qu'elle interdit
1NFLes valeurs multiples dans une même case (une liste de téléphones dans une colonne).
2NFQu'un attribut dépende d'une partie seulement de la clé primaire.
3NFQu'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.

Le SQL n'est pas un langage, c'est une famille de langages. En TD et en TP de cette ressource, on n'utilise que les deux premiers.
SigleNom completCe qu'il faitOrdres typiques
DDLData Definition LanguageDécrit la structureCREATE, ALTER, DROP, TRUNCATE
DMLData Manipulation LanguageManipule les donnéesSELECT, INSERT, UPDATE, DELETE
DCLData Control LanguageGère les droitsGRANT, REVOKE
TCLTransaction Control LanguageGère les transactionsBEGIN, 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 cinq mécanismes qu'on retrouve dans presque tous les CREATE TABLE du semestre. Les reconnaître suffit à lire n'importe quel script de création.

Les types de colonnes à connaître

TypeContientExemple
INTEGER / INTUn nombre entier42
NUMERIC(p, s)Un décimal exact, p chiffres dont s après la virguleNUMERIC(5,2) → 12.50
VARCHAR(n)Une chaîne de au plus n caractèresVARCHAR(15) → 'Paul Durand'
TEXTUne chaîne de longueur libre—
DATEUne date (jour, mois, année)'2026-09-16'
TIMESTAMPUne date et une heure'2026-09-16 14:00:00'
BOOLEANVrai ou fauxtrue, 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.

ContrainteCe qu'elle garantit
NOT NULLLa colonne ne peut pas être vide.
UNIQUEDeux lignes ne peuvent pas avoir la même valeur.
PRIMARY KEYNOT NULL + UNIQUE, et désigne la ligne de façon unique. Une seule par table.
FOREIGN KEY … REFERENCESLa valeur doit exister dans la table visée.
CHECK (condition)La condition doit être vraie. Par exemple CHECK (qute > 0).
DEFAULT valeurValeur 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.

Les actions référentielles répondent à une seule question : quand on touche à une ligne parente, que devient la ligne enfant qui la vise ? C'est exactement ce que le TD 3.01 demande de choisir.
ActionSur un UPDATE du parentSur un DELETE du parent
CASCADELa nouvelle valeur est propagée aux enfants.Les enfants sont supprimés aussi.
RESTRICTL'opération est refusée.L'opération est refusée.
SET NULLLa clé étrangère des enfants devient vide.La clé étrangère des enfants devient vide.
NO ACTIONComme 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

OrdreCe qu'il faitPiè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 :

Une requête qui exerce 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.

L'ordre dans lequel on écrit une requête n'est pas l'ordre dans lequel le SGBD l'exécute. Comprendre ce décalage explique la plupart des messages d'erreur du semestre.

WHERE et HAVING ne filtrent pas la même chose

Le WHERE agit sur des lignes, avant le regroupement. Le HAVING agit sur des groupes, après. Confondre les deux est l'erreur la plus fréquente du semestre.

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égatCalcule
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.

Une jointure rapproche deux tables par une condition d'égalité. La question à se poser est toujours : « et les lignes qui n'ont pas de correspondance, je les garde ou pas ? »

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 :

ÉcritureGarde
JOIN (= INNER JOIN)Uniquement les paires qui correspondent.
LEFT JOINToutes les lignes de gauche, complétées par NULL si rien ne correspond à droite.
RIGHT JOINL'inverse.
FULL JOINTout, 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 :

Se connecter à la base de l'IUT
psql -h psqlserv -U prenomnometu but2

Une fois connecté, l'invite change de forme : elle devient but2=>. On distingue alors deux familles de commandes :

TypeCommence parSe termine parExemple
Ordre SQLune instructionun point-virgule ;SELECT * FROM abonne;
Méta-commandeun antislash \rien (Entrée suffit)\d abonne

Les méta-commandes les plus utilisées :

CommandeEffet
\?La liste des méta-commandes disponibles
\hLa liste des ordres SQL
\h unOrdreLa syntaxe détaillée d'un ordre précis
\dLa liste des tables de la base
\d nomtableLa structure d'une table précise
\i fichierExécute les commandes contenues dans un fichier
\qQuitte 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.

La base de données n'est pas une matière isolée : c'est un fil rouge qui traverse les cinq semestres du BUT. Ce cours est le troisième maillon.

Le plan annoncé pour la suite de la ressource :

  1. Intégration de SQL dans les langages de programmation
  2. L'API JDBC
  3. Les systèmes transactionnels
  4. Les architectures client-serveur
  5. Les bases de Java EE
  6. La sécurité des sites web
  7. Le design pattern MVC pour le web
  8. 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


cours-rappels-bdd.pdf

transp_cours301_Rappels — présentation du cours et rappels BDD · 15 diapositives

Consultation seule — téléchargement désactivé

Chargement du document…

Dernière mise à jour le

Sur cette page