🗄️ Mémo SQL — Cheat-sheet bac NSI§
Le SQL au bac NSI = lecture et rédaction de requêtes sur des tables données. Tu n'auras pas à concevoir une base, mais à interroger une base existante.
Périmètre officiel BO Terminale
Le BO précise : « Les requêtes SQL d'interrogation sans utiliser les clauses GROUP BY et HAVING. »
Donc GROUP BY, HAVING, sous-requêtes, transactions et propriétés ACID sont hors programme NSI et ne figurent pas dans ce mémo. Le périmètre testé : SELECT FROM WHERE JOIN, INSERT, UPDATE, DELETE, DISTINCT, ORDER BY, et les agrégats simples (COUNT, SUM, AVG, MIN, MAX) appliqués globalement (sans regroupement).
1. Anatomie d'une requête SELECT§
SELECT [DISTINCT] colonnes -- ce qu'on veut afficher
FROM table -- d'où ça vient
[JOIN autre_table ON ...] -- jointures (optionnel)
[WHERE conditions] -- filtre des lignes
[ORDER BY colonnes [ASC|DESC]] -- tri
[LIMIT n [OFFSET k]]; -- nb max de résultats
Ordre d'évaluation logique (≠ ordre d'écriture !) :
FROM → JOIN → WHERE → SELECT → ORDER BY → LIMIT
2. Tables exemples utilisées dans ce mémo§
-- Table Eleve(id, nom, prenom, classe)
+----+----------+---------+---------+
| id | nom | prenom | classe |
+----+----------+---------+---------+
| 1 | Dupont | Alice | TG3 |
| 2 | Martin | Bob | TG4 |
| 3 | Lefevre | Chloe | TG3 |
+----+----------+---------+---------+
-- Table Note(id_eleve, matiere, note)
+----------+----------+------+
| id_eleve | matiere | note |
+----------+----------+------+
| 1 | NSI | 17 |
| 1 | Maths | 15 |
| 2 | NSI | 12 |
| 2 | Maths | 14 |
| 3 | NSI | 18 |
+----------+----------+------+
3. SELECT — exemples gradués§
3.1 Tout afficher§
3.2 Sélection de colonnes§
3.3 Filtrage WHERE§
SELECT * FROM Eleve WHERE classe = 'TG3';
SELECT nom FROM Eleve
WHERE classe = 'TG3' AND prenom LIKE 'A%'; -- prenom commence par A
SELECT * FROM Note WHERE note BETWEEN 10 AND 15; -- inclus
SELECT * FROM Eleve WHERE classe IN ('TG3', 'TG4');
SELECT * FROM Note WHERE matiere IS NOT NULL; -- jamais "= NULL"
Opérateurs WHERE : =, <> (ou !=), <, <=, >, >=,
AND, OR, NOT, BETWEEN ... AND ..., IN (...), LIKE 'pattern',
IS NULL, IS NOT NULL.
LIKE : % = n'importe quelle séquence ; _ = exactement un caractère.
3.4 DISTINCT§
3.5 Tri§
3.6 LIMIT§
4. Fonctions d'agrégation (utilisation globale)§
| Fonction | Rôle |
|---|---|
COUNT(*) |
nombre de lignes |
COUNT(col) |
nombre de valeurs non NULL |
COUNT(DISTINCT col) |
nb de valeurs distinctes |
SUM(col) |
somme |
AVG(col) |
moyenne |
MIN(col), MAX(col) |
min, max |
⚠️ Au bac NSI, ces agrégats s'utilisent sans
GROUP BY(donc en agrégeant sur toute la table ou un sous-ensemble filtré parWHERE).
SELECT COUNT(*) FROM Eleve; -- 3
SELECT AVG(note) FROM Note WHERE matiere='NSI'; -- (17+12+18)/3 = 15.66
SELECT MAX(note) FROM Note; -- 18
SELECT MIN(note) FROM Note WHERE matiere = 'Maths'; -- 14
5. Jointures (JOIN)§
5.1 INNER JOIN — intersection§
Renvoie uniquement les élèves qui ont au moins une note.5.2 LEFT JOIN — toutes les lignes de la gauche, NULL si pas de match§
Renvoie aussi les élèves sans note (avecNULL dans matiere/note).
5.3 Jointure naturelle (équivalente à INNER JOIN)§
5.4 Schéma visuel§
INNER JOIN LEFT JOIN
┌───┐╲ ┌───┐
│ A │ B │ A │ B (NULL si pas de match côté B)
└───┘╱ └───┘
inter tout A
6. INSERT / UPDATE / DELETE§
-- Ajout
INSERT INTO Eleve (nom, prenom, classe)
VALUES ('Petit', 'Diane', 'TG3');
-- Modification
UPDATE Note SET note = note + 1
WHERE matiere = 'NSI';
-- Suppression
DELETE FROM Note WHERE note < 5;
⚠️ Toujours mettre un WHERE sur UPDATE/DELETE (sinon affecte TOUTES les lignes).
7. CREATE TABLE (lecture suffisante au bac)§
CREATE TABLE Eleve (
id INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
prenom TEXT NOT NULL,
classe TEXT,
UNIQUE(nom, prenom)
);
CREATE TABLE Note (
id_eleve INTEGER NOT NULL,
matiere TEXT NOT NULL,
note REAL CHECK (note BETWEEN 0 AND 20),
PRIMARY KEY (id_eleve, matiere),
FOREIGN KEY (id_eleve) REFERENCES Eleve(id)
);
Contraintes :
- PRIMARY KEY : clé primaire (unique + non NULL).
- FOREIGN KEY ... REFERENCES : clé étrangère vers une autre table.
- NOT NULL, UNIQUE, CHECK(...).
8. Algèbre relationnelle ↔ SQL§
| Algèbre | Notation | SQL équivalent |
|---|---|---|
| Sélection | σ_condition(R) | SELECT * FROM R WHERE condition |
| Projection | π_cols(R) | SELECT cols FROM R (avec DISTINCT) |
| Jointure | R ⋈_cond S | SELECT * FROM R JOIN S ON cond |
9. Pièges classiques au bac§
| Piège | Bonne pratique |
|---|---|
WHERE col = NULL |
WHERE col IS NULL |
Utiliser GROUP BY ou HAVING au bac NSI |
Hors programme : repenser la requête |
Oublier que LIKE est sensible à la casse (selon SGBD) |
Tester ou LOWER(col) LIKE '...' |
| Ne pas qualifier les colonnes en JOIN (ambigu) | e.nom, n.note |
Confondre INNER JOIN et LEFT JOIN |
Lire « toutes les lignes de gauche ? » |
Compter les NULL avec COUNT(col) |
COUNT(col) IGNORE NULL ; COUNT(*) non |
| Modifier sans WHERE | Toujours réfléchir au WHERE de UPDATE/DELETE |
10. Questions types au bac§
Q1. Donner le nom et la classe des élèves de la classe 'TG3'.
Q2. Calculer la moyenne en NSI sur l'ensemble des élèves.
Q3. Quels élèves n'ont aucune note ?
Q4. Lister toutes les notes d'un élève donné (id = 1) avec son nom et la matière.
Q5. Lister les classes distinctes (sans doublons) présentes dans la table Eleve.
🎯 Check-list bac SQL§
- Je sais lire une jointure et expliquer le résultat.
- Je différencie
INNER JOINetLEFT JOIN. - Je sais filtrer avec
LIKE,IN,BETWEEN,IS NULL. - Je sais compter, sommer, moyenner (sans
GROUP BY). - Je sais traduire une question naturelle en SQL.
- Je sais utiliser
DISTINCTetORDER BY. - Je n'utilise jamais
GROUP BYniHAVINGau bac NSI (hors programme).