Proposta de site feita pela Genesis Innovation · conteúdo do LinkedIn de Daniel Santos

Pular para o conteúdo
Daniel Santos

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.

SQL · SQLite
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:

  • FROM e JOIN: 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 BY e por fim LIMIT/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.)

SQL · SQLite
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".

SQL · SQLite
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.