Cada cláusula tem uma função
SELECT define as expressões devolvidas. FROM identifica a origem dos dados. WHERE filtra linhas. ORDER BY estabelece uma ordenação. Sem ORDER BY, não deves depender da ordem observada num resultado anterior. Escolhe apenas as colunas necessárias para tornar o contrato claro.
Tratar ausência
NULL representa ausência ou desconhecimento conforme o modelo. Para testar esse estado, usa IS NULL ou IS NOT NULL, não = NULL. As condições de WHERE só mantêm linhas quando o resultado é verdadeiro; um resultado desconhecido não passa o filtro.
Aplicação guiada no trabalho
Num painel de incidentes, escreve primeiro o contrato: uma linha por incidente, apenas incidentes abertos e ordem por data de criação com desempate por ID. Usa resolved_at IS NULL segundo a convenção do modelo e seleciona as colunas necessárias. A ausência não é uma data fictícia e não deve ser comparada com = NULL. Quando uma lista de exclusão pode conter NULL, experimenta mentalmente três casos: ID que corresponde, ID diferente e ID desconhecido. NOT IN pode produzir desconhecido em vez de verdadeiro. Se a regra é excluir apenas correspondências e o ID exterior é obrigatório, NOT EXISTS correlacionado exprime essa intenção. Testa também empates de data. Uma ordem total evita empates arbitrários, mas não congela dados alterados entre páginas.
SELECT id, title
FROM incidents
WHERE resolved_at IS NULL
ORDER BY created_at, id;Um painel mostra incidentes abertos. Uma ordenação por data e ID dá um critério explícito para incidentes com a mesma data, evitando paginação instável por empates.
Armadilhas comuns
Confiar na ordem observada; usar = NULL; ignorar NULL em NOT IN.
Tópicos relacionados: Juntar sem multiplicar enganos · Contar e agrupar com cuidado
A ordem tem de ser pedida; NULL exige condições próprias.
Referência: PostgreSQL 18: Comparison functions and operators · PostgreSQL 18 reference semantics; DR SQL 2026.4; synthetic plan metrics and portable SQLite 3.51.2 examples