Écrire du SQL · Chapitre 5
Premiers pas en SQL
Le SQL (Structured Query Language) est le langage qui permet d'interroger et de manipuler les bases de données relationnelles. Il a été créé au début des années 1970 chez IBM et reste, cinquante ans plus tard, le langage commun de tous les métiers de la data.
La requête
Une requête (query en anglais) est une instruction envoyée à la base de données. Elle décrit ce que tu veux obtenir, pas comment l'obtenir : c'est le SGBD qui se charge du reste.
SELECT ProductID, Category, SubCategory, Brand
FROM productCette requête affiche les colonnes ProductID, Category, SubCategory et Brand de la table product. Clique sur ▶ Exécuter pour voir le résultat.
SELECTindique les colonnes à afficher ;FROMindique la table où elles se trouvent.
Les requêtes servent à répondre à des questions concrètes : quels sont les 5 produits les plus vendus l'an dernier ? Ont-ils gardé leur place par rapport à l'année précédente ? Quel chiffre d'affaires ont-ils rapporté ? À la fin de ce livre, tu sauras répondre à chacune de ces questions.
Les clauses
Une requête est composée de clauses : des mots-clés qui ont chacun un rôle précis. Dans les blocs de code, elles apparaissent en couleur. Nous en connaissons déjà deux, indispensables à toute requête de lecture : SELECT et FROM.
Plus la question est complexe, plus la requête utilisera de clauses : WHERE pour filtrer, GROUP BY pour regrouper, ORDER BY pour trier… Nous les verrons une par une.
Les données de ce chapitre
Les exemples des prochains chapitres utilisent la base controlGest, celle d'un grossiste en café. Il achète ses produits auprès des torréfacteurs et des fabricants, puis les revend aux enseignes (grande distribution, magasins de proximité, e-commerce, restauration).
Trois familles de tables suffisent pour commencer :
customer: les clients ;product: les produits vendus ;perform21àperform26: les ventes, une table par année de 2021 à 2026. Chaque ligne donne, pour un client, un produit et un mois, le volume vendu, le chiffre d'affaires, le coût et la marge.
Les blocs ci-dessous affichent les 3 premières lignes de chaque table.
La table customer
SELECT *
FROM customer
LIMIT 3| Colonne | Signification |
|---|---|
CustomerID |
Identifiant unique du client |
CustomerName |
Nom du client |
KeyAccount |
Commercial responsable du compte |
StrategicCustomer |
Client stratégique (Yes ou No) |
Channel, Country, City |
Canal de vente, pays et ville du siège |
CreatedOn |
Date d'ouverture du compte |
PaymentTermsDays |
Délai de paiement accordé, en jours |
La table perform21
SELECT *
FROM perform21
LIMIT 3| Colonne | Signification |
|---|---|
CustomerID |
Le client (son identifiant dans customer) |
ProductID |
Le produit (son identifiant dans product) |
VolKilo (COPA) |
Volume vendu, en kilogrammes |
NOS (COPA) |
Net Operating Sales : le chiffre d'affaires |
COGS (COPA) |
Cost Of Goods Sold : le coût d'achat des produits vendus, en négatif |
GP (COPA) |
Gross Profit : la marge brute, c'est-à-dire NOS + COGS |
Year, Date |
L'année et le mois (le premier jour du mois) |
La table product
SELECT *
FROM product
LIMIT 3| Colonne | Signification |
|---|---|
ProductID |
Identifiant unique du produit |
Category, SubCategory |
Catégorie et sous-catégorie |
Brand, Variety, Designation |
Marque, variété et désignation |
LaunchDate, Status |
Date de lancement ; Active ou Discontinued (plus vendu) |
PackWeightG, UnitsPerCase |
Poids d'un paquet (g) et nombre de paquets par carton |
Intensity, Origin, IsOrganic |
Intensité du café (1 à 13), origine, bio ou non |
La base contient d'autres tables (commerciaux, budgets, tarifs, promotions, calendrier) que nous utiliserons plus loin. Tu peux toutes les explorer avec le bouton Tables de la console.
Lire une requête pas à pas
Reprenons la première requête :
SELECT ProductID, Category, SubCategory, Brand
FROM productElle demande à la base d'afficher l'identifiant, la catégorie, la sous-catégorie et la marque de tous les produits de la table product. Elle comporte deux clauses.
SELECT
SELECT liste les colonnes à inclure dans le résultat, séparées par des virgules. Ici : ProductID, Category, SubCategory et Brand. Pour afficher toutes les colonnes sans les nommer, on écrit SELECT *.
FROM
FROM indique la table dans laquelle on lit les données, ici product.
Dans la console, tu peux écrire le nom de la table seul (product) ou le préfixer par le nom de sa base (controlGest.product). Les deux désignent la même table.
Les commentaires
Un commentaire est un texte que le SGBD ignore. Il sert à expliquer l'intention d'une requête à la personne qui la relira, y compris toi dans trois mois. Une ligne mise en commentaire n'est plus exécutée : c'est aussi un moyen pratique de désactiver une partie d'une requête pour tester.
Il existe deux façons d'écrire un commentaire :
Sur une ligne, avec deux tirets -- : tout ce qui suit sur la même ligne est ignoré.
-- Liste des produits avec leur catégorie et leur marque
SELECT ProductID, Category, SubCategory, Brand
FROM productSur plusieurs lignes, entre /* et */ :
/* Liste des produits avec leur catégorie et leur marque.
Utilisée pour vérifier le référentiel produit. */
SELECT ProductID, Category, SubCategory, Brand
FROM productBien présenter une requête
Une requête se lit plus souvent qu'elle ne s'écrit. Quelques conventions la rendent lisible par toute l'équipe :
- les mots-clés (
SELECT,FROM…) en majuscules ; - une clause par ligne, chacune au début de sa ligne ;
- les noms de tables et de colonnes écrits exactement comme dans la base.
Question 5.1
Affiche les colonnes CustomerID, CustomerName et StrategicCustomer de la table customer.
Ta réponse
-- Question 5.1 : écris ta requête ici
SELECT Voir la solution
SELECT CustomerID, CustomerName, StrategicCustomer
FROM customerOn liste les trois colonnes dans le SELECT, séparées par des virgules, et la table dans le FROM. Le résultat compte une ligne par client, soit 32 lignes. Les clients 17 et 18 n'ont ni nom ni statut : ce sont des valeurs manquantes (NULL), nous verrons comment les repérer au chapitre 7.
Question 5.2
Affiche le nom de chaque commercial (KeyAccount) et le nom des clients dont il s'occupe (CustomerName), à partir de la table customer.
Ta réponse
-- Question 5.2 : écris ta requête ici
SELECT Voir la solution
SELECT KeyAccount, CustomerName
FROM customerL'ordre des colonnes dans le SELECT est l'ordre d'affichage : ici le commercial d'abord, le client ensuite.
Question 5.3
Affiche toutes les colonnes de la table key_account, qui décrit les commerciaux. Combien de personnes compte l'équipe commerciale ?
Ta réponse
-- Question 5.3 : écris ta requête ici
SELECT Voir la solution
SELECT *
FROM key_accountL'étoile * affiche toutes les colonnes. La console indique 9 lignes : l'équipe compte 9 personnes, dont Hélène, la directrice commerciale (sa colonne Manager est vide car elle n'a pas de responsable).