Na lição anterior, aprendemos como usar a cláusula WHERE com operadores de comparação simples. No entanto, a análise de dados no mundo real frequentemente exige a filtragem por vários critérios simultaneamente. Para fazer isso, usamos operadores lógicos: AND, OR e NOT.
Os operadores lógicos permitem conectar múltiplas expressões em uma cláusula WHERE para criar filtros mais sofisticados.
O operador AND retorna linhas apenas se todas as condições separadas por AND forem verdadeiras. Ele é usado para restringir seus resultados.
Exemplo (Banco de Dados Sakila) Suponha que queiramos encontrar filmes que tenham classificação 'G' e menos de 80 minutos de duração:
SELECT title, length, rating
FROM film
WHERE length < 80 AND rating = 'G';
O operador OR retorna linhas se qualquer uma das condições separadas por OR for verdadeira. Ele é usado para ampliar seus resultados.
Exemplo (Banco de Dados Sakila) Para encontrar atores com o primeiro nome 'NICK' ou 'ED':
SELECT first_name, last_name
FROM actor
WHERE first_name = 'NICK' OR first_name = 'ED';
O operador NOT exibe um registro se a(s) condição(ões) NÃO for(em) verdadeira(s). Ele inverte efetivamente a lógica de uma condição.
Exemplo (Banco de Dados Sakila) Para encontrar todos os filmes, exceto aqueles com classificação 'R':
SELECT title, rating
FROM film
WHERE NOT rating = 'R';
O operador XOR retorna verdadeiro apenas quando exatamente uma entre duas condições é verdadeira. Na prática, ele é pouco usado porque não é suportado por todos os dialetos SQL e pode reduzir a legibilidade da consulta.
Exemplo (Banco de Dados Sakila) Para encontrar filmes em que apenas uma condição seja verdadeira: ou a duração é menor que 60 minutos, ou a classificação é 'G', mas não ambas ao mesmo tempo:
SELECT title, length, rating
FROM film
WHERE length < 60 XOR rating = 'G';
Para maior portabilidade entre diferentes bancos de dados, essa mesma lógica costuma ser escrita com AND/OR/NOT.
Quando você combina vários operadores em uma única consulta (por exemplo, usando AND e OR), o SQL segue uma ordem específica de operações (precedência).
NOT é avaliado primeiro.AND é avaliado segundo.XOR (se suportado pelo seu dialeto SQL) geralmente é avaliado após AND.OR é avaliado por último.O Poder dos Parênteses:
Assim como na matemática, você deve usar parênteses () para controlar a ordem de avaliação e tornar suas consultas mais legíveis. Sem eles, o SQL aplica silenciosamente sua precedência padrão — e o resultado pode não ser o que você esperava.
Consulta incorreta — parênteses ausentes:
-- ERRO: AND tem maior precedência que OR, então isso é avaliado como:
-- rating = 'G' OR (rating = 'PG' AND length < 60)
-- Resultado: TODOS os filmes 'G' (qualquer duração) + apenas filmes 'PG' CURTOS
SELECT title, length, rating
FROM film
WHERE rating = 'G' OR rating = 'PG' AND length < 60;
Por que está errado: a condição AND é avaliada primeiro, portanto o filtro length < 60 só se aplica aos filmes 'PG', enquanto todos os filmes 'G' — independentemente da duração — passam pelo filtro.
Consulta correta — parênteses tornam a intenção explícita:
-- CORRETO: parênteses forçam o OR a ser avaliado primeiro
-- Resultado: apenas filmes classificados 'G' OU 'PG' E com menos de 60 minutos
SELECT title, length, rating
FROM film
WHERE (rating = 'G' OR rating = 'PG') AND length < 60;
Consulta incorreta — NOT nega apenas a primeira condição:
-- ERRO: NOT aplica-se apenas à condição imediatamente seguinte
-- Equivalente a: (NOT rating = 'R') AND rating = 'NC-17'
-- Resultado: todos os filmes classificados 'NC-17' (pois 'NC-17' não é 'R', NOT é sempre verdadeiro)
SELECT title, rating, length
FROM film
WHERE NOT rating = 'R' AND rating = 'NC-17';
Por que está errado: NOT nega apenas rating = 'R', deixando rating = 'NC-17' como filtro positivo. A consulta efetivamente retorna todos os filmes classificados como 'NC-17' — porque 'NC-17' não é 'R', a condição NOT é sempre satisfeita para essas linhas. Em vez de excluir filmes NC-17, a consulta retorna exatamente os filmes que você queria excluir.
Opção A — duas condições NOT explícitas:
-- CORRETO: cada condição é negada independentemente
SELECT title, rating, length
FROM film
WHERE NOT rating = 'R' AND NOT rating = 'NC-17';
Opção B — NOT com parênteses (mais conciso):
-- CORRETO: NOT aplica-se a todo o grupo OR
SELECT title, rating, length
FROM film
WHERE NOT (rating = 'R' OR rating = 'NC-17');
Ambas as opções retornam o mesmo resultado. A opção B é geralmente preferida ao excluir vários valores — ela escala melhor à medida que a lista cresce.
Principais conclusões desta lição:
AND para garantir que todas as condições sejam atendidas.OR para encontrar correspondências para qualquer uma das várias condições.NOT para excluir dados específicos.XOR com cuidado: pode ser útil, mas não é suportado por todos os dialetos SQL.() ao misturar AND e OR para evitar erros lógicos e melhorar a clareza.Na próxima lição, aprenderemos como ordenar e limitar os resultados para organizar seus dados de maneira mais eficaz.