Écrire du SQL · Chapitre 6
Manipuler les colonnes
Le SELECT ne sert pas qu'à choisir des colonnes : il permet aussi d'en calculer de nouvelles, de les renommer, d'ajouter des constantes et de supprimer les doublons. Ce chapitre présente ces manipulations.
Sélectionner toutes les colonnes
L'étoile * sélectionne toutes les colonnes de la table indiquée dans le FROM :
-- L'étoile sélectionne toutes les colonnes de la table product
SELECT *
FROM productQuestion 6.1
Affiche toutes les colonnes de la table customer.
Ta réponse
-- Question 6.1 : écris ta requête ici
SELECT Voir la solution
SELECT *
FROM customerLes noms de colonnes avec un espace
Quand le nom d'une colonne contient un espace ou un caractère spécial, comme VolKilo (COPA), il faut l'écrire entre guillemets doubles :
SELECT CustomerID, ProductID, "VolKilo (COPA)"
FROM perform21Mettre des espaces dans les noms de colonnes est pourtant une mauvaise pratique. Ils obligent à ajouter des guillemets partout, ce qui alourdit les requêtes et multiplie les erreurs. Et chaque SGBD a sa propre syntaxe pour les gérer, ce qui rend le code moins portable :
-- SQL Server : crochets
SELECT [Date Creation], [Nom Client] FROM Commandes;
-- PostgreSQL, Oracle, DuckDB : guillemets doubles
SELECT "Date Creation", "Nom Client" FROM Commandes;
-- MySQL : accents graves (backticks)
SELECT `Date Creation`, `Nom Client` FROM Commandes;Question 6.2
Affiche les colonnes CustomerID, ProductID, VolKilo (COPA), NOS (COPA) et COGS (COPA) de la table perform21.
Ta réponse
-- Question 6.2 : écris ta requête ici
SELECT Voir la solution
SELECT CustomerID, ProductID, "VolKilo (COPA)", "NOS (COPA)", "COGS (COPA)"
FROM perform21Les trois dernières colonnes contiennent un espace et des parenthèses : elles s'écrivent entre guillemets doubles.
Calculer une nouvelle colonne
Le SELECT peut afficher le résultat d'un calcul sur les colonnes existantes, avec les opérateurs +, -, *, /.
Imaginons que la balance qui pèse les commandes soit mal réglée et retire 5 kg à chaque pesée. Pour corriger, on ajoute 5 kg à chaque volume :
SELECT CustomerID, ProductID, "VolKilo (COPA)" + 5
FROM perform21La nouvelle colonne porte le texte de son calcul, ce qui est peu lisible. Le mot-clé AS lui donne un nom, qu'on appelle un alias :
SELECT CustomerID, ProductID, "VolKilo (COPA)" + 5 AS volume_corrige
FROM perform21Question 6.3
Affiche CustomerID, ProductID, NOS (COPA), COGS (COPA) et une nouvelle colonne marge qui recalcule la marge brute à partir du chiffre d'affaires et du coût.
Rappel : NOS (COPA) est le chiffre d'affaires (positif) et COGS (COPA) le coût d'achat, enregistré en négatif.
Ta réponse
-- Question 6.3 : écris ta requête ici
SELECT Voir la solution
SELECT CustomerID, ProductID, "NOS (COPA)", "COGS (COPA)",
"NOS (COPA)" + "COGS (COPA)" AS marge
FROM perform21Le coût étant déjà négatif, on l'ajoute au chiffre d'affaires : 127 652 + (−51 445) = 76 207. Écrire "NOS (COPA)" - "COGS (COPA)" additionnerait le coût au lieu de le retirer. Le résultat est identique à la colonne GP (COPA), ce qui permet de vérifier son calcul. Toujours regarder le signe d'une colonne avant de calculer avec.
Question 6.4
Affiche CustomerID, ProductID, Date et le taux de marge de chaque ligne de perform21, en pourcentage arrondi à une décimale, dans une colonne nommée taux_marge. Le taux de marge est la marge brute divisée par le chiffre d'affaires. Pour arrondir, utilise ROUND(valeur, 1).
Ta réponse
-- Question 6.4 : écris ta requête ici
SELECT Voir la solution
SELECT CustomerID, ProductID, Date,
ROUND("GP (COPA)" / "NOS (COPA)" * 100, 1) AS taux_marge
FROM perform21On divise la marge par le chiffre d'affaires, on multiplie par 100 pour obtenir un pourcentage, puis on arrondit.
Attention à la division par zéro : perform21 n'a aucune ligne à 0, mais les années suivantes en ont. Selon le SGBD, diviser par zéro provoque une erreur (PostgreSQL, SQL Server) ou renvoie l'infini et NaN (DuckDB). Le chapitre 13 montre comment s'en protéger avec NULLIF.
Ajouter une constante
Une colonne peut contenir la même valeur sur toutes les lignes. On écrit simplement la valeur dans le SELECT : entre guillemets simples pour un texte, sans guillemets pour un nombre.
SELECT *, 'FR' AS code_pays
FROM customerCette astuce est utile pour étiqueter des données avant de les empiler avec d'autres (nous le verrons au chapitre sur UNION).
Question 6.5
Affiche CustomerID et CustomerName de la table customer, plus une colonne type qui vaut 'client' sur toutes les lignes.
Ta réponse
-- Question 6.5 : écris ta requête ici
SELECT Voir la solution
SELECT CustomerID, CustomerName, 'client' AS type
FROM customerConcaténer du texte
L'opérateur || colle des textes bout à bout. On s'en sert pour fabriquer un libellé ou une clé :
SELECT CustomerName || ' (' || Channel || ')' AS libelle
FROM customerQuestion 6.6
Une ligne de perform21 correspond à un client, un produit et un mois. Construis un identifiant de ligne nommé id_ligne en collant CustomerID, ProductID et Date, séparés par un tiret (par exemple 1-1-2021-08-01). Affiche cet identifiant et la colonne NOS (COPA).
Ta réponse
-- Question 6.6 : écris ta requête ici
SELECT Voir la solution
SELECT CustomerID || '-' || ProductID || '-' || Date AS id_ligne,
"NOS (COPA)"
FROM perform21DuckDB convertit automatiquement les nombres et les dates en texte pour les concaténer. Ce type d'identifiant, construit à partir des colonnes qui rendent une ligne unique, s'appelle une clé composite : on y reviendra au chapitre sur la qualité des données.
Supprimer les doublons avec DISTINCT
DISTINCT, placé juste après SELECT, supprime les lignes en double du résultat.
-- Une ligne par vente : 21 736 lignes
SELECT ProductID
FROM perform21-- Une ligne par produit différent : 520 lignes
SELECT DISTINCT ProductID
FROM perform21Avec plusieurs colonnes, DISTINCT compare des lignes entières : il garde chaque combinaison différente.
-- Les couples client-produit différents : 2 845 lignes
SELECT DISTINCT CustomerID, ProductID
FROM perform21Question 6.7
Affiche la liste des mois différents présents dans perform21 (colonne Date).
Ta réponse
-- Question 6.7 : écris ta requête ici
SELECT Voir la solution
SELECT DISTINCT Date
FROM perform21Il y en a 12, de janvier à décembre 2021 : chaque mois est représenté par son premier jour.
Question 6.8
Affiche la liste des catégories et sous-catégories différentes de la table product (chaque combinaison une seule fois).
Ta réponse
-- Question 6.8 : écris ta requête ici
SELECT Voir la solution
SELECT DISTINCT Category, SubCategory
FROM productDISTINCT porte sur la combinaison des deux colonnes : la catégorie Capsules apparaît plusieurs fois, une fois par sous-catégorie.