Cours › Décisions fondées sur les données : de la question à la réponse

Votre première vraie requête sur les commandes Alpenkorb

Leçon 5 sur 8 · 13 min

La forme de chaque requête

Vous avez exécuté de petites requêtes dans les quatre premiers ateliers. Cette leçon met les pièces en ordre, car presque chaque requête d'analyse a le même squelette.

Text
SELECT   columns or calculations
FROM     table
WHERE    conditions on rows
ORDER BY sort columns
LIMIT    number of rows;

SQL exécute les clauses dans un ordre différent de celui dans lequel vous les écrivez. D'abord FROM choisit la table, puis WHERE retire des lignes, puis SELECT calcule les colonnes, puis ORDER BY trie et LIMIT coupe. C'est pourquoi WHERE ne peut pas filtrer sur un nom que vous créez dans SELECT, alors que ORDER BY peut trier par ce nom.

Des filtres qui correspondent au métier

Lena veut savoir si les codes de réduction achètent des paniers plus grands. Dans la table orders, discount_code contient des codes comme WELCOME10 pour une première commande ou AFFILIATE15 provenant de sites partenaires, et est vide quand aucun code n'a été utilisé. En SQL, une valeur vide est NULL, ce qui signifie inconnu, et nécessite son propre test.

SQL
SELECT order_id, order_date, source, discount_code, net_amount
FROM orders
WHERE status = 'delivered'
  AND discount_code IS NOT NULL
  AND order_date >= '2026-01-01'
ORDER BY net_amount DESC
LIMIT 3;

discount_code = NULL ne renverrait aucune ligne du tout. Comparer quoi que ce soit avec inconnu donne inconnu, et WHERE ne garde que les lignes où la condition est vraie. Utilisez plutôt IS NULL et IS NOT NULL.

  • AND exige chaque condition, OR au moins une. Quand vous les mélangez, ajoutez des parenthèses : WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').
  • IN est une forme courte pour plusieurs OR : region IN ('Bern', 'Basel').
  • Les comparaisons de texte nécessitent des apostrophes simples et l'orthographe exacte. Les régions s'écrivent 'Zurich', 'Geneva' et 'St. Gallen'.

Trois petites erreurs causent la plupart des premières requêtes ratées. Les valeurs textuelles utilisent des apostrophes simples : dans DuckDB, "delivered" entre guillemets doubles signifie une colonne nommée delivered, et la requête échoue. Les dates s'écrivent en texte au format ISO, '2026-01-01', que DuckDB compare correctement avec une colonne de date. Et une virgule manquante ou en trop entre les colonnes produit une erreur de syntaxe près du mot suivant.

Le piège du statut

La table orders contient chaque commande jamais passée, y compris 67 annulées et 80 retournées. Leur net_amount est quand même rempli, car le montant était connu au moment où la commande a été passée. Si vous oubliez status = 'delivered', le chiffre d'affaires est trop élevé. Au premier trimestre 2026, cette erreur transforme CHF 37'107.20 en CHF 38'787.67. L'erreur n'est pas non plus répartie uniformément : les annulations et les retours sont plus fréquents dans certaines sources que dans d'autres.

Qu'a montré la question sur les remises ? Au premier trimestre 2026, 90 des 648 commandes livrées ont utilisé un code. Leur valeur moyenne était de CHF 57.16, contre CHF 57.28 pour les commandes sans code. Sur cette base, les codes n'achètent pas de paniers plus grands. Ils gagnent peut-être quand même de nouvelles clientes, ce qui est une question différente et nécessite une requête différente. Avant de faire confiance à un résultat, comparez son nombre de lignes à un chiffre que vous connaissez déjà : l'atelier de la leçon 2 a renvoyé 648 commandes livrées pour ce trimestre, un filtre sur le même trimestre ne peut donc jamais en renvoyer davantage.

💡 Construisez une requête par étapes. Commencez par SELECT * FROM orders LIMIT 10, ajoutez un filtre, exécutez, vérifiez le nombre de lignes, puis ajoutez le suivant. Une longue requête écrite d'un coup et exécutée une seule fois cache ses erreurs.
Vérification des connaissances
Pourquoi WHERE discount_code = NULL ne renvoie-t-il aucune ligne ?

Connectez-vous pour répondre et suivre votre progression.

Se connecter
</>
Babala Software Netzwerk — Apps, Websites & KI-Lösungen aus Füllinsdorf BL
© 2026 Babala Özdemir · UID CHE-322.105.560 babala.ch info@babala.ch 076 792 63 50 Facebook Instagram