ESSENTIEL - Les requêtes SQL
Un tableur donne une photographie ponctuelle d'un tableau de chiffres ; une base de données relationnelle, elle, héberge l'ensemble des informations d'une organisation, et c'est en SQL qu'on va y chercher exactement ce dont on a besoin.
Longtemps réduite à quelques questions isolées, cette compétence occupe aujourd'hui une place centrale dans les épreuves de gestion : le schéma relationnel, les requêtes SQL et les formules Excel figurent dans la quasi-totalité des sujets du DCG (UE8, Systèmes d'information de gestion) et du BTS Comptabilité et Gestion (processus 7).
La réforme du DCG, applicable à la session 2027, en profite pour actualiser la norme SQL attendue : c'est ce qui a changé, et pourquoi, que cet essentiel se propose de clarifier.
Le principe
Une base de données relationnelle organise l'information en tables (ou relations), chacune correspondant à une entité de gestion (CLIENT, COMMANDE, PRODUIT...).
Chaque table est identifiée par une clé primaire, qui garantit l'unicité de chaque enregistrement, et les tables sont reliées entre elles par des clés étrangères, qui reprennent dans une table la clé primaire d'une autre pour matérialiser une relation (un client passe des commandes, une commande porte sur des produits).
Le langage SQL (Structured Query Language) permet d'interroger cette structure,
- en lecture avec l'instruction SELECT, et de la faire évoluer
- en écriture avec les instructions INSERT, UPDATE et DELETE, regroupées sous le nom de langage de manipulation des données (LMD).
Les grandes clauses de l'instruction SELECT
| Clause | Rôle |
| SELECT | liste les colonnes (ou expressions calculées) que la requête doit renvoyer |
| FROM | indique la ou les tables interrogées |
| WHERE | filtre les lignes selon une ou plusieurs conditions (avant tout regroupement) |
| GROUP BY | regroupe les lignes filtrées par valeur commune, en vue d'un calcul par groupe |
| HAVING | filtre les groupes obtenus après un GROUP BY (l'équivalent du WHERE, mais après regroupement) |
| ORDER BY | trie le résultat final, en croissant (ASC, par défaut) ou décroissant (DESC) |
Ces clauses s'écrivent toujours dans cet ordre (SELECT... FROM... WHERE... GROUP BY... HAVING... ORDER BY...), même si leur ordre d'exécution logique par le SGBD est différent (FROM et WHERE sont évalués avant SELECT).
SQL-92 : ce qui change dans la norme attendue à l'examen
Jusqu'à présent, une jointure entre deux tables pouvait s'écrire de façon « implicite », en listant simplement les tables dans le FROM et en posant la condition de rapprochement dans le WHERE.
La réforme du DCG (arrêté du 4 août 2025, programme applicable à la session 2027) impose désormais le passage du SQL-89 (l'ancienne norme, encore tolérée dans une partie des sujets 2025-2026) au SQL-92, qui impose l'écriture explicite des jointures avec le mot-clé JOIN.
| Ancienne écriture (SQL-89, jointure implicite) | Écriture attendue (SQL-92, jointure explicite) | |
| Principe | les tables sont juxtaposées dans le FROM, séparées par une virgule ; la condition de rapprochement est noyée dans le WHERE, au même niveau que les filtres | la jointure fait l'objet d'une clause dédiée (INNER JOIN, LEFT JOIN, RIGHT JOIN...) avec sa condition introduite par ON ; le WHERE ne sert plus qu'aux filtres |
| Lisibilité | condition de jointure et condition de filtre indissociables au premier coup d'œil | la structure de la requête distingue immédiatement « comment les tables se relient » et « ce qu'on filtre » |
| Jointures externes | syntaxe non standard, dépendante du SGBD (ex. (+) sous Oracle) | LEFT JOIN / RIGHT JOIN normalisés, portables d'un SGBD à l'autre |
Voir le mémo dédié « Jointures SQL : implicite (WHERE) ou explicite (JOIN) » pour le détail des trois types de jointure (INNER, LEFT, RIGHT) et des exemples chiffrés.
Les opérateurs du WHERE (et du HAVING)
| Catégorie | Opérateurs | Exemple |
| Comparaison | =, <>, <, >, <=, >= | villeclient = 'Rouen' |
| Ensemble de valeurs | IN (...) | codecat IN ('P', 'R') |
| Intervalle | BETWEEN ... AND ... | montant BETWEEN 500 AND 1000 |
| Motif texte | LIKE (jokers % et _) | nomclient LIKE 'B%' |
| Valeur absente | IS NULL / IS NOT NULL | telclient IS NULL |
| Combinaison logique | AND, OR, NOT | codecat = 'R' AND numcom = '01' |
Cas particuliers
| Situation | Ce qu'il faut retenir | Pour aller plus loin |
| Requête portant sur plusieurs tables liées | utiliser une jointure explicite (INNER JOIN par défaut, LEFT/RIGHT JOIN pour conserver les lignes sans correspondance) | Mémo « Jointures SQL : implicite (WHERE) ou explicite (JOIN) » |
| Calcul par groupe (total par client, nombre de commandes par commercial...) | combiner une fonction d'agrégation (SUM, COUNT...) avec GROUP BY, et filtrer les groupes avec HAVING (jamais WHERE) | Mémo « GROUP BY et fonctions d'agrégation SQL » |
| Condition qui dépend du résultat d'une autre requête | imbriquer une sous-requête (SELECT dans le WHERE, avec IN, EXISTS ou un opérateur de comparaison) | Mémo « Les sous-requêtes SQL » |
| Créer, modifier ou supprimer des données (pas seulement les consulter) | utiliser le langage de manipulation des données : INSERT INTO, UPDATE... SET, DELETE FROM | Mémo « INSERT, UPDATE, DELETE : le langage de manipulation des données » |
Erreurs fréquentes et bons réflexes
| Erreur | Conséquence | Bon réflexe |
| Écrire une jointure « à l'ancienne » (virgule dans le FROM, condition dans le WHERE) | requête non conforme à la norme SQL-92 attendue depuis la réforme 2027 du DCG, points perdus même si le résultat est juste | toujours écrire la jointure avec INNER JOIN / LEFT JOIN / RIGHT JOIN ... ON ... |
| Filtrer un groupe avec WHERE au lieu de HAVING | erreur de syntaxe : WHERE s'applique avant le regroupement, il ne peut pas porter sur le résultat d'une fonction d'agrégation | réserver WHERE aux filtres sur les lignes brutes, HAVING aux filtres sur les groupes |
| Oublier la clé primaire dans un INSERT alors qu'elle n'est pas auto-incrémentée | rejet de la requête par le SGBD (contrainte d'unicité violée) ou clé NULL non autorisée | toujours vérifier si la clé primaire doit être fournie explicitement ou est générée automatiquement |
| Tester une valeur absente avec = NULL | la condition ne renvoie jamais vrai, même quand la valeur est réellement absente | utiliser IS NULL / IS NOT NULL |
| Modifier ou supprimer des données sans clause WHERE | UPDATE ou DELETE s'applique à toutes les lignes de la table, pas seulement à celle visée | toujours vérifier la présence et la portée exacte du WHERE avant de valider un UPDATE ou un DELETE |
Bonnes pratiques
Une requête SQL correcte à l'examen n'est pas seulement une requête qui « donne le bon résultat » : elle doit aussi respecter la syntaxe et la norme attendues.
| Bon réflexe | Pourquoi ? |
| Systématiquement écrire les jointures en SQL-92 (JOIN ... ON ...) | c'est la norme désormais exigée par le programme DCG UE8 (réforme 2027) et déjà la meilleure pratique professionnelle |
| Terminer chaque requête par un point-virgule | convention attendue par la plupart des correcteurs et des SGBD en mode multi-requêtes |
| Utiliser des alias de table lisibles (ex. C pour CLIENT) dès que plusieurs tables sont jointes | évite les ambiguïtés de colonnes portant le même nom dans deux tables et allège l'écriture |
| Vérifier la portée d'un UPDATE ou d'un DELETE avant de le valider | ces instructions modifient réellement les données ; une clause WHERE absente ou mal ciblée est irréversible |
En résumé
| Principe | Ce qu'il impose |
| Intégrité référentielle | une clé étrangère ne peut référencer qu'une valeur existant réellement comme clé primaire dans la table référencée |
| Unicité de la clé primaire | aucun doublon, aucune valeur vide : c'est elle qui garantit qu'un enregistrement est identifiable sans ambiguïté |
| Séparation lecture / écriture | le SELECT (interrogation) et le LMD — INSERT, UPDATE, DELETE (modification) — répondent à des logiques et des risques différents |
| Conformité à la norme d'examen | à partir de la session 2027 du DCG, une requête doit respecter le SQL-92 (jointures explicites) pour être pleinement valorisée |
Dans la bibliothèque Rodco
Mémos
- Jointures SQL : implicite (WHERE) ou explicite (JOIN)
- GROUP BY et fonctions d'agrégation SQL
- Les sous-requêtes SQL » et « INSERT, UPDATE, DELETE : le langage de manipulation des données ».



