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.
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.
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.
ANDexige todas as condições,ORpelo menos uma. Quando as combinas, acrescenta parênteses:WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').INé uma forma abreviada de váriosOR: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.
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.WHERE discount_code = NULL não devolve nenhuma linha?Entra para responder e acompanhar o teu progresso.
Entrar