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