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 empreco * 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. LIMITsemORDER BYnã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 haverORDER BY.LIKE '%Silva%'≠LIKE 'Silva'. Sem os%, oLIKEvira 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', porque9vem depois de5no alfabeto. BETWEENinclui as duas pontas.BETWEEN 100 AND 200pega o 100 e o 200. Quando o requisito diz "acima de 100",BETWEENestá 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.