Langage SQL : les requêtes, cours de Terminale NSI
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
Une requête SQL décrit les données voulues (par leur contenu), pas la manière de les chercher 5.
Squelette : SELECT colonnes FROM table WHERE condition ORDER BY colonne ; DESC pour l'ordre décroissant 5.
WHERE filtre les lignes avant le calcul ; les fonctions d'agrégat (COUNT, SUM, AVG, MIN, MAX) résument plusieurs lignes en une valeur.
Pour aller plus loin (hors programme du bac) : GROUP BY regroupe les lignes qui partagent une valeur 5 et HAVING filtre ensuite les groupes.
Au bac, les requêtes SQL sont rédigées à la main, sans calculatrice : l'exercice de bases de données fait partie du sujet 13.
Pourquoi apprendre à écrire des requêtes
Dans le cours précédent, tu as vu qu'une base de données relationnelle range l'information dans des tables, c'est-à-dire des tableaux de lignes (les enregistrements) et de colonnes (les attributs), gérés par un système de gestion de bases de données. Stocker ne suffit pas : il faut aussi retrouver, filtrer, trier et résumer ces données. C'est le rôle d'un langage de requête.
Un langage de requête sert à accéder aux données d'une base. Il permet de ne conserver que les données qui répondent à des conditions, appelées critères de sélection : par exemple, les habitants d'une ville précise 5. Les résultats peuvent être triés, ou regroupés d'après la valeur d'une donnée 5. Parmi tous ces langages, SQL est celui que l'on rencontre le plus souvent 5.
Un peu d'histoire pour situer l'outil. Edgar Frank Codd propose le modèle relationnel, puis introduit en 1971 plusieurs langages, dont l'algèbre relationnelle 5. Vers 1973, Chamberlin et Boyce conçoivent un langage baptisé d'abord SEQUEL, qui prendra par la suite le nom de SQL 5. SQL devient un standard des bases relationnelles : l'ANSI le normalise en 1986, puis l'ISO en 1987.
Une particularité de SQL te servira toute l'année : on atteint les données grâce à ce qu'elles contiennent, et non en suivant un chemin d'accès 5. Tu n'écris pas « parcours la table ligne par ligne et compare » ; tu décris ce que tu veux obtenir, et c'est le SGBD qui décide comment le calculer. C'est très différent de Python, où tu écris une boucle.
Pour le bac, retiens que le sujet de NSI comporte des exercices indépendants, et que, lorsque des requêtes de bases de données sont demandées, elles doivent être rédigées en SQL 1. L'épreuve dure 3 h 30 et la calculatrice n'est pas autorisée 3. Les requêtes s'écrivent donc à la main : la syntaxe doit devenir un réflexe.
Ce cours couvre l'interrogation d'une seule table : sélectionner, filtrer, trier, compter, regrouper. Les jointures entre tables et les mises à jour des données (insertion, modification, suppression) font l'objet du cours suivant.
Notre table d'exemple
Pour tout le cours, nous utilisons une table fictive eleves, qui décrit six élèves d'un lycée. Les valeurs sont inventées pour s'entraîner.
La table eleves
id
nom
classe
note_nsi
1
Ada
T1
14
2
Boris
T1
9
3
Chloé
T2
16
4
Dylan
T2
12
5
Emma
T1
17
6
Farid
T2
8
La table eleves · Table fictive utilisée dans tous les exemples du cours.
SELECT ... FROM : choisir des colonnes
WHERE : filtrer les lignes
ORDER BY : trier le résultat
Sans consigne, l'ordre des lignes du résultat n'est pas garanti : un affichage trié se demande explicitement 5. La clause ORDER BY se place à la fin de la requête, suivie du nom de la colonne servant au tri 5.
Les fonctions d'agrégation
GROUP BY et HAVING : regrouper
Pour aller plus loin (hors programme du bac). Un langage de requête sait aussi rassembler les lignes qui partagent une même valeur, par exemple les habitants d'une même rue 5. En SQL, c'est la clause GROUP BY. Le programme de NSI ne l'exige pas : au bac, les agrégats s'utilisent sans GROUP BY ni HAVING.
Ordre d'écriture et ordre de raisonnement
FROMOn part de la table indiquée
WHEREOn garde les lignes qui vérifient la condition
GROUP BYOn forme des groupes de lignes
HAVINGOn garde les groupes qui conviennent
SELECT puis ORDER BYOn calcule les colonnes, puis on trie
Comment le SGBD raisonne sur une requête · Ordre de raisonnement, différent de l'ordre d'écriture.
Pièges fréquents et réflexes pour le bac
Exercices corrigés
Exercice 1 Premières requêtes sur la table eleves
★☆☆Environ 8 min
On utilise la table eleves(id, nom, classe, note_nsi) du cours : Ada (T1, 14), Boris (T1, 9), Chloé (T2, 16), Dylan (T2, 12), Emma (T1, 17), Farid (T2, 8).
Écris la requête qui donne les noms de tous les élèves de T1.
Écris la requête qui donne les noms et notes des élèves ayant strictement moins de 10, du plus petit au plus grand.
Quel est le résultat de la seconde requête ?
Indice 1
Une chaîne de caractères s'écrit entre apostrophes.
Indice 2
Le tri par défaut est croissant : pas besoin de DESC.
Voir la correction pas à pas
Question 1 : on lit une seule table, eleves, et on affiche seulement nom. Le filtre porte sur la classe : SELECT nom FROM eleves WHERE classe = 'T1';.
Question 2 : on affiche nom et note_nsi. La condition « strictement moins de 10 » s'écrit note_nsi < 10. Le tri croissant est celui par défaut : SELECT nom, note_nsi FROM eleves WHERE note_nsi < 10 ORDER BY note_nsi;.
Question 3 : les notes strictement inférieures à 10 sont 9 (Boris) et 8 (Farid). Triées de la plus petite à la plus grande : Farid 8, puis Boris 9.
Tu as combiné SELECT, WHERE et ORDER BY : c'est la structure de la majorité des questions simples au bac.
Exercice 2 Moyenne par classe (pour aller plus loin, hors programme du bac)
★★☆Environ 10 min
Avec la même table eleves, on veut connaître, pour chaque classe, l'effectif et la moyenne des notes.
Écris la requête.
Calcule à la main la moyenne de la classe T2 (Chloé 16, Dylan 12, Farid 8).
On ne veut garder que les classes dont la moyenne dépasse 12,5. Complète la requête.
Indice 1
Il faut un regroupement par classe, avec deux agrégats.
Indice 2
Une condition sur une moyenne se place dans HAVING.
Voir la correction pas à pas
Pour calculer un résultat par classe, on regroupe avec GROUP BY classe. On affiche la classe, l'effectif avec COUNT(*) et la moyenne avec AVG(note_nsi) : SELECT classe, COUNT(*), AVG(note_nsi) FROM eleves GROUP BY classe;.
Moyenne de T2 : on additionne 16 + 12 + 8 = 36, puis on divise par 3 élèves. On obtient 12.
Pour filtrer sur la moyenne, on ajoute HAVING AVG(note_nsi) > 12.5 après le GROUP BY. WHERE serait refusé, car la moyenne n'est connue qu'après le regroupement. Seule T1 (moyenne environ 13,33) reste.
Le couple GROUP BY / HAVING répond aux questions « par classe, par catégorie… » avec un critère sur le résultat du groupe.
Exercice 3 Compter les élèves ayant la moyenne en T1
★★☆Environ 8 min
On veut savoir combien d'élèves de T1 ont une note supérieure ou égale à 10.
Écris la requête SQL qui renvoie ce nombre.
Donne la valeur renvoyée à partir de la table : Ada 14, Boris 9, Emma 17 pour T1.
Indice 1
Deux conditions à relier avec AND.
Indice 2
Pour compter, on utilise COUNT(*) sur les lignes qui passent le filtre.
Voir la correction pas à pas
Les deux conditions portent sur des lignes : la classe est 'T1' et la note est au moins 10. On les relie par AND.
La requête est SELECT COUNT(*) FROM eleves WHERE classe = 'T1' AND note_nsi >= 10;.
Parmi les trois élèves de T1, Boris (9) est écarté. Ada (14) et Emma (17) restent : le résultat est 2.
Le filtre WHERE s'applique avant le comptage : COUNT(*) compte seulement les lignes retenues.
Quiz
8 questions · correction immédiate · ton score reste sur ton appareil.
La première est correcte : un seul = et une chaîne entre apostrophes. La deuxième utilise ==, qui n'est pas du SQL standard (réflexe venu de Python) : au bac, on écrit =. La troisième oublie les apostrophes : T2 serait lu comme un nom de colonne. La dernière inverse les rôles de nom et classe.
ORDER BY suivi de DESC donne l'ordre décroissant 5. ORDER BY col seul trie, mais par ordre croissant, qui est le tri par défaut 5. GROUP BY regroupe et ne trie pas ; WHERE filtre et n'accepte pas DESC.
Le tri porte sur le résultat, donc ORDER BY s'ajoute en fin de requête 5. La placer plus tôt est une erreur de syntaxe, même si l'idée « trier d'abord » semble naturelle.
On garde les lignes dont la note est au moins 12 : 14, 16, 12 et 17, soit 4 lignes. Le piège est d'oublier 12 en lisant >= comme > : on trouverait alors 3.
HAVING filtre les groupes une fois les agrégats calculés. WHERE filtre les lignes avant le regroupement : une moyenne n'existe pas encore à ce stade, d'où le refus d'un agrégat dans WHERE.
Les trois affirmations exactes sont celles que les sources confirment. La fausse est la deuxième : SELECT se contente de lire et ne change rien ; pour modifier il faut d'autres instructions, étudiées au cours suivant.
Vrai : SELECT DISTINCT classe FROM eleves; renvoie T1 et T2 une seule fois. Sans DISTINCT, chaque ligne de la table donne une ligne de résultat, donc les valeurs répétées sont répétées aussi.
Avec GROUP BY classe, l'agrégat est calculé pour chaque groupe : ici 3 pour T1 et 3 pour T2. Sans GROUP BY, on aurait une seule ligne avec 6. Le regroupement ne trie pas et ne supprime rien dans la table.
Les questions qu'on se pose
Quelle différence entre WHERE et HAVING ?
(HAVING est hors programme du bac.) WHERE filtre les lignes avant tout regroupement ; il ne peut pas contenir d'agrégat. HAVING filtre les groupes après GROUP BY et peut contenir des agrégats comme AVG(...) ou COUNT(*). Si ta condition porte sur une valeur propre à une ligne (une note), c'est WHERE. Si elle porte sur un résultat de groupe (une moyenne), c'est HAVING.
À quoi sert SQL, puisque je sais déjà programmer en Python ?
En Python, tu décris comment parcourir les données. En SQL, tu décris ce que tu veux : les données se désignent par leur contenu, sans itinéraire à suivre 5. Les bases de données stockent souvent des millions de lignes ; laisser le SGBD chercher est plus simple et plus fiable qu'une boucle écrite à la main. Au bac, l'énoncé précise d'ailleurs quand une réponse doit être rédigée en SQL 1.
Est-ce que SQL tombe au bac ?
Oui : les sujets de NSI comportent un exercice consacré aux bases de données relationnelles et au langage SQL, parmi des exercices indépendants, sur 3 h 30 sans calculatrice 13. Les requêtes se rédigent à la main : entraîne-toi à les écrire sur papier, en vérifiant l'ordre des clauses.
Les majuscules comptent-elles dans une requête ?
Pour les mots-clés (SELECT, WHERE…), non. Pour les valeurs de texte comparées, la valeur doit correspondre à ce qui est stocké dans la base. Par convention, on écrit les mots-clés en majuscules pour que la requête reste lisible.
Pourquoi mon résultat n'est-il pas trié alors que je n'ai rien demandé ?
Parce que l'ordre n'est jamais garanti sans consigne : il faut demander le tri avec ORDER BY5. Si l'ordre te semble « bon » par hasard, rien ne dit qu'il le restera. N'oublie pas DESC pour un tri décroissant 5.