Operadores de comparação e lógicos no WHERE
1. Introdução aos Operadores de Comparação
1.1. O papel do WHERE na filtragem de dados
A cláusula WHERE é um dos recursos mais fundamentais em SQL. Ela determina quais linhas de uma tabela serão incluídas no resultado de uma consulta. Sem o WHERE, você recupera todos os registros da tabela — o que raramente é útil em bancos de dados reais. Com ele, você aplica filtros precisos, transformando dados brutos em informações relevantes.
1.2. Visão geral dos operadores
Os operadores de comparação no SQL são:
| Operador | Significado |
|---|---|
= |
Igual a |
<> |
Diferente de |
!= |
Diferente de (alternativo) |
> |
Maior que |
< |
Menor que |
>= |
Maior ou igual a |
<= |
Menor ou igual a |
Já os operadores lógicos principais são AND, OR e NOT, que permitem combinar ou inverter condições de comparação.
1.3. Diferença entre operadores de comparação e operadores lógicos
Operadores de comparação comparam dois valores e retornam verdadeiro ou falso. Operadores lógicos combinam múltiplas comparações em uma única condição. Por exemplo, salario > 3000 é uma comparação; salario > 3000 AND cargo = 'Analista' usa um operador lógico para unir duas comparações.
2. Operadores de Igualdade e Diferença
2.1. = (igualdade exata)
O operador = verifica se dois valores são exatamente iguais. Funciona com números, texto e datas.
SELECT nome, salario
FROM funcionarios
WHERE salario = 5000;
SELECT nome, cargo
FROM funcionarios
WHERE cargo = 'Analista';
SELECT nome, data_admissao
FROM funcionarios
WHERE data_admissao = '2024-01-15';
2.2. <> ou != (diferente)
Ambos os operadores significam "diferente de". O padrão SQL é <>, mas muitos bancos aceitam !=.
SELECT nome, cargo
FROM funcionarios
WHERE cargo <> 'Estagiario';
SELECT nome, salario
FROM funcionarios
WHERE salario != 0;
2.3. Cuidados com case-sensitive e espaços em branco em strings
Em bancos como PostgreSQL, a comparação de strings é case-sensitive por padrão. No MySQL, depende da collation da tabela. Espaços em branco também podem causar falsos negativos.
-- Pode não encontrar se a tabela tiver 'joão' com minúscula
SELECT nome
FROM funcionarios
WHERE nome = 'João';
-- Melhor prática: usar funções de normalização se necessário
SELECT nome
FROM funcionarios
WHERE LOWER(TRIM(nome)) = 'joão';
3. Operadores de Relação: Maior, Menor e Variações
3.1. > e < — maior que e menor que
SELECT nome, salario
FROM funcionarios
WHERE salario > 10000;
SELECT nome, salario
FROM funcionarios
WHERE salario < 3000;
3.2. >= e <= — maior ou igual e menor ou igual
SELECT nome, salario
FROM funcionarios
WHERE salario >= 5000;
SELECT nome, salario
FROM funcionarios
WHERE salario <= 2000;
3.3. Exemplos práticos com colunas numéricas e de data/hora
-- Funcionários contratados após 2023
SELECT nome, data_admissao
FROM funcionarios
WHERE data_admissao > '2023-12-31';
-- Vendas do último trimestre
SELECT produto, valor, data_venda
FROM vendas
WHERE data_venda >= '2024-10-01' AND data_venda <= '2024-12-31';
-- Produtos com preço entre 50 e 100
SELECT nome, preco
FROM produtos
WHERE preco >= 50 AND preco <= 100;
4. Combinando Operadores com AND e OR
4.1. AND — todas as condições devem ser verdadeiras
SELECT nome, cargo, salario
FROM funcionarios
WHERE cargo = 'Analista' AND salario > 8000;
4.2. OR — pelo menos uma condição deve ser verdadeira
SELECT nome, cargo
FROM funcionarios
WHERE cargo = 'Gerente' OR cargo = 'Diretor';
4.3. Precedência de operadores e uso de parênteses para controle
No SQL, AND tem precedência sobre OR. Sem parênteses, o banco avalia AND primeiro, o que pode gerar resultados inesperados.
-- Sem parênteses: interpretado como funcionarios do setor 'TI' com salario > 5000
-- OU funcionarios do setor 'RH' (qualquer salario)
SELECT nome, setor, salario
FROM funcionarios
WHERE setor = 'TI' AND salario > 5000 OR setor = 'RH';
-- Com parênteses: funcionarios do setor 'TI' ou 'RH' com salario > 5000
SELECT nome, setor, salario
FROM funcionarios
WHERE (setor = 'TI' OR setor = 'RH') AND salario > 5000;
5. Operador NOT: Negando Condições
5.1. NOT aplicado a operadores de comparação
-- Funcionários que não são do setor de TI
SELECT nome, setor
FROM funcionarios
WHERE NOT setor = 'TI';
-- Funcionários com salário não maior que 5000
SELECT nome, salario
FROM funcionarios
WHERE NOT salario > 5000;
5.2. NOT combinado com AND e OR — lógica de exclusão
-- Funcionários que não são nem 'Analista' nem 'Estagiario'
SELECT nome, cargo
FROM funcionarios
WHERE NOT (cargo = 'Analista' OR cargo = 'Estagiario');
5.3. Exemplo: filtrar registros que não atendem a um intervalo
-- Produtos com preço fora da faixa de 100 a 500
SELECT nome, preco
FROM produtos
WHERE NOT (preco >= 100 AND preco <= 500);
6. Exemplos Práticos e Armadilhas Comuns
6.1. Exemplo com múltiplas condições
SELECT nome, salario, cargo
FROM funcionarios
WHERE salario >= 3000 AND cargo = 'Analista';
6.2. Exemplo com datas
SELECT nome, data_cadastro
FROM clientes
WHERE data_cadastro > '2024-01-01' AND data_cadastro < '2024-12-31';
6.3. Erros frequentes
Erro 1: Esquecer parênteses em combinações de AND/OR
-- ERRADO: pode gerar resultado inesperado
SELECT * FROM funcionarios
WHERE cargo = 'Analista' OR cargo = 'Gerente' AND salario > 10000;
-- CORRETO
SELECT * FROM funcionarios
WHERE (cargo = 'Analista' OR cargo = 'Gerente') AND salario > 10000;
Erro 2: Confundir = com ==
Em SQL, o operador de igualdade é =, não ==. Usar == causa erro de sintaxe.
-- ERRADO
SELECT nome FROM funcionarios WHERE cargo == 'Analista';
-- CORRETO
SELECT nome FROM funcionarios WHERE cargo = 'Analista';
Erro 3: Misturar AND/OR sem ordem clara
Sempre use parênteses para explicitar a ordem de avaliação, mesmo que o SQL entenda sem eles. Isso melhora a legibilidade e evita bugs.
7. Boas Práticas e Performance
7.1. Escrever condições na ordem que favorece índices
Coloque primeiro as condições que usam colunas indexadas e que são mais seletivas (filtram mais registros).
-- Se 'data_cadastro' for indexada e 'status' não, coloque data primeiro
SELECT *
FROM clientes
WHERE data_cadastro > '2024-01-01' AND status = 'Ativo';
7.2. Evitar funções em colunas dentro do WHERE
Usar funções em colunas no WHERE impede o uso de índices, forçando varreduras completas na tabela.
-- EVITAR: função YEAR() na coluna impede uso de índice
SELECT nome, data_cadastro
FROM clientes
WHERE YEAR(data_cadastro) = 2024;
-- MELHOR: usar intervalo de datas
SELECT nome, data_cadastro
FROM clientes
WHERE data_cadastro >= '2024-01-01' AND data_cadastro < '2025-01-01';
7.3. Uso de parênteses para clareza, mesmo quando não obrigatório
Parênteses extras não prejudicam a performance e tornam o código mais legível e seguro.
-- Recomendado: usar parênteses mesmo quando desnecessário
SELECT nome, salario
FROM funcionarios
WHERE (salario > 5000) AND (cargo = 'Analista');
Referências
- Documentação oficial do PostgreSQL: Operadores de Comparação — Referência completa sobre operadores de comparação no PostgreSQL, incluindo comportamento com NULL.
- W3Schools SQL WHERE Clause — Tutorial interativo com exemplos práticos de filtragem com WHERE e operadores lógicos.
- SQL Server: Operadores Lógicos (Microsoft Learn) — Documentação oficial da Microsoft sobre AND, OR e NOT no SQL Server.
- MySQL 8.0 Reference Manual: Comparison Functions and Operators — Guia completo de operadores de comparação no MySQL, com exemplos e notas sobre tipos de dados.
- SQL Performance Explained: Using WHERE Clauses Efficiently — Artigo técnico sobre como escrever condições WHERE que favorecem o uso de índices e melhoram a performance.
- Mode Analytics SQL Tutorial: WHERE — Tutorial prático com exemplos reais de filtragem de dados usando operadores de comparação e lógicos.