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.