Interroger les données avec SQL

Choisir des colonnes, filtrer les lignes, trier et joindre des tables pour répondre à une question de gestion.

Environ 35 minutes

  • Traduire un besoin en requête SELECT
  • Distinguer projection et restriction
  • Combiner des conditions et un tri
  • Expliquer les lignes produites par une jointure
Sommaire
  1. 1. Décrire le résultat attendu
  2. 2. Construire et vérifier les conditions
  3. 3. Rapprocher les données par leur clé
  4. 4. Contrôler le sens du résultat

Une liste de commandes est-elle aussi une liste de clients différents ?

La boutique fictive Traverse veut retrouver ses clients par ville et consulter leurs commandes. Les deux tables de la leçon suffisent pour tester les requêtes sans intervenir sur une base réelle. Les identifiants, noms et montants sont fictifs. On utilise CLIENT(id_client, nom, ville) et COMMANDE(id_commande, id_client, montant), où chaque commande référence un client.

1. Décrire le résultat attendu

SQL permet notamment d’interroger des données relationnelles. Une requête SELECT décrit les colonnes et les lignes souhaitées ; le SGBD choisit un plan d’exécution. La lecture ne modifie pas les tables. Avant d’écrire, précise ce que représente une ligne du résultat : un client, une commande ou une combinaison de données. Cette question évite de confondre le nombre de lignes obtenues avec le nombre de personnes concernées.

La ville peut être partagée par plusieurs clients ; l’identifiant distingue les lignes.

SELECT indique les colonnes à afficher et FROM la table source. La projection choisit les attributs. La restriction retient les lignes qui satisfont une condition exprimée avec WHERE. Ces opérations sont différentes : demander seulement les noms ne signifie pas sélectionner seulement certains clients. SELECT nom FROM CLIENT conserve ici une ligne par client tout en affichant une seule colonne. Les valeurs identiques ne disparaissent pas automatiquement.

Les mots-clés SQL sont écrits en majuscules pour faciliter la lecture ; ce choix ne change pas le sens des requêtes présentées. Les textes constants sont délimités par des apostrophes simples, comme la ville Lyon. Les nombres s’écrivent sans guillemets. Les noms de colonnes doivent correspondre au schéma. Les requêtes ci-dessous sont exécutables séparément ; on peut les terminer par un point-virgule dans un outil SQL.

Exemple résolu

Affiche les noms et villes des clients de Lyon, dans l’ordre alphabétique des noms. Déduis le résultat à partir de la table.

  1. Étape 1 : Une ligne du résultat représente un client. Les colonnes nécessaires sont nom et ville, dans CLIENT.
  2. Étape 2 : La condition ville égale Lyon ne retient que les identifiants 1 et 3.
  3. Étape 3 : Le tri croissant du nom place Aube avant Cime. La requête renvoie (Aube, Lyon), puis (Cime, Lyon).

Résultat : SELECT nom, ville FROM CLIENT WHERE ville = 'Lyon' ORDER BY nom ASC

Piège à éviter : Choisir les colonnes nom et ville sans WHERE afficherait aussi les clients des autres villes.

À toi d'essayer

Écris une requête affichant les noms des clients de Paris ou de Lille, triés par nom. Donne le résultat attendu.

Voir la réponse

SELECT nom FROM CLIENT WHERE ville IN ('Paris', 'Lille') ORDER BY nom ASC Résultat : Borel, puis Dune.

2. Construire et vérifier les conditions

Les comparaisons comprennent l’égalité, la différence, les inégalités strictes et les inégalités larges. Un seuil supérieur à 40 exclut 40 ; un seuil supérieur ou égal à 40 le conserve. BETWEEN inclut les deux bornes dans les usages présentés. IN teste l’appartenance à une liste. Une donnée absente représentée par NULL se teste avec IS NULL ou IS NOT NULL, pas avec une égalité ordinaire.

Deux commandes appartiennent au client 1 ; le client 4 n’a aucune commande dans ces données.

AND exige que les deux conditions soient vraies ; OR en admet au moins une ; NOT inverse une condition selon les règles logiques de SQL. Les parenthèses rendent le sens explicite, notamment lorsqu’on mélange AND et OR. Par exemple, on peut rechercher les commandes dont le client est 1 ou 2 et dont le montant dépasse un seuil. Sans parenthèses adaptées, la condition sur le montant peut ne s’appliquer qu’à une partie des cas.

LIKE compare un texte à un motif. Le caractère pourcentage représente une suite de zéro ou plusieurs caractères ; le souligné représente un seul caractère. Un motif commençant par Dup ne sélectionne pas Durand, car son début est différent. Les règles de comparaison des majuscules et accents peuvent dépendre du SGBD et de sa configuration. Un résultat se vérifie donc sur les données et l’environnement utilisés, sans supposer une règle universelle.

Exemple résolu

Affiche les identifiants et montants des commandes d’au moins 80 €, de la plus élevée à la plus faible. En cas d’égalité, utilise l’identifiant croissant.

  1. Étape 1 : Les montants admissibles sont 80 et 120. Les commandes de 40 et 20 ne satisfont pas la condition.
  2. Étape 2 : ORDER BY montant DESC place 120 avant 80. Le deuxième critère id_commande ASC stabilise l’ordre entre montants égaux.
  3. Étape 3 : Le résultat attendu est (102, 120), puis (101, 80).

Résultat : SELECT id_commande, montant FROM COMMANDE WHERE montant >= 80 ORDER BY montant DESC, id_commande ASC

Piège à éviter : Un tri croissant afficherait d’abord 80 ; le filtre et le sens du tri répondent à deux choix distincts.

À toi d'essayer

Compare les commandes retenues par montant > 40 et par montant >= 40. Pourquoi le dossier doit-il préciser si le seuil est strict ?

Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.

3. Rapprocher les données par leur clé

Une jointure combine des lignes selon une condition de correspondance. Pour afficher le nom du client avec une commande, il faut relier COMMANDE.id_client à CLIENT.id_client. Le nom n’est pas une clé fiable : deux clients pourraient porter le même nom. Le rapprochement repose sur la signification des identifiants et sur les règles du modèle, pas sur une ressemblance visuelle entre deux valeurs.

INNER JOIN ne conserve que les correspondances. Un client qui possède deux commandes apparaît sur deux lignes du résultat quand on affiche une ligne par commande. Un client sans commande n’apparaît pas. La jointure ne se comprend donc pas comme une simple liste de personnes présentes dans deux ensembles : chaque paire de lignes compatible produit une ligne. Oublier la condition peut multiplier artificiellement les combinaisons.

Exemple résolu

Affiche chaque identifiant de commande avec le nom du client et le montant, dans l’ordre des commandes. Explique pourquoi Aube apparaît deux fois.

  1. Étape 1 : La table COMMANDE reçoit l’alias o et CLIENT l’alias c ; ces noms courts servent à qualifier les colonnes.
  2. Étape 2 : La condition o.id_client = c.id_client associe chaque commande à son client.
  3. Étape 3 : Les lignes attendues sont (101, Aube, 80), (102, Aube, 120), (103, Borel, 40) et (104, Cime, 20). Aube a deux commandes.

Résultat : SELECT o.id_commande, c.nom, o.montant FROM COMMANDE AS o INNER JOIN CLIENT AS c ON o.id_client = c.id_client ORDER BY o.id_commande

Piège à éviter : La répétition d’un nom n’est pas forcément une erreur : il faut savoir ce que représente chaque ligne.

Les alias améliorent la lisibilité et évitent l’ambiguïté quand deux tables contiennent un attribut de même nom. Ils ne changent ni les données ni les droits d’accès. Dans la requête précédente, écrire seulement id_client serait ambigu parce que les deux sources possèdent cette colonne. Une qualification explicite permet de vérifier plus facilement le lien utilisé et les colonnes affichées.

À toi d'essayer

