QA Learning / SQL

Módulo 1: Ler dados

SELECT, WHERE, ORDER BY, LIMIT, DISTINCT

Antes de começar: o que é esse banco

Um banco de dados é um conjunto de tabelas. Cada tabela guarda um tipo de coisa (clientes numa, produtos noutra, pedidos noutra) e funciona como uma planilha: as colunas são os campos e cada linha é um registro, como um cliente ou um pedido.

Toda consulta começa dizendo de qual tabela você quer ler, com FROM nome_da_tabela. É por isso que se escreve FROM produtos ou FROM clientes: é o nome da "planilha" onde aquele dado mora. Antes de buscar, vale saber quais tabelas existem e que colunas cada uma tem: está tudo no painel “Estrutura do banco” logo abaixo, na parte de prática (ele reaparece em todos os módulos).

As tabelas se conectam por id: um pedido tem a coluna cliente_id, que guarda o id de uma linha de clientes. É assim que o pedido "sabe" de quem é, e é o que os JOIN (módulo 4) usam pra juntar tudo de volta.

Dois exemplos pra ver funcionando

Eles já rodam sozinhos quando o banco carrega, mas mexe à vontade e clique Rodar de novo.

Teoria

  • SELECT colunas FROM tabela: escolhe o quê e de onde. SELECT * traz todas as colunas.
  • WHERE condição: filtra linhas. Operadores: = <> > < >= <=, AND, OR, NOT.
  • BETWEEN a AND b: intervalo (inclusivo nas pontas).
  • IN (v1, v2, ...): valor dentro de uma lista.
  • LIKE 'abc%': texto por padrão, onde % = qualquer coisa e _ = exatamente 1 caractere.
  • ORDER BY coluna ASC|DESC: ordena. LIMIT n: corta nas n primeiras linhas.
  • DISTINCT: remove linhas repetidas do resultado.
  • AS: apelido de coluna, como em preco * 0.9 AS preco_promo.

Olhar de QA: quase toda investigação começa com um SELECT ... WHERE: "me mostra as linhas onde algo está estranho".

Exemplos de aplicação

Um exemplo montado pra cada item da teoria acima. Não precisa rodar: é pra ver a cara do recurso e entender cada pedaço. Os valores são ilustrativos.

SELECT ... FROM tabela

SELECT nome, categoria, preco
FROM produtos;

SELECT nome, categoria, preco diz quais colunas aparecem no resultado; FROM produtos diz de qual tabela elas saem. Sem WHERE, volta uma linha por produto. Trocar as 3 colunas por * traria todas as colunas da tabela.

WHERE + operadores

SELECT id, status, valor_total
FROM pedidos
WHERE status <> 'cancelado' AND valor_total >= 1000;

O WHERE deixa passar só as linhas em que as duas condições são verdade ao mesmo tempo (AND): status diferente de (<>) 'cancelado' e valor de 1000 pra cima. Texto vai entre aspas simples; número, não.

BETWEEN a AND b

SELECT nome, data_cadastro
FROM clientes
WHERE data_cadastro BETWEEN '2025-01-01' AND '2025-03-31';

BETWEEN é atalho pra data_cadastro >= '2025-01-01' AND data_cadastro <= '2025-03-31'. As duas pontas entram. Funciona com data em texto porque o formato AAAA-MM-DD ordena igual a texto comum.

IN (lista)

SELECT nome, categoria
FROM produtos
WHERE categoria IN ('Perifericos', 'Monitores', 'Armazenamento');

IN testa se o valor da coluna é um dos da lista. Equivale a três comparações ligadas por OR, só que mais curto e mais fácil de ler.

LIKE 'padrão'

SELECT nome, email
FROM clientes
WHERE email LIKE '%@gmail.com';

% casa com qualquer sequência de caracteres (até nenhuma), então '%@gmail.com' pega todo email que termina em @gmail.com. _ casaria com exatamente 1 caractere, então 'CT-01_' pegaria de CT-010 a CT-019.

ORDER BY + LIMIT

SELECT id, valor_total
FROM pedidos
ORDER BY valor_total DESC
LIMIT 10;

ORDER BY valor_total DESC ordena do maior pro menor (ASC, crescente, é o padrão). LIMIT 10 corta nas 10 primeiras linhas depois de ordenar, ou seja, os 10 pedidos mais caros.

DISTINCT

SELECT DISTINCT estado
FROM clientes
ORDER BY estado;

Sem DISTINCT, viria o estado dos 60 clientes, com muita repetição. DISTINCT colapsa as linhas iguais e devolve cada estado uma vez, bom pra responder "quais valores existem nessa coluna?".

AS (apelido)

SELECT nome,
       preco AS preco_cheio,
       preco * 0.9 AS preco_com_desconto
FROM produtos;

AS renomeia a coluna no resultado. Serve pra trocar um nome (preco → preco_cheio) e, principalmente, pra dar nome a coluna calculada: preco * 0.9 sem apelido viria com um cabeçalho ilegível.

Pegadinhas deste módulo

Os erros que quase todo mundo comete aqui. Ler agora poupa meia hora de confusão depois, e alguns deles são a causa de relatório errado em projeto real.

  • Texto diferencia maiúscula de minúscula. WHERE cidade = 'campinas' não acha 'Campinas' e devolve zero linhas sem dar erro. Zero linha não é sinal de que está tudo certo: é sinal de que você precisa conferir a condição.
  • LIMIT sem ORDER BY não significa nada. "As 5 primeiras" de um resultado não ordenado são 5 linhas quaisquer, e podem mudar entre execuções. Se o enunciado fala em "maiores" ou "mais recentes", tem que haver ORDER BY.
  • LIKE '%Silva%' ≠ LIKE 'Silva'. Sem os %, o LIKE vira uma igualdade. É a causa mais comum de "minha busca não acha nada".
  • Aspas simples para texto, nada para número. WHERE preco > '500' pode funcionar por acidente e comparar como texto, e aí '90' fica maior que '500', porque 9 vem depois de 5 no alfabeto.
  • BETWEEN inclui as duas pontas. BETWEEN 100 AND 200 pega o 100 e o 200. Quando o requisito diz "acima de 100", BETWEEN está errado, e essa diferença de uma linha é exatamente o tipo de defeito que a análise de valor limite procura.

Prática

Escreva a query e clique Rodar (ou Ctrl+Enter). Tenta antes de abrir a resposta: errar e ajustar é o exercício.

carregando banco…

Query livre

Espaço pra explorar o banco à vontade.

Terminou este módulo? Marque: o ✓ aparece no índice da trilha e a barra de progresso anda no começo do site. Fica salvo só no seu navegador.