Wiki SQL
SELECT e a ordem lógica
O SQL é escrito começando pelo SELECT, mas é avaliado começando pelo FROM. Entender isso evita metade dos erros.
Todos os exemplos de SQL desta wiki rodam no seu navegador, num SQLite de verdade, sobre as tabelas de uma loja fictícia: clientes, produtos, pedidos, itens e eventos. Aperte Rodar e mude o que quiser.
SELECT id, cliente_id, data, valor
FROM pedidos
WHERE status = 'entregue' AND valor >= 500
ORDER BY valor DESC, id;Saída
id | cliente_id | data | valor --- | ---------- | ---------- | ----- 105 | 4 | 2024-06-03 | 1050 102 | 2 | 2024-06-01 | 900 110 | 1 | 2024-06-05 | 900
A ordem em que o banco pensa
A consulta é lida assim, e não na ordem em que foi escrita:
FROMeJOIN: monta as linhas de partida;WHERE: filtra linha a linha;GROUP BY: junta as linhas em grupos;HAVING: filtra os grupos;SELECT: calcula as colunas (e os apelidos nascem aqui);DISTINCT,ORDER BYe por fimLIMIT/OFFSET.
Por isso o apelido criado no SELECT não existe no WHERE do padrão SQL: o filtro roda antes. Use a expressão inteira ou uma CTE. (O SQLite é tolerante e aceita apelido no WHERE; PostgreSQL e Spark SQL recusam. Não conte com isso.)
SELECT id, valor * 0.9 AS com_desconto
FROM pedidos
WHERE valor * 0.9 > 800
ORDER BY com_desconto, id;Saída
id | com_desconto --- | ------------ 102 | 810 110 | 810 105 | 945
ORDER BY sem LIMIT, LIMIT sem ORDER BY
Sem ORDER BY, a ordem das linhas não é garantida: num motor distribuído como o Spark ela muda de uma execução para outra. LIMIT sem ORDER BY devolve "algumas" linhas, não "as primeiras".
SELECT nome, criado_em
FROM clientes
ORDER BY criado_em DESC
LIMIT 3;Saída
nome | criado_em ----- | ---------- Fábio | 2024-05-12 Elisa | 2024-04-01 Diego | 2024-03-15
SELECT *em produção amarra o código ao formato da tabela: liste as colunas.- Em formatos colunares (Parquet, Delta), ler menos colunas é ler menos bytes do disco.
Fontes
Conhecimento compartilhado pela Genesis Innovation.