Terminale · Bases de données et SQL

SQL : sélectionner, filtrer et trier des résultats

Afficher les prénoms des membres de Terminale dans l’ordre alphabétique demande trois décisions : quelles colonnes montrer, quelles lignes garder et dans quel ordre les restituer. SQL permet d’exprimer ces demandes sans écrire soi-même le parcours de chaque ligne.

SofienAvec SofienIngénieur et enseignant en informatique
Dans ce chapitre

Un cap pour ce chapitre

Ce que vous saurez faire

  • Lire et construire SELECT, FROM et WHERE.
  • Combiner des conditions logiques.
  • Expliquer DISTINCT et ORDER 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_membreprenomniveau
101LinaTerminale
102NoéPremière
103SaraTerminale
104LinaPremière
105AdamTerminale

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.

Exercice 1 · Appliquer#

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.

Exercice 2 · Comprendre#

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.

Exercice 3 · Corriger#

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.

Exercice 4 · Justifier#

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.

Exercice 5 · Approfondir et transférer#

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.

Exercice 6 · Approfondir et transférer#

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.

Exercice 7 · Approfondir et transférer#

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 DISTINCT pour 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 BY exprime le tri demandé ; sans lui, il faut accepter toute restitution conforme des lignes.

La fiche à garder

L’essentiel à retenir

  • SELECT choisit les colonnes, WHERE filtre les lignes.
  • DISTINCT agit sur les lignes du résultat.
  • ORDER BY rend 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.

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.