Buscando Dados
SELECT -- lendo dados do banco
O comando SELECT e o mais usado do SQL. Ele consulta dados de uma ou mais tabelas. Vamos usar esta tabela de exemplo:
| id | nome | idade | ativo | |
|---|---|---|---|---|
| 1 | Ana Silva | [email protected] | 20 | 1 |
| 2 | Carlos Souza | [email protected] | 22 | 1 |
| 3 | Julia Santos | [email protected] | 19 | 1 |
| 4 | Pedro Lima | [email protected] | 21 | 0 |
| 5 | Maria Costa | [email protected] | 23 | 1 |
SELECT * -- tudo de uma vez
O asterisco (*) significa "todas as colunas":
SELECT * FROM alunos;
-- → Retorna todas as colunas de todos os registros
Resultado: a tabela inteira, todas as 5 linhas com todas as 5 colunas.
Selecionando colunas especificas
Informe exatamente quais colunas voce quer:
SELECT nome, email FROM alunos;
-- → Retorna apenas nome e email
| nome | |
|---|---|
| Ana Silva | [email protected] |
| Carlos Souza | [email protected] |
| Julia Santos | [email protected] |
| Pedro Lima | [email protected] |
| Maria Costa | [email protected] |
Voce pode selecionar quantas colunas quiser, em qualquer ordem:
SELECT email, nome, idade FROM alunos;
-- → Retorna email, nome e idade (nessa ordem)
Alias com AS -- renomeando colunas
Use AS para dar um apelido temporario a uma coluna no resultado:
SELECT
nome AS aluno,
email AS contato,
idade AS anos
FROM alunos;
| aluno | contato | anos |
|---|---|---|
| Ana Silva | [email protected] | 20 |
| Carlos Souza | [email protected] | 22 |
O alias nao altera a tabela -- so muda o nome no resultado da consulta. Isso e util quando:
- O nome da coluna e confuso (ex:
dt_nascviradata_nascimento) - Voce usa calculos (ex:
preco * quantidade AS total) - Junta tabelas e tem colunas com mesmo nome
SELECT
nome,
idade,
idade + 1 AS idade_ano_que_vem
FROM alunos;
| nome | idade | idade_ano_que_vem |
|---|---|---|
| Ana Silva | 20 | 21 |
| Carlos Souza | 22 | 23 |
DISTINCT -- removendo duplicatas
Se voce quer valores unicos (sem repeticao):
SELECT DISTINCT idade FROM alunos;
-- → Retorna cada idade uma unica vez
Util quando voce quer saber quais valores existem numa coluna:
SELECT DISTINCT ativo FROM alunos;
-- → 1, 0 (os unicos valores que existem)
Contando registros
Use COUNT(*) para saber quantos registros existem:
SELECT COUNT(*) AS total_alunos FROM alunos;
-- → 5
Mesma operacao com ORMs
Prisma
Buscar todos os registros:
const alunos = await prisma.aluno.findMany();
// → Array com todos os alunos e todas as colunas
Selecionar colunas especificas:
const alunos = await prisma.aluno.findMany({
select: {
nome: true,
email: true,
},
});
// → [{ nome: 'Ana Silva', email: '[email protected]' }, ...]
Buscar um registro pelo id:
const aluno = await prisma.aluno.findUnique({
where: { id: 1 },
});
// → { id: 1, nome: 'Ana Silva', ... }
Contar registros:
const total = await prisma.aluno.count();
// → 5
Drizzle
Buscar todos:
const todosAlunos = await db.select().from(alunos);
// → Array com todos os alunos
Selecionar colunas especificas:
const resultado = await db
.select({
nome: alunos.nome,
email: alunos.email,
})
.from(alunos);
// → [{ nome: 'Ana Silva', email: '[email protected]' }, ...]
Contar registros:
import { count } from 'drizzle-orm';
const [resultado] = await db
.select({ total: count() })
.from(alunos);
// → { total: 5 }
Lucid (AdonisJS)
Buscar todos:
const alunos = await Aluno.all();
// → Array de instancias do model
Selecionar colunas especificas:
const alunos = await Aluno.query().select('nome', 'email');
// → [{ nome: 'Ana Silva', email: '[email protected]' }, ...]
Buscar um registro pelo id:
const aluno = await Aluno.find(1);
// → Instancia do model com id = 1
const aluno = await Aluno.findOrFail(1);
// → Mesmo que find(), mas lanca erro se nao encontrar
Contar registros:
const total = await Aluno.query().count('* as total');
// → [{ total: 5 }]
Comparativo Rapido
| Operacao | SQL | Prisma | Drizzle | Lucid |
|---|---|---|---|---|
| Buscar todos | SELECT * FROM alunos | findMany() | db.select().from() | Model.all() |
| Colunas especificas | SELECT nome, email FROM alunos | findMany({ select }) | db.select({ ... }).from() | query().select() |
| Buscar por ID | SELECT * FROM alunos WHERE id = 1 | findUnique({ where }) | db.select().from().where() | Model.find(1) |
| Contar | SELECT COUNT(*) FROM alunos | count() | db.select({ count() }) | query().count() |
Boas Praticas
- Sempre liste as colunas que voce precisa ao inves de usar
* - Use alias para deixar o resultado mais legivel
- Cuidado com tabelas grandes -- sem WHERE ou LIMIT, voce pode trazer milhoes de registros
- Use COUNT antes de SELECT se quiser saber o tamanho do resultado antes de trazer os dados
-- Ruim em producao:
SELECT * FROM alunos;
-- Bom em producao:
SELECT id, nome, email FROM alunos;
Exercicios
-
Escreva um SELECT que retorne apenas o
nomee aidadede todos os alunos. -
Use
ASpara renomear a colunanomeparaalunoeemailparacontatono resultado. -
Escreva uma query que retorne quantos alunos existem na tabela.
-
Use
DISTINCTpara listar todas as idades diferentes que existem na tabela. -
Reescreva as queries dos exercicios 1 e 2 usando Prisma ou Drizzle ou Lucid (escolha um).
-
Pesquise: qual a diferenca entre
findUniqueefindFirstno Prisma?
Referencias
Testa o que você leu
5 perguntas sobre esta aula. Errar aqui não custa nada - a explicação vem junto da correção.