Bases de données relationnelles et SQL : fiche de révision
Modèle relationnel, clés primaires et étrangères, contraintes d'intégrité, SELECT avec WHERE, ORDER BY, jointures, agrégats, INSERT, UPDATE et DELETE : la fiche SQL complète du bac.
1Le modèle relationnel
Une base de données relationnelle organise les données en relations (tables). Chaque relation a un schéma : un nom et une liste d'attributs (colonnes) typés (INT, TEXT, REAL, DATE…). Une ligne (enregistrement, n-uplet) est une valeur pour chaque attribut. Le domaine d'un attribut est l'ensemble de ses valeurs possibles.
La clé primaire est un attribut (ou un ensemble d'attributs) qui identifie de façon unique chaque enregistrement : deux lignes ne peuvent pas avoir la même clé primaire, et elle ne peut pas être NULL. La clé étrangère est un attribut d'une table qui fait référence à la clé primaire d'une autre table : elle réalise les liens entre tables.
Exemple : Eleve(id_eleve, nom, classe) et Note(id_note, id_eleve#, matiere, valeur) — le # marque la clé étrangère. Contraintes d'intégrité : de domaine (type et valeurs admissibles), de relation (unicité de la clé primaire), de référence (une clé étrangère doit désigner un enregistrement existant). Le système de gestion de base de données (SGBD) fait respecter ces contraintes et gère l'accès concurrent, la persistance et la sécurité.
2Interroger : SELECT, WHERE, ORDER BY, jointures
La requête de base : SELECT colonnes FROM table WHERE condition ORDER BY colonne ; SELECT * renvoie toutes les colonnes, DISTINCT élimine les doublons, ORDER BY … DESC trie en décroissant. Les conditions combinent =, <>, <, >, AND, OR, NOT, LIKE (avec % joker) et IN.
SELECT nom FROM Eleve WHERE classe = 'TG2' ORDER BY nom ;
La jointure combine deux tables sur une égalité de clés : SELECT Eleve.nom, Note.valeur FROM Eleve JOIN Note ON Eleve.id_eleve = Note.id_eleve WHERE Note.matiere = 'NSI' ; on peut aliaser les tables (FROM Eleve AS e JOIN Note AS n ON e.id_eleve = n.id_eleve). Une jointure sans condition ON produit le produit cartésien — erreur classique.
Les fonctions d'agrégation résument une colonne : COUNT(*), SUM, AVG, MIN, MAX. SELECT AVG(valeur) FROM Note WHERE matiere = 'NSI' ; renvoie la moyenne. Le programme mentionne les agrégats ; GROUP BY n'est pas exigible mais peut apparaître dans du code à lire.
3Modifier : INSERT, UPDATE, DELETE
INSERT INTO Eleve (id_eleve, nom, classe) VALUES (42, 'Dupont', 'TG2') ; ajoute un enregistrement — le SGBD refuse si la clé primaire existe déjà ou si une clé étrangère référence un enregistrement inexistant.
UPDATE Note SET valeur = 15 WHERE id_note = 7 ; modifie des enregistrements. DELETE FROM Note WHERE id_eleve = 42 ; supprime. Danger absolu : un UPDATE ou un DELETE sans clause WHERE modifie ou supprime TOUTE la table.
La contrainte de référence empêche de supprimer un élève qui a encore des notes (sauf suppression en cascade définie dans le schéma) : c'est le SGBD qui protège la cohérence. Au bac, on demande souvent d'écrire la requête puis d'expliquer pourquoi le SGBD la refuserait.
4Exercice type et pièges
Énoncé type : avec les tables Livre(id_livre, titre, id_auteur#) et Auteur(id_auteur, nom), « donner les titres des livres de Victor Hugo, triés par titre ». Réponse : SELECT Livre.titre FROM Livre JOIN Auteur ON Livre.id_auteur = Auteur.id_auteur WHERE Auteur.nom = 'Hugo' ORDER BY Livre.titre ;
Autres classiques : compter les livres d'un auteur (COUNT), lister les auteurs sans doublon (DISTINCT), expliquer une violation de contrainte lors d'un INSERT, identifier clés primaires et étrangères dans un schéma donné.
Pièges : chaînes de caractères sans apostrophes ; oublier la condition de jointure ; confondre WHERE (filtre les lignes) et ORDER BY (trie) ; utiliser = avec NULL (on écrit IS NULL) ; croire qu'une clé étrangère doit être unique (plusieurs notes peuvent pointer vers le même élève) ; oublier que le nom de colonne doit être préfixé du nom de table quand il est ambigu dans une jointure.
Définitions à connaître par cœur
Quiz : teste-toi sur bases de données relationnelles et sql
8 questions corrigées. Réponds avant d'ouvrir la correction !
1. Quelle propriété n'est PAS celle d'une clé primaire ?
- A.Elle est unique
- B.Elle ne peut pas être NULL
- C.Elle peut être répétée sur plusieurs lignes
- D.Elle identifie un enregistrement
Voir la réponse
Réponse : C. Elle peut être répétée sur plusieurs lignes
L'unicité est la définition même de la clé primaire ; c'est la clé étrangère qui peut se répéter.
2. Que produit une jointure écrite sans clause ON ?
- A.Une erreur de syntaxe systématique
- B.Le produit cartésien des deux tables
- C.Une table vide
- D.La première table uniquement
Voir la réponse
Réponse : B. Le produit cartésien des deux tables
Chaque ligne de la première table est combinée avec chaque ligne de la seconde : n × m lignes, rarement voulu.
3. Quelle clause trie les résultats ?
- A.WHERE
- B.GROUP BY
- C.ORDER BY
- D.DISTINCT
Voir la réponse
Réponse : C. ORDER BY
ORDER BY trie (ASC par défaut, DESC pour décroissant) ; WHERE filtre les lignes.
4. Que fait « DELETE FROM Note ; » sans clause WHERE ?
- A.Supprime la table
- B.Supprime tous les enregistrements de la table
- C.Ne supprime rien
- D.Supprime la première ligne
Voir la réponse
Réponse : B. Supprime tous les enregistrements de la table
Sans condition, tous les enregistrements sont supprimés ; la table (son schéma) subsiste.
5. Quelle fonction renvoie le nombre de lignes d'une table ?
- A.SUM(*)
- B.COUNT(*)
- C.LEN(*)
- D.SIZE(*)
Voir la réponse
Réponse : B. COUNT(*)
COUNT(*) compte les enregistrements ; SUM additionne les valeurs d'une colonne.
6. On tente d'insérer une note dont l'id_eleve n'existe pas dans la table Eleve. Que se passe-t-il ?
- A.L'insertion réussit et crée l'élève
- B.Le SGBD refuse : violation de la contrainte de référence
- C.L'insertion réussit avec id_eleve = NULL
- D.La table Eleve est modifiée
Voir la réponse
Réponse : B. Le SGBD refuse : violation de la contrainte de référence
Une clé étrangère doit référencer un enregistrement existant : le SGBD rejette l'INSERT.
7. Comment tester qu'un attribut vaut NULL en SQL ?
- A.attribut = NULL
- B.attribut IS NULL
- C.attribut == NULL
- D.NULL(attribut)
Voir la réponse
Réponse : B. attribut IS NULL
NULL n'est égal à rien, pas même à lui-même : on utilise IS NULL et IS NOT NULL.
8. Quel mot-clé élimine les doublons dans un résultat ?
- A.UNIQUE
- B.DISTINCT
- C.ONLY
- D.SINGLE
Voir la réponse
Réponse : B. DISTINCT
SELECT DISTINCT colonne renvoie chaque valeur une seule fois.
Questions fréquentes
Quelle est la différence entre clé primaire et clé étrangère ?
La clé primaire identifie de façon unique une ligne de sa propre table ; la clé étrangère est une colonne qui contient la clé primaire d'une autre table pour établir un lien. La première est unique, la seconde peut se répéter.
Pourquoi séparer les données en plusieurs tables ?
Pour éviter la redondance (le nom d'un élève écrit une seule fois, pas sur chacune de ses notes), limiter les incohérences et les anomalies de mise à jour, et permettre au SGBD de garantir les contraintes.
GROUP BY est-il au programme ?
Il n'est pas exigible en Terminale NSI ; les agrégats COUNT, SUM, AVG, MIN, MAX le sont. Un sujet peut présenter GROUP BY dans une requête à lire.
Comment réviser SQL efficacement ?
Écrire les requêtes à la main sur un schéma de 2-3 tables, en couvrant chaque fois SELECT/WHERE/ORDER BY, une jointure, un agrégat et une modification, puis vérifier sur un vrai SGBD (SQLite via Python) que le résultat est celui attendu.
