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.
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.
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.
ANDexige chaque condition,ORau moins une. Quand vous les mélangez, ajoutez des parenthèses :WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').INest une forme courte pour plusieursOR: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.
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.WHERE discount_code = NULL ne renvoie-t-il aucune ligne ?Connectez-vous pour répondre et suivre votre progression.
Se connecter