CASO DO VAULT — FOLHA DE COMANDOS SQL

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.

Colunas

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.

Filtrar — WHERE

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).

Ordenar e limitar

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.

Contar e medir

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.

Agrupar

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.

Cruzar duas tabelas

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.

Contas no SELECT

SELECT paginas * 2 AS paginas_dobro
FROM livros WHERE ano = 2021;

Operadores: + − * /. O resultado pode receber alias com AS.

Traduzindo o enunciado

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

Erros comuns e como corrigir

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

Receita completa (junte as peças)

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.

Antes de executar, confira

Caso do Vault — Modo Detetive SQL · Instrutor Lucas Lopes SENAI Dr. Celso Charuri