Guia rápido

Aprenda SQL antes de praticar

Do zero às consultas avançadas, com exemplos que funcionam no banco do playground. Copie qualquer exemplo e teste no SQL Livre.

01O que é SQL?

SQL (Structured Query Language) é a linguagem usada para conversar com bancos de dados relacionais. Com ela você busca, filtra, combina e resume informações guardadas em tabelas.

Um banco relacional organiza os dados em tabelas, parecidas com planilhas: cada coluna é um tipo de informação (nome, preço, data) e cada linha é um registro.

Para QA, SQL é essencial para validar se o sistema gravou os dados certos, preparar massa de testes e investigar bugs direto na fonte.

02Conheça o banco do playground

Os desafios usam um e-commerce fictício com 5 tabelas: clientes, produtos, pedidos, itens_pedido e pagamentos.

As tabelas se ligam por chaves: pedidos.cliente_id aponta para clientes.id, itens_pedido liga pedidos a produtos e pagamentos.pedido_id aponta para pedidos.id.

Você pode explorar colunas e linhas de exemplo no painel “Banco” em qualquer desafio ou no SQL Livre.

03SELECT e FROM: buscando dados

SELECT diz quais colunas você quer; FROM diz de qual tabela. O asterisco (*) traz todas as colunas.

SELECT * FROM clientes;

SELECT nome, email FROM clientes;

Dica: Prefira listar só as colunas necessárias: o resultado fica mais fácil de conferir.

04WHERE: filtrando linhas

WHERE mantém apenas as linhas que atendem a uma condição. Textos e datas ficam entre aspas simples.

Operadores: = (igual), <> (diferente), >, <, >=, <=. Combine condições com AND e OR.

SELECT * FROM produtos WHERE preco > 500;

SELECT * FROM clientes
WHERE estado = 'SP' AND data_cadastro > '2024-06-30';

05LIKE, IN, BETWEEN e NULL

LIKE busca padrões em textos: % significa “qualquer coisa”. IN compara com uma lista. BETWEEN define um intervalo.

NULL significa “sem valor”. Ele não é comparado com =, e sim com IS NULL ou IS NOT NULL.

SELECT * FROM produtos WHERE nome LIKE '%Mouse%';
SELECT * FROM pedidos WHERE status IN ('pago', 'enviado');
SELECT * FROM produtos WHERE preco BETWEEN 100 AND 300;
SELECT * FROM pagamentos WHERE data_pagamento IS NULL;

06ORDER BY, LIMIT e DISTINCT

ORDER BY ordena o resultado: ASC (crescente, padrão) ou DESC (decrescente). LIMIT restringe quantas linhas voltam.

DISTINCT remove linhas repetidas.

SELECT nome, preco FROM produtos
ORDER BY preco DESC
LIMIT 5;

SELECT DISTINCT estado FROM clientes;

07Funções de agregação

COUNT conta, SUM soma, AVG tira a média, MIN e MAX pegam o menor e o maior valor. Use AS para dar um nome (apelido) à coluna.

SELECT COUNT(*) AS total_produtos FROM produtos;
SELECT ROUND(AVG(preco), 2) AS preco_medio FROM produtos;

Dica: Nos desafios, os nomes pedidos no enunciado (ex.: total_produtos) devem ser usados com AS.

08GROUP BY e HAVING

GROUP BY junta as linhas em grupos e aplica a agregação em cada um.

WHERE filtra linhas antes de agrupar; HAVING filtra os grupos depois de agrupar.

SELECT status, COUNT(*) AS quantidade
FROM pedidos
GROUP BY status;

SELECT categoria, COUNT(*) AS quantidade
FROM produtos
GROUP BY categoria
HAVING COUNT(*) > 4;

09JOIN: combinando tabelas

INNER JOIN (ou só JOIN) traz as linhas que têm correspondência nas duas tabelas, segundo a condição ON.

LEFT JOIN traz todas as linhas da tabela da esquerda, mesmo sem correspondência — as colunas da direita ficam NULL. Ótimo para achar “quem não tem”.

SELECT p.id, c.nome, p.valor_total
FROM pedidos p
JOIN clientes c ON c.id = p.cliente_id;

-- clientes sem pedidos
SELECT c.nome
FROM clientes c
LEFT JOIN pedidos p ON p.cliente_id = c.id
WHERE p.id IS NULL;

Dica: Apelidos de tabela (p, c) deixam a consulta curta e evitam ambiguidade entre colunas com o mesmo nome, como id.

10Subconsultas

Uma subconsulta é um SELECT dentro de outro. Pode ser usada com IN, NOT IN, EXISTS ou para comparar com um valor calculado.

SELECT nome FROM produtos
WHERE id NOT IN (SELECT produto_id FROM itens_pedido);

SELECT * FROM pedidos
WHERE valor_total > (SELECT AVG(valor_total) FROM pedidos);

11CTEs (WITH) e funções de janela

WITH cria uma “tabela temporária nomeada” para organizar consultas complexas em etapas.

Funções de janela como RANK() e ROW_NUMBER() calculam posições sem agrupar as linhas.

WITH vendas AS (
  SELECT produto_id, SUM(quantidade) AS total
  FROM itens_pedido
  GROUP BY produto_id
)
SELECT produto_id, total,
  RANK() OVER (ORDER BY total DESC) AS posicao
FROM vendas;

12Ordem das cláusulas

As cláusulas sempre aparecem nesta ordem. Se trocar, o banco retorna erro de sintaxe.

SELECT   colunas
FROM     tabela
JOIN     outra_tabela ON ...
WHERE    filtro_de_linhas
GROUP BY agrupamento
HAVING   filtro_de_grupos
ORDER BY ordenação
LIMIT    quantidade;

13SQL no dia a dia de QA

Validar se um cadastro feito pela tela foi gravado corretamente.

Conferir regras de negócio: um pedido cancelado não pode ter pagamento aprovado; o total do pedido deve bater com a soma dos itens.

Encontrar dados para testes: um cliente sem pedidos, um produto sem estoque, um pagamento pendente.

Sempre use apenas consultas de leitura (SELECT) em ambientes compartilhados, a menos que tenha autorização.

Pronto para praticar?

Comece pelo nível Básico ou teste os exemplos livremente.

Abrir SQL LivreIr para os desafios