Tu passes bientôt l'épreuve de NSI et tu entends parler de SQL partout ? Pas de panique ! SQL (pour Structured Query Language, ou « langage de requête structuré ») est le langage standard pour interroger une base de données relationnelle. Au bac NSI, c'est un incontournable : on te demande souvent d'écrire une requête qui extrait des informations d'une table, de filtrer avec WHERE, ou de croiser deux tables avec JOIN.
Dans cet article, on reprend tout depuis le début : ce qu'est une base de données, comment écrire une requête SELECT ... WHERE ... JOIN, comment exécuter du SQL depuis Python avec sqlite3, et comment réviser efficacement. À la fin, tu sauras répondre à n'importe quelle question de bac sur SQL NSI. Prêt ? C'est parti !
1. SQL, base de données et modèle relationnel : les bases
Une base de données est un ensemble organisé de données stockées de façon persistante (elles restent même après extinction de l'ordinateur). Dans le modèle relationnel, imaginé par Edgar F. Codd en 1970, on range les données dans des tables. Chaque table ressemble à un tableau :
- les colonnes (ou attributs) décrivent ce qu'on stocke :
id,nom,note… - les lignes (ou enregistrements, tuples) sont les données elles-mêmes ;
- une clé primaire identifie chaque ligne de manière unique (souvent
id).
Prenons un exemple concret : une table eleves avec les colonnes id, nom, classe et moyenne. Une requête SQL est une question posée à cette table. Le SGBD (Système de Gestion de Base de Données), comme SQLite, MySQL ou PostgreSQL, se charge de la comprendre et de te renvoyer les lignes correspondantes.
Les 4 opérations du CRUD
En NSI, on distingue quatre grandes familles de requêtes, souvent résumées par l'acronyme CRUD :
- Create :
INSERT INTO— ajouter une ligne. - Read :
SELECT— lire des données (c'est 90 % du bac !). - Update :
UPDATE— modifier une ligne existante. - Delete :
DELETE FROM— supprimer une ligne.
Au bac, l'accent est mis sur SELECT, avec ses clauses WHERE, ORDER BY, GROUP BY et JOIN. Si tu veux revoir le vocabulaire complet, jette un œil à notre cours NSI et à la page dédiée SQL sur nsi-lycee.fr.
2. Les requêtes SELECT, WHERE et JOIN expliquées simplement
Une requête SELECT a une structure très régulière. Retiens ce squelette :
SELECT colonnes
FROM table
WHERE condition
ORDER BY colonne [ASC|DESC]
LIMIT n;
Chaque mot-clé a un rôle précis :
SELECT: quelles colonnes je veux afficher ?*signifie « toutes les colonnes ».FROM: dans quelle(s) table(s) je cherche ?WHERE: quelles lignes je garde ? (le filtre)ORDER BY: comment je trie le résultat ?LIMIT: combien de lignes je veux au maximum ?
Les opérateurs de WHERE
Dans le WHERE, tu peux utiliser :
- des comparaisons :
=,<,>,<=,>=,<>(différent) ; - des intervalles :
BETWEEN 10 AND 15; - des ensembles :
IN ('1G1', '1G2'); - du texte approchant :
LIKE 'Dup%'(le%remplace n'importe quelle suite de caractères) ; - la logique booléenne :
AND,OR,NOT.
Exemple : afficher les élèves de 1G1 ayant une moyenne supérieure ou égale à 12, triés par moyenne décroissante.
SELECT nom, moyenne
FROM eleves
WHERE classe = '1G1' AND moyenne >= 12
ORDER BY moyenne DESC;
Le JOIN : croiser deux tables
Le vrai point fort du modèle relationnel, c'est de relier plusieurs tables. Imagine qu'on ait aussi une table notes avec id_eleve, matiere, note. Pour afficher le nom de chaque élève avec sa note de maths, on utilise un JOIN :
SELECT eleves.nom, notes.note
FROM eleves
JOIN notes ON eleves.id = notes.id_eleve
WHERE notes.matiere = 'Maths';
Le JOIN ... ON dit : « associe chaque ligne de eleves avec la ligne de notes dont id_eleve correspond à id ». C'est exactement la même logique qu'une jointure en Python ou en Pandas. Retiens bien cette syntaxe : elle tombe très souvent au bac NSI.
3. Exécuter du SQL depuis Python avec sqlite3
Au bac, on te demande souvent d'écrire du code Python qui interroge une base SQLite. Le module sqlite3 est dans la bibliothèque standard : rien à installer ! Voici un exemple complet, commenté et testable :
import sqlite3
# 1. Connexion (crée le fichier s'il n'existe pas)
conn = sqlite3.connect('lycee.db')
cur = conn.cursor()
# 2. Création de la table (une seule fois)
cur.execute("""
CREATE TABLE IF NOT EXISTS eleves (
id INTEGER PRIMARY KEY,
nom TEXT NOT NULL,
classe TEXT,
moyenne REAL
)
""")
# 3. Insertion de données
cur.execute("INSERT INTO eleves (nom, classe, moyenne) VALUES (?, ?, ?)", ('Dupont', '1G1', 14.5))
cur.execute("INSERT INTO eleves (nom, classe, moyenne) VALUES (?, ?, ?)", ('Martin', '1G2', 11.0))
conn.commit() # on valide les modifications
# 4. Requête SELECT avec WHERE
cur.execute("SELECT nom, moyenne FROM eleves WHERE moyenne >= ?", (12,))
for ligne in cur.fetchall():
print(ligne)
# 5. Fermeture
conn.close()
Trois points cruciaux à retenir :
- On utilise toujours des
?comme paramètres, jamais de concaténation de chaînes : c'est la protection contre les injections SQL. conn.commit()valide les modifications (INSERT, UPDATE, DELETE). Sans lui, rien n'est enregistré.cur.fetchall()renvoie une liste de tuples ;cur.fetchone()renvoie un seul tuple.
Si tu veux t'entraîner sur ce genre d'exercice, notre page exercices NSI propose des bases SQLite à interroger.
4. Cas d'usage concret : un mini-bulletin scolaire
Mettons tout en pratique. On veut afficher, pour chaque élève de 1G1, son nom et sa moyenne générale, triés du meilleur au moins bon. On suppose deux tables : eleves(id, nom, classe) et notes(id_eleve, matiere, note).
SELECT eleves.nom, AVG(notes.note) AS moyenne_generale
FROM eleves
JOIN notes ON eleves.id = notes.id_eleve
WHERE eleves.classe = '1G1'
GROUP BY eleves.id, eleves.nom
HAVING moyenne_generale >= 10
ORDER BY moyenne_generale DESC;
Décortiquons cette requête :
JOIN ... ONrelie chaque élève à ses notes.WHEREfiltre d'abord sur la classe.GROUP BYregroupe les lignes par élève.AVG(notes.note)calcule la moyenne de chaque groupe.HAVINGfiltre les groupes (là oùWHEREfiltre les lignes).ORDER BY ... DESCtrie du plus grand au plus petit.
Cette structure (SELECT / FROM / JOIN / WHERE / GROUP BY / HAVING / ORDER BY) est LA structure à connaître par cœur. Si tu la maîtrises, tu réponds à quasiment toutes les questions d'analyse de données du bac NSI.
5. Méthode de révision pour le bac NSI
SQL ne s'apprend pas en lisant : il s'apprend en écrivant des requêtes. Voici une méthode simple et efficace :
Étape 1 — Mémorise le squelette
Apprends l'ordre des clauses : SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT. C'est toujours le même ordre, peu importe la complexité.
Étape 2 — Écris sans machine
Au bac, l'épreuve écrite se fait sur papier. Entraîne-toi à écrire une requête à la main, sans autocomplétion. Puis vérifie en la tapant dans SQLite en ligne ou dans Python.
Étape 3 — Vérifie avec Python
Reprends le code sqlite3 ci-dessus et modifie-le : change les filtres, ajoute des colonnes, essaie un JOIN. La mémoire musculaire fonctionne énormément en programmation.
Étape 4 — Fais des annales
Les sujets du bac NSI (épreuve écrite de 3h30 en Terminale) contiennent presque toujours un exercice sur les bases de données. Chronomètre-toi : 20 à 25 minutes par exercice SQL, c'est un bon rythme.
Pour aller plus loin dans ta préparation, tu peux aussi consulter des ressources complémentaires comme Allolycée ou Allobac, qui proposent des fiches et des méthodes pour organiser tes révisions.
6. Conclusion : SQL, un investissement rentable
SQL NSI n'est pas un langage « en plus » à apprendre : c'est une compétence transversale qui te servira en NSI, en mathématiques, en SES, et plus tard en BTS, BUT, licence ou école d'ingénieur. Une fois que tu as compris les requêtes SELECT WHERE JOIN, tu peux interroger n'importe quelle base de données : un site e-commerce, une appli de streaming, un jeu vidéo…
Alors, à toi de jouer : ouvre un terminal Python, crée une base lycee.db, insère quelques lignes et commence à écrire tes propres requêtes. Tu verras, ça devient vite addictif. Et n'oublie pas de revenir régulièrement sur notre page SQL pour réviser les points clés. Bon courage pour le bac NSI ! 💪