Un collègue obtient quatre lignes après la jointure et affirme que les quatre clients ont commandé. Réfute son raisonnement avec les données. Quelle propriété doit avoir une requête destinée à afficher tous les clients, même sans commande ?

Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.

4. Contrôler le sens du résultat

Sans ORDER BY, aucun ordre du résultat ne doit être supposé. Même si un outil affiche souvent les lignes selon l’identifiant, cet affichage n’est pas une garantie. Un tri sur plusieurs colonnes s’applique successivement : la seconde départage les égalités de la première. Le choix du tri facilite la lecture, mais ne remplace pas le filtre. Les lignes exclues par WHERE ne réapparaissent pas parce qu’on change leur ordre.

DISTINCT élimine les doublons sur l’ensemble des colonnes affichées. Il peut être utile pour obtenir une liste de villes différentes, mais il ne doit pas masquer une mauvaise jointure. Deux clients différents peuvent partager le même nom ; ne sélectionner que ce nom avec DISTINCT peut les fusionner dans le résultat affiché. La distinction des personnes doit s’appuyer sur leur identifiant quand elle est nécessaire.

Une requête syntaxiquement correcte peut répondre à une mauvaise question. Il faut comparer le résultat à quelques cas connus : une ligne retenue, une ligne exclue, une valeur exactement au seuil et une absence de correspondance. Un petit jeu fictif rend ce contrôle possible. Les montants de cette leçon sont des euros entiers ; dans un autre dossier, il faut préciser la monnaie, le périmètre et la signification du montant avant d’en tirer une décision commerciale.

Au bac : expliquer une requête de gestion

  1. Annonce l’unité de résultat et les colonnes attendues avant d’écrire SQL.
  2. Repère les tables et les clés ; écris la condition de jointure lorsqu’il faut plusieurs sources.
  3. Traduis les conditions avec leurs bornes, puis ajoute un tri seulement s’il est demandé ou utile.
  4. Vérifie quelques lignes manuellement et formule une conclusion métier. Cette méthode prépare l’analyse et le projet ; elle ne suppose pas une épreuve écrite autonome de SIG.
Attention :

Erreurs fréquentes : confondre colonnes et lignes ; oublier une borne incluse ; tester NULL avec une égalité ; joindre sur un nom ; compter des commandes comme des clients ; supposer un ordre sans ORDER BY.

Vocabulaire

Projection :
Choix des colonnes du résultat.
Restriction :
Sélection des lignes selon une condition.
Jointure :
Combinaison de lignes de plusieurs sources selon une correspondance.
Alias :
Nom court utilisé dans une requête pour une table ou une expression.

Bilan

RepèreSens pour la gestion
SELECT et FROMDéfinissent les colonnes et les sources.
WHERERetient les lignes qui vérifient les conditions.
JOIN et ORDER BYRelient les données et organisent le résultat sans changer sa signification métier.

Pour poursuivre : https://www.allostmg.fr/exercices.

À retenir

  • SELECT décrit le résultat d’une lecture des données.
  • WHERE filtre des lignes ; la projection choisit des colonnes.
  • Une jointure produit une ligne par correspondance.
  • ORDER BY est nécessaire pour demander un ordre déterminé.

Fiche de révision

Commence par définir une ligne

client ou commande ne sont pas interchangeables.

Pour un seuil, teste la valeur frontière et une valeur de chaque côté.

Lors d’un rapprochement, vérifie la clé et explique les répétitions obtenues.

Contrôle un cas sans correspondance

son absence peut être attendue ou révéler un mauvais choix de jointure.

Et maintenant ?

Tu as lu le cours. L’étape suivante tient en une action.

Relis le coursLes exercices de ce chapitre arrivent bientôt.

Prolonge l’expérience !

Continue à explorer ce chapitre à travers de nouvelles activités, des défis et des expériences interactives. Avec Premium, l’apprentissage continue !

Ici, tu débloques aussi 2 corrections détaillées.

Parent ? Suivez les progrès de votre enfant.

Tous les cours de Systèmes d’information de gestion