Un cap pour ce chapitre
Ce que vous saurez faire
- Lire et construire
SELECT,FROMetWHERE. - Combiner des conditions logiques.
- Expliquer
DISTINCTetORDER BY.
Les bases utiles pour commencer
Une relation entièrement connue
Nous utilisons Membre(id_membre, prenom, niveau). Les données fictives ci-dessous constituent toute la relation de ce chapitre. Deux personnes portent le même prénom : cette répétition permet de distinguer des lignes différentes d’un résultat affichant seulement une colonne.
id_membre | prenom | niveau |
|---|---|---|
| 101 | Lina | Terminale |
| 102 | Noé | Première |
| 103 | Sara | Terminale |
| 104 | Lina | Première |
| 105 | Adam | Terminale |
SELECT prenom FROM Membre; demande la colonne prenom pour toutes les lignes. L’écriture ne modifie pas les données enregistrées. Elle produit un résultat de consultation. SQL distingue ainsi les requêtes de lecture des opérations d’insertion, de modification et de suppression.
Filtrer avec une condition
La clause WHERE exprime les critères que doivent vérifier les lignes. Pour les membres de Terminale, on écrit WHERE niveau = 'Terminale'. Les chaînes sont placées entre apostrophes SQL ; les noms d’attributs restent des identifiants. On peut combiner des comparaisons avec AND, OR et NOT.
Les parenthèses rendent les groupes logiques explicites. « Terminale et identifiant au moins 103 » retient Sara et Adam. Une condition ne doit pas être inventée à partir de la position des lignes : les identifiants et attributs expriment les faits recherchés, indépendamment de l’ordre d’affichage.
SELECT prenom
FROM Membre
WHERE niveau = 'Terminale' AND id_membre >= 103;Une condition est évaluée pour chaque ligne. Sur Lina 101, « Terminale » est vrai mais « identifiant au moins 103 » est faux. Sur Lina 104, c’est l’inverse. Le connecteur AND exige les deux, tandis que OR accepte l’un ou l’autre. Établir une petite table de vérité sur les lignes ambiguës permet de diagnostiquer une requête trop large.
Trier les résultats explicitement
ORDER BY précise l’ordre de présentation. ASC signifie croissant et DESC décroissant ; ASC est généralement implicite si l’on ne précise pas la direction. Trier par prenom donne ici Adam, Lina, Lina, Noé, Sara. Pour rendre déterministe l’ordre de personnes partageant un prénom, on peut ajouter id_membre comme second critère.
Sans ORDER BY, une requête ne garantit pas l’ordre des lignes, même si un outil semble toujours les montrer dans l’ordre d’insertion. La collation du SGBD détermine certains détails du tri textuel. Les exercices utilisent des noms dont l’ordre usuel est clair ; il faut annoncer une convention pour des comparaisons linguistiques plus délicates.
Supprimer les répétitions du résultat
DISTINCT élimine les lignes identiques du résultat projeté. SELECT DISTINCT prenom ne montre Lina qu’une fois. Avec SELECT DISTINCT id_membre, prenom, les deux Lina restent présentes puisque les couples comportent des identifiants différents. DISTINCT n’efface aucune inscription dans la base.
Pour raisonner, on peut imaginer sélectionner la relation, filtrer les lignes, choisir les colonnes, éliminer les doublons demandés puis trier. Cette lecture logique aide à prévoir le résultat ; elle ne prétend pas décrire le plan physique réellement choisi par le SGBD pour exécuter la requête.
Les doublons sont définis sur toutes les colonnes projetées ensemble. Deux membres différents peuvent produire deux lignes identiques si l’on ne sélectionne que leur prénom. Ajouter leur identifiant rend les lignes différentes, même avec DISTINCT. Avant de supprimer des doublons, précisez donc ce qu’une ligne du résultat est censée représenter.
Exemple suivi : filtrer avant de projeter
La requête SELECT prenom FROM Membre WHERE id_membre >= 103 ORDER BY prenom; conserve Sara 103, Lina 104 et Adam 105. Elle projette leurs prénoms puis les présente dans l’ordre Adam,Lina,Sara. Le filtre utilise l’identifiant même si cet attribut n’apparaît pas dans le résultat final.
Ajoutons AND niveau = 'Terminale' : Lina 104 est écartée et il reste Adam,Sara. Remplaçons au contraire AND par OR : Lina 101 passe grâce au niveau, Sara 103 et Adam 105 passent les deux conditions, Lina 104 passe grâce à son identifiant. Le résultat contient quatre personnes. Le nombre de lignes constitue un contrôle utile, mais il faut également vérifier leurs identités pour détecter un remplacement accidentel de lignes.
Construire un ordre déterministe et un résultat vide
Pour ordonner les personnes par prénom puis identifiant, utilisez ORDER BY prenom ASC, id_membre ASC. Les deux Lina sont départagées par 101 puis 104. Le second critère n’annule pas le premier : il intervient seulement lorsque les prénoms sont égaux. Si l’on ne projette que le prénom, cette distinction interne ne se voit pas, mais elle peut compter lorsque d’autres informations sont affichées.
Un filtre peut ne retenir aucune ligne, par exemple id_membre >= 106 sur les données de cette page. Le résultat vide reste une réponse valide de consultation, avec les colonnes demandées. Il ne signifie ni que la relation a disparu ni que la syntaxe est incorrecte. Distinguez donc le schéma du résultat, son contenu et son ordre, puis comparez chaque dimension à la question posée.
À vous de faire varier les choses
Composez votre sélection
Choisissez le niveau, un seuil d’identifiant et le dédoublonnage. Le laboratoire construit une requête encadrée et calcule son résultat sur les cinq membres du cours.
Lire le résultat de l’expérience initiale
5 ligne(s) dans le résultat.
Le calcul reproduit cette requête sur les seules données du cours ; ce formulaire n’est pas un interpréteur SQL général.
| prenom |
|---|
| Adam |
| Lina |
| Lina |
| Noé |
| Sara |
Chaque clause modifie une propriété précise du résultat sans altérer les données consultées.
De la compréhension à l’autonomie
À vous de résoudre
Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.
Une projection simple
Avec les données du cours, quels prénoms renvoie une sélection des membres de Terminale, triée par prénom croissant ?
Indice 1
Lina 101, Sara 103 et Adam 105 passent le filtre.
Indice 2
Le tri intervient sur leurs prénoms.
Comprendre la correction
Le résultat est Adam, Lina, Sara. Une requête possible est SELECT prenom FROM Membre WHERE niveau = 'Terminale' ORDER BY prenom ASC;. Noé et la Lina de Première ne satisfont pas le filtre, même si leur prénom existe ailleurs dans la relation.
Le sens de DISTINCT
Comparez le nombre de lignes de SELECT prenom et SELECT DISTINCT prenom sur toute la relation.
Indice 1
Deux membres portent le prénom Lina.
Indice 2
DISTINCT concerne les valeurs effectivement sélectionnées.
Comprendre la correction
La première requête renvoie cinq lignes. La seconde en renvoie quatre : Adam, Lina, Noé et Sara, si l’on ajoute un tri alphabétique. La seconde ne supprime aucun membre ; elle élimine seulement la répétition du prénom dans ce résultat.
AND ou OR ?
On veut les membres de Terminale dont l’identifiant est au moins 103. Un élève utilise OR entre les deux conditions. Pourquoi le résultat est-il trop large ?
Indice 1
OR accepte une ligne satisfaisant seulement une condition.
Indice 2
Testez Lina 101 et Lina 104.
Comprendre la correction
Avec OR, Lina 101 passe grâce au niveau et Lina 104 grâce à l’identifiant. Pourtant chacune échoue à l’une des conditions demandées. Il faut AND pour conserver seulement Sara 103 et Adam 105, qui respectent les deux critères simultanément.
Un ordre observé ne suffit pas
Une requête sans ORDER BY affiche aujourd’hui les identifiants croissants. Peut-on promettre cet ordre à un programme qui utilise le résultat ?
Indice 1
Le résultat logique ne définit pas une position implicite.
Indice 2
Une clause existe précisément pour demander un ordre.
Comprendre la correction
Non. L’ordre doit être exprimé avec ORDER BY id_membre. Un changement de données, d’index ou de stratégie d’exécution peut modifier une restitution non triée. Le contrat du programme doit s’appuyer sur une garantie explicite, pas sur une observation ponctuelle.
Comparer AND et OR sur les données
Sur Membre, comparez niveau = 'Terminale' AND id_membre >= 103 et la même condition avec OR. Donnez les identifiants retenus dans chaque cas, puis une requête triant leurs prénoms par ordre croissant.
Indice 1
Testez séparément les deux Lina.
Indice 2
Les identifiants 103 et 105 vérifient les deux conditions.
Comprendre la correction
AND retient 103 et 105. OR retient 101,103,104,105. On peut écrire SELECT prenom FROM Membre WHERE niveau = 'Terminale' OR id_membre >= 103 ORDER BY prenom ASC;, qui affiche Adam,Lina,Lina,Sara. Le filtre plus large correspond à une autre demande.
DISTINCT dépend des colonnes
Sur toute la relation, comparez les nombres de lignes de SELECT prenom, SELECT DISTINCT prenom et SELECT DISTINCT id_membre, prenom, chaque fois depuis Membre. Expliquez pourquoi les deux personnes nommées Lina ne disparaissent pas de la base.
Indice 1
Les clés primaires sont toutes distinctes.
Indice 2
DISTINCT agit seulement sur les lignes projetées.
Comprendre la correction
Les comptes sont 5,4,5. Les deux prénoms Lina produisent une répétition dans la projection à une colonne, mais les couples (101,Lina) et (104,Lina) diffèrent. Aucune requête SELECT ne modifie les tuples enregistrés : l’élimination concerne uniquement le résultat.
Un tri et un filtre sans ambiguïté
Écrivez une requête affichant identifiant et prénom des membres de Première, d’abord par prénom croissant puis par identifiant croissant. Donnez le résultat et expliquez ce qui change si le filtre exige en plus un identifiant au moins égal à 105.
Indice 1
Les membres de Première sont 102 et 104.
Indice 2
Le second filtre peut éliminer tous les candidats.
Comprendre la correction
La requête est SELECT id_membre, prenom FROM Membre WHERE niveau = 'Première' ORDER BY prenom, id_membre;. Elle affiche (104,Lina), puis (102,Noé). Avec la condition supplémentaire AND id_membre >= 105, aucune ligne ne reste. Le résultat vide conserve ses deux colonnes et n’efface aucune donnée.
Les erreurs qui méritent un détour
- Utiliser
DISTINCTpour masquer un filtre incorrect. - Le dédoublonnage ne corrige pas la sélection des personnes. Vérifiez d’abord les conditions et les colonnes.
- Confondre ordre de saisie et ordre garanti.
ORDER BYexprime le tri demandé ; sans lui, il faut accepter toute restitution conforme des lignes.
La fiche à garder
L’essentiel à retenir
SELECTchoisit les colonnes,WHEREfiltre les lignes.DISTINCTagit sur les lignes du résultat.ORDER BYrend le tri explicite.
Cette notion au bac
Retrouvez ces idées dans un sujet complet, avec des indices, une correction expliquée et des ateliers.
- Bac 2026 · Métropole · Jour 2 : Covoiturage : requêtes SQL, files et point de rendez-vous
- Bac 2026 · Centres étrangers groupe 1 · Jour 2 : VintagePixel : collection relationnelle et choix des routes
- Bac 2026 · Amérique du Nord · Jour 1 : Immeubles : SQL et plus longue sous-séquence croissante
- Bac 2026 · Amérique du Nord · Jour 2 : Course à pied : inscriptions SQL, moyennes et records
Le prochain pas
Retrouver le catalogue de Terminale
Ce chapitre s’appuie sur le programme officiel de Terminale (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.
