Cursos › Decisões Orientadas por Dados: Da Pergunta à Resposta

A Tua Primeira Consulta a Sério às Encomendas da Alpenkorb

Lição 5 de 8 · 13 min

A forma de toda a consulta

Executaste pequenas consultas nos primeiros quatro laboratórios. Esta lição põe as peças em ordem, porque quase todas as consultas de análise têm o mesmo esqueleto.

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

O SQL executa as cláusulas por uma ordem diferente daquela em que as escreves. Primeiro FROM escolhe a tabela, depois WHERE remove linhas, depois SELECT calcula as colunas, depois ORDER BY ordena e LIMIT corta. É por isso que o WHERE não pode filtrar por um nome que crias no SELECT, enquanto o ORDER BY já pode ordenar por ele.

Filtros que correspondem ao negócio

Lena quer saber se os códigos de desconto compram cabazes maiores. Na tabela orders, discount_code guarda códigos como WELCOME10 para uma primeira encomenda ou AFFILIATE15 de sites parceiros, e fica vazia quando não foi usado nenhum código. Em SQL, um valor vazio é NULL, que significa desconhecido, e precisa do seu próprio teste.

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 não devolveria nenhuma linha. Comparar qualquer coisa com desconhecido dá desconhecido, e o WHERE mantém apenas as linhas em que a condição é verdadeira. Usa antes IS NULL e IS NOT NULL.

  • AND exige todas as condições, OR pelo menos uma. Quando as combinas, acrescenta parênteses: WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').
  • IN é uma forma abreviada de vários OR: region IN ('Bern', 'Basel').
  • As comparações de texto precisam de plicas e da grafia exata. As regiões escrevem-se 'Zurich', 'Geneva' e 'St. Gallen'.

Três pequenos erros causam a maioria das primeiras consultas falhadas. Os valores de texto usam plicas: no DuckDB, "delivered" entre aspas duplas significa uma coluna chamada delivered, e a consulta falha. As datas escrevem-se como texto em formato ISO, '2026-01-01', que o DuckDB compara corretamente com uma coluna de data. E uma vírgula em falta ou a mais entre colunas produz um erro de sintaxe junto à palavra seguinte.

A armadilha do estado

A tabela orders contém todas as encomendas alguma vez feitas, incluindo 67 canceladas e 80 devolvidas. O seu net_amount continua preenchido, porque o valor era conhecido quando a encomenda foi feita. Se te esqueceres de status = 'delivered', a receita fica demasiado alta. No primeiro trimestre de 2026, esse erro transforma CHF 37'107.20 em CHF 38'787.67. O erro também não se distribui de forma uniforme: cancelamentos e devoluções são mais frequentes em algumas fontes do que noutras.

O que mostrou a pergunta sobre os descontos? No primeiro trimestre de 2026, 90 das 648 encomendas entregues usaram um código. O seu valor médio foi CHF 57.16, contra CHF 57.28 para encomendas sem código. Com base nesta evidência, os códigos não compram cabazes maiores. Ainda podem conquistar novos clientes, o que é uma pergunta diferente e precisa de uma consulta diferente. Antes de confiares em qualquer resultado, compara o seu número de linhas com um número que já conheces: o laboratório da lição 2 devolveu 648 encomendas entregues para este trimestre, por isso um filtro sobre o mesmo trimestre nunca pode devolver mais do que isso.

💡 Constrói uma consulta por etapas. Começa com SELECT * FROM orders LIMIT 10, acrescenta um filtro, executa-o, verifica o número de linhas, e só depois acrescentas o seguinte. Uma consulta longa escrita de uma vez e executada uma única vez esconde os seus erros.
Teste de conhecimento
Porque é que WHERE discount_code = NULL não devolve nenhuma linha?

Entra para responder e acompanhar o teu progresso.

Entrar
</>
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