SENAI Dr. Celso Charuri
Instrutor Lucas Lopes
Como usar: toda consulta segue o esqueleto SELECT colunas FROM tabela WHERE condição. Os exemplos abaixo usam uma biblioteca (tabelas livros e emprestimos) — no caso, troque pelas tabelas do card "Tabelas deste passo" e pelas colunas do enunciado.
SELECT titulo FROM livros; SELECT DISTINCT genero FROM livros; -- sem repetidos
O * mostra todas as colunas (bom para explorar a tabela). Várias colunas: separe por vírgula —
SELECT titulo, ano FROM livros.
WHERE ano = 2020 -- número: sem aspas WHERE autor = 'Machado de Assis' WHERE ano > 2000 AND genero = 'poesia' WHERE titulo LIKE '%mar' -- termina em "mar" WHERE ano BETWEEN 1990 AND 2010 WHERE devolvido IS NULL -- está vazio
Texto e datas entre aspas simples. AND = tudo precisa valer; OR = basta uma. % no LIKE é curinga (qualquer trecho).
ORDER BY ano DESC -- maior → menor ORDER BY titulo -- A → Z (padrão) LIMIT 5 -- só as 5 primeiras
Ordem no comando: WHERE → GROUP BY → HAVING → ORDER BY → LIMIT. Datas e horas ordenam certo como texto.
SELECT COUNT(*) AS total FROM emprestimos; SELECT AVG(paginas) AS media FROM livros;
AS dá o apelido pedido no enunciado (o "alias"). COUNT conta linhas; SUM soma; MIN/MAX buscam extremos.
SELECT genero, COUNT(*) AS qtd FROM livros GROUP BY genero HAVING COUNT(*) > 3;
Um grupo por valor da coluna. Para filtrar GRUPOS use HAVING — WHERE filtra linhas.
FROM livros l, emprestimos e WHERE l.id = e.livro_id AND e.leitor = 'Ana';
A igualdade l.id = e.livro_id é a LIGAÇÃO — sem ela as linhas se multiplicam. Cada par que combina vira uma linha (repetições contam).
FROM livros l JOIN emprestimos e ON l.id = e.livro_id
Forma equivalente com JOIN ... ON. Três tabelas = repita a ligação para cada par.
SELECT paginas * 2 AS paginas_dobro FROM livros WHERE ano = 2021;
Operadores: + − * /. O resultado pode receber alias com AS.
| Quando o enunciado diz… | Pense em… |
|---|---|
| "liste os valores sem repetir" | SELECT DISTINCT |
| "que atendem à condição X" | WHERE |
| "os N maiores / em ordem" | ORDER BY ... DESC/ASC + LIMIT |
| "quantos / qual o total" | COUNT(*) / SUM(col) |
| "para cada categoria" | GROUP BY |
| "apenas os grupos com…" | HAVING |
| "relacione as duas tabelas" | ligação a.id = b.chave_id |
| "com o alias X" | AS x |
| Mensagem / sintoma | Causa provável |
|---|---|
| "Tabela não existe" | nome errado — confira no card de tabelas do passo |
| "Coluna não existe… disponíveis:" | grafia errada; a mensagem lista as colunas válidas |
| "Coluna existe em mais de uma tabela" | qualifique com o alias: c.hora, f.nome |
| MUITAS linhas no resultado | faltou a ligação entre as tabelas no WHERE/ON |
| Resultado quase certo, mas errado | confira aspas, data, hora e o alias exato |
SELECT genero, COUNT(*) AS qtd FROM livros l, emprestimos e WHERE l.id = e.livro_id AND e.ano = 2024 GROUP BY genero HAVING COUNT(*) > 3 ORDER BY qtd DESC LIMIT 5;
Toda consulta grande é isso: colunas → tabelas (com ligação) → filtros → agrupamento → filtro de grupo → ordem → limite. Monte de fora para dentro e teste aos poucos.