Présentation du cours/Écrire votre propre SQL1 sur 4

Poser une question à une table

PrécédentSuivant

Posez une question à une table

Écrivez manuellement SELECT, WHERE, ORDER BY et LIMIT et détectez votre premier échec silencieux.

Lisez une table avant de la confier à un agent

C'est la partie que vous ne pouvez pas ignorer. Une requête que vous avez écrite à la main est une requête que vous pouvez lire lorsqu'un agent écrit la suivante, alors écrivez-la vous-même.

Commencez par la forme d'une requête : SELECT nomme les colonnes, FROM nomme la table et LIMIT termine les lignes renvoyées. AS renomme une colonne dans la sortie - il change l'étiquette, pas les données.

bruin query --connection duckdb-default \
  --description "preview orders with named columns" \
  --query "SELECT order_id, ordered_at AS placed_at, order_total AS amount FROM orders LIMIT 5;"

WHERE conserve uniquement les lignes qui correspondent à une condition. Combinez les conditions avec AND, OR et NOT. ORDER BY trie et DISTINCT supprime les lignes en double du résultat.

bruin query --connection duckdb-default \
  --description "large recent orders sorted by value" \
  --query "SELECT order_id, order_total, order_status FROM orders WHERE order_total > 500 AND ordered_at >= '2024-01-01' ORDER BY order_total DESC LIMIT 10;"

Quelques filtres se lisent presque comme l'anglais et valent la peine d'être connus : BETWEEN 100 AND 200 correspond à une plage, IN ('USD', 'EUR') correspond à une liste, LIKE 'A%' correspond à un modèle de texte et IS NULL correspond aux valeurs manquantes. Utilisez IS NULL, jamais = NULL, car une valeur ne peut jamais égaler une chose absente.

Votre premier échec silencieux

Voici la surprise. Comptez les commandes qui n'ont pas été annulées :

bruin query --connection duckdb-default \
  --description "naive count of orders that are not cancelled" \
  --query "SELECT COUNT(*) FROM orders WHERE order_status != 'cancelled';"

La requête renvoie 1 069. La bonne réponse est 1 093. Certaines commandes n'ont aucun statut - order_status est NULL sur 24 lignes. En SQL, NULL != 'cancelled' n'est pas vrai. On ne sait pas, donc ces 24 lignes sont supprimées sans un mot. Il s'agit d'un échec silencieux : la requête s'est exécutée, a renvoyé un nombre, le numéro est erroné et rien sur votre écran ne le suggère. La règle est simple. Utilisez IS NULL, jamais = NULL, et utilisez IS DISTINCT FROM lorsque vous souhaitez une comparaison qui traite NULL comme une valeur réelle.

Votre tâche

Travaillez sur les bases dans queries/01-first-look.sql. Écrivez un SELECT qui nomme les colonnes avec AS, un WHERE qui filtre et trie avec ORDER BY et termine les lignes avec LIMIT, puis reproduisez le filtre NULL silencieux. Exécutez le décompte naïf et confirmez qu'il renvoie 1 069 :

bruin query --connection duckdb-default \
  --description "naive count of orders that are not cancelled" \
  --query "SELECT COUNT(*) FROM orders WHERE order_status != 'cancelled';"

Écrivez ensuite une version corrigée qui renvoie 1 093, et prouvez l'écart en comptant les statuts manquants :

bruin query --connection duckdb-default \
  --description "orders with a missing status" \
  --query "SELECT COUNT(*) AS null_status FROM orders WHERE order_status IS NULL;"

null_status devrait être 24 - exactement l'écart entre le décompte naïf et le décompte correct. Un filtre correct conserve ces lignes, par exemple WHERE order_status IS DISTINCT FROM 'cancelled'.

Vérifiez votre compréhension

  • Pourquoi != 'cancelled' renvoie-t-il moins de lignes que prévu ?
  • Quelle est la règle concernant la comparaison avec NULL ?
  • Combien de lignes le filtre naïf a-t-il supprimé silencieusement ?

Faites-le avec votre agent

Dites next lesson et votre agent vous apprend cela, vous pose ces questions, puis définit la tâche ci-dessus. Faites-le à la main, puis dites review my work - il exécute votre requête, la vérifie par rapport à une rubrique et vous indique ce qu'il faut corriger ou marque la leçon comme terminée.

Sign up to our newsletter

Practical updates on open-source data pipelines, AI analysts, governance, and what we are shipping at Bruin.

The signup form is hosted by Brevo. Allow marketing cookies to load it.