Les requêtes SQL de base pour le DCG : SELECT, FROM, WHERE
Interroger une base de données, c'est lui poser une question précise : quels clients habitent à Lyon ? Quels produits coûtent plus de 50 euros ? Pour formuler ces questions, on utilise le SQL, et toute requête SQL SELECT FROM WHERE repose sur la même structure en trois temps. C'est le sujet le plus technique et le plus fréquent de l'épreuve de l'UE 8 du DCG : le maîtriser, avec des exemples, est un investissement directement rentable le jour de l'examen.
Le vocabulaire de base à connaître
Avant d'écrire la moindre requête, cinq termes sont indispensables :
- Table : un tableau d'informations, comparable à une feuille de calcul (la table CLIENT contient tous les clients).
- Ligne (ou enregistrement, ou tuple) : une fiche concrète, par exemple un client donné.
- Colonne (ou attribut, ou champ) : une rubrique identique pour toutes les lignes, comme la ville ou le prix.
- Clé primaire : la colonne qui identifie chaque ligne de façon unique (un numéro de client) ; jamais deux lignes avec la même valeur.
- NULL : l'absence de valeur, une case vide. Attention : ce n'est ni le chiffre 0 ni un texte vide.
Nos exemples s'appuient sur une base de gestion commerciale classique : CLIENT(NumClient, Nom, Prenom, Ville, CodePostal), PRODUIT(CodeProduit, Libelle, PrixHT, CodeCategorie) et COMMANDE(NumCommande, DateCommande, NumClient).
La requête SQL SELECT FROM WHERE : la syntaxe
Construire une requête d'interrogation revient à répondre à trois questions : quelles colonnes afficher (SELECT), dans quelle table les chercher (FROM), quelles lignes conserver (WHERE).
SELECT Nom, Prenom
FROM CLIENT
WHERE Ville = 'Paris' ;
Trois variantes de base à connaître :
SELECT * FROM CLIENT ; -- toutes les colonnes
SELECT DISTINCT Ville FROM CLIENT ; -- élimine les doublons
SELECT Nom AS NomClient FROM CLIENT ; -- alias de colonne
L'étoile (*) sélectionne toutes les colonnes. DISTINCT supprime les lignes identiques du résultat : indispensable, par exemple, pour lister les villes où l'entreprise a des clients sans répéter chaque ville. AS renomme une colonne dans l'affichage du résultat.
Les opérateurs de comparaison du WHERE
La clause WHERE filtre les lignes grâce à des opérateurs qu'il faut connaître par coeur :
- Égalité et différence :
=, <> (ou !=).
- Comparaisons :
<, >, <=, >=, par exemple WHERE PrixHT > 100.
- BETWEEN : entre deux valeurs incluses,
WHERE PrixHT BETWEEN 10 AND 50.
- IN : appartenance à une liste,
WHERE Ville IN ('Paris', 'Lyon', 'Nantes').
- LIKE : ressemblance avec joker,
WHERE Nom LIKE 'Dur%' trouve Durand, Durieux... Le % remplace n'importe quelle séquence de caractères.
- IS NULL / IS NOT NULL : teste l'absence ou la présence de valeur. On n'écrit jamais
= NULL.
- AND, OR, NOT : combinent les conditions,
WHERE PrixHT > 10 AND Ville = 'Paris'.
Trier le résultat avec ORDER BY
La clause ORDER BY trie le résultat, en croissant (ASC, valeur par défaut) ou décroissant (DESC) :
SELECT Libelle, PrixHT
FROM PRODUIT
ORDER BY PrixHT DESC ;
L'ordre d'exécution logique : la clé de compréhension
On écrit la requête en commençant par SELECT, mais la base l'exécute dans un autre ordre : FROM (choix des tables), puis WHERE (filtre des lignes), puis SELECT (choix des colonnes), puis ORDER BY (tri). Comprendre cette logique évite bien des erreurs, notamment celle d'utiliser dans le WHERE un alias défini dans le SELECT. La bonne méthode de réflexion suit cet ordre d'exécution : identifiez d'abord les tables nécessaires, puis les conditions, puis seulement les colonnes à afficher.
Un exemple appliqué : la société Fournitex
Prenons le cas de la société Fournitex, qui vend des fournitures de bureau aux entreprises. Sa table ARTICLE contient notamment : Ramette A4 (4,50 euros, stock 500), Cahier 96p (2,10 euros, stock 300), Stylo bille (0,80 euro, stock 1000), Marqueur (1,50 euro, stock 150) et Classeur (3,20 euros, stock 200).
Le responsable des achats veut identifier les articles à réapprovisionner : ceux dont le stock est strictement inférieur à 200, triés par stock croissant.
SELECT Designation, Stock
FROM ARTICLE
WHERE Stock < 200
ORDER BY Stock ASC ;
Résultat : une seule ligne, Marqueur (150). Le Classeur (200) est exclu car la condition est strictement inférieure. Autre besoin : lister les articles dont la désignation contient la chaîne « eur » :
SELECT Designation
FROM ARTICLE
WHERE Designation LIKE '%eur%' ;
Résultat : Marqueur. Chaque besoin de gestion se traduit ainsi en une phrase SQL : c'est exactement l'exercice attendu à l'examen.
Les erreurs fréquentes
- Écrire
WHERE Email = NULL : NULL n'est pas une valeur comparable ; il faut WHERE Email IS NULL.
- Confondre
= et LIKE : l'égalité est exacte ; chercher 'Dur%' avec = ne trouvera que la chaîne littérale 'Dur%', joker compris.
- Inverser l'ordre des clauses : l'ordre d'écriture SELECT - FROM - WHERE - ORDER BY est imposé par le langage ; l'inverser produit une erreur de syntaxe.
- Oublier les quotes autour des textes :
WHERE Ville = Paris échoue ; il faut WHERE Ville = 'Paris'.
- Confondre strictement inférieur (
<) et inférieur ou égal (<=) : à l'examen, lisez précisément l'énoncé (« moins de », « au plus », « strictement »).
- Oublier DISTINCT quand le besoin demande des valeurs uniques : « la liste des villes » sans DISTINCT affiche chaque ville autant de fois qu'il y a de clients.
FAQ
Dans quel ordre la base exécute-t-elle réellement une requête ?
L'ordre logique d'exécution est : FROM, puis WHERE, puis GROUP BY, puis HAVING, puis SELECT, puis ORDER BY. Il diffère de l'ordre d'écriture, qui commence par SELECT. C'est pourquoi un alias défini dans le SELECT n'est pas utilisable dans le WHERE : au moment où le WHERE s'exécute, l'alias n'existe pas encore.
Quelle est la différence entre BETWEEN et deux comparaisons ?
WHERE PrixHT BETWEEN 10 AND 50 est équivalent à WHERE PrixHT >= 10 AND PrixHT <= 50 : les bornes sont incluses. BETWEEN est simplement plus lisible. Attention donc : si l'énoncé demande « strictement entre », il faut revenir aux comparaisons > et <.
Le joker % fonctionne-t-il en début et en fin de chaîne ?
Oui. LIKE 'Dur%' trouve les noms commençant par Dur ; LIKE '%eur' ceux finissant par eur ; LIKE '%eur%' ceux contenant eur n'importe où. Le joker _ (underscore) remplace quant à lui exactement un caractère.
Entraînez-vous
Sur la base CLIENT(NumClient, Nom, Prenom, Ville, CodePostal) et PRODUIT(CodeProduit, Libelle, PrixHT, CodeCategorie), écrivez les trois requêtes suivantes : 1) tous les produits dont le prix HT dépasse 50 euros ; 2) les clients dont le nom commence par « M » ; 3) les produits dont le prix est compris entre 10 et 30 euros, triés du plus cher au moins cher.
Afficher le corrigé
Question 1 : une restriction simple sur le prix.
SELECT *
FROM PRODUIT
WHERE PrixHT > 50 ;
Question 2 : une recherche par motif avec LIKE et le joker %.
SELECT *
FROM CLIENT
WHERE Nom LIKE 'M%' ;
Le motif 'M%' signifie : un M suivi de n'importe quelle séquence de caractères, donc tous les noms commençant par M.
Question 3 : un intervalle avec BETWEEN, puis un tri décroissant.
SELECT *
FROM PRODUIT
WHERE PrixHT BETWEEN 10 AND 30
ORDER BY PrixHT DESC ;
BETWEEN inclut les bornes (10 et 30 euros sont retenus). DESC trie du plus cher au moins cher ; sans précision, ORDER BY trie en croissant (ASC). Vérifiez toujours ces deux points dans l'énoncé : bornes incluses ou exclues, sens du tri demandé.