🗄️sciences

Bac NSI : l'essentiel sur le langage SQL

22 septembre 2026 8 min de lecture

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 ... ON relie chaque élève à ses notes.
  • WHERE filtre d'abord sur la classe.
  • GROUP BY regroupe les lignes par élève.
  • AVG(notes.note) calcule la moyenne de chaque groupe.
  • HAVING filtre les groupes (là où WHERE filtre les lignes).
  • ORDER BY ... DESC trie 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 ! 💪

📚 Pour aller plus loin

Questions fréquentes

Qu'est-ce que SQL et pourquoi l'apprendre en NSI ?

SQL (Structured Query Language) est le langage standard pour interroger une base de données relationnelle. En NSI, il est au programme car il permet de manipuler des données structurées : c'est un savoir-faire essentiel pour le bac et pour la poursuite d'études en informatique.

Quelle est la différence entre WHERE et HAVING en SQL ?

WHERE filtre les lignes avant le regroupement (GROUP BY), tandis que HAVING filtre les groupes après le regroupement. On utilise HAVING uniquement avec des fonctions d'agrégation comme AVG, COUNT, SUM, MIN ou MAX.

Comment faire une jointure (JOIN) entre deux tables en SQL ?

On utilise la clause JOIN ... ON pour associer les lignes de deux tables selon une condition, par exemple : SELECT eleves.nom, notes.note FROM eleves JOIN notes ON eleves.id = notes.id_eleve. La clé étrangère (id_eleve) doit correspondre à la clé primaire (id).

Comment exécuter une requête SQL en Python ?

On utilise le module sqlite3 de la bibliothèque standard : on crée une connexion avec sqlite3.connect('fichier.db'), un curseur avec conn.cursor(), puis on appelle cur.execute(requete, parametres) et cur.fetchall() pour récupérer les résultats. On termine par conn.commit() si on a modifié la base, puis conn.close().

Faut-il utiliser des ? dans les requêtes SQL en Python ?

Oui, c'est indispensable. Les ? sont des paramètres liés qui évitent les injections SQL. Ne concatène jamais une chaîne de caractères directement dans une requête, même si ça semble plus simple au début.

Quelles clauses SQL faut-il absolument connaître pour le bac NSI ?

Il faut maîtriser SELECT, FROM, WHERE, JOIN ... ON, GROUP BY, HAVING, ORDER BY et LIMIT. Connaître l'ordre de ces clauses est essentiel : SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT.

Quelle est la différence entre une clé primaire et une clé étrangère ?

Une clé primaire identifie de manière unique chaque ligne d'une table (souvent un id). Une clé étrangère est une colonne qui fait référence à la clé primaire d'une autre table, ce qui permet de relier les deux tables lors d'un JOIN.

Bravo ! Tu as lu cet article
Inscris-toi pour sauvegarder ta progression et gagner des XP
Creer mon compte
SQL NSIrequêtes SELECT WHERE JOINbase de données NSIsqlite3 Pythonbac NSI bases de donnéesrequête SQL lycée
Pixel