Foto cortesia de Bruno Wolff no Unsplash
A Linguagem de Consulta Estruturada (SQL) é a base do trabalho com bancos de dados relacionais. Entre suas muitas instruções, uma se destaca como essencial para filtragem e precisão de dados: o comando de restrição WHERE
. Seja você um iniciante escrevendo sua primeira consulta ou um analista de dados avançado otimizando queries para performance, dominar o comando de restrição WHERE
é fundamental.
Este artigo irá guiá-lo através de:
WHERE
Ao final, você será capaz de filtrar, manipular e analisar dados com confiança usando WHERE
.
O comando de restrição WHERE
no SQL é usado para filtrar registros em uma consulta. Em vez de recuperar todas as linhas de uma tabela, o WHERE
ajuda a selecionar apenas aquelas que atendem a determinadas condições.
Por exemplo:
SELECT *
FROM employees
WHERE department = 'Sales';
Essa consulta retorna apenas os funcionários que trabalham no departamento de Vendas.
Pense no WHERE
como o porteiro do filtro — ele determina quais linhas passam para o resultado.
A sintaxe geral é:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
table_name
: Nome da tabela a ser consultada.condition
: Uma expressão lógica que retorna verdadeiro ou falso.Se a condição for verdadeira, a linha é incluída. Se for falsa, é excluída.
Suponha que você tenha a tabela students
:
student_id | name | age | grade |
---|---|---|---|
1 | Alice | 20 | A |
2 | Bob | 19 | B |
3 | Charlie | 21 | C |
Consulta:
SELECT *
FROM students
WHERE grade = 'A';
Resultado:
student_id | name | age | grade |
---|---|---|---|
1 | Alice | 20 | A |
SELECT *
FROM students
WHERE age > 19;
Resultado:
student_id | name | age | grade |
---|---|---|---|
1 | Alice | 20 | A |
3 | Charlie | 21 | C |
SELECT *
FROM students
WHERE grade = 'A' OR age < 20;
Resultado:
student_id | name | age | grade |
---|---|---|---|
1 | Alice | 20 | A |
2 | Bob | 19 | B |
O operador IN
permite verificar vários valores possíveis sem escrever múltiplos OR
s.
SELECT *
FROM students
WHERE grade IN ('A', 'B');
SELECT *
FROM students
WHERE age BETWEEN 19 AND 21;
Suponha que temos:
product_id | product_name |
---|---|
1 | Apple iPhone |
2 | Samsung Galaxy |
3 | Apple iPad |
Consulta:
SELECT *
FROM products
WHERE product_name LIKE 'Apple%';
Resultado:
product_id | product_name |
---|---|
1 | Apple iPhone |
3 | Apple iPad |
SELECT *
FROM employees
WHERE manager_id IS NULL;
Essa consulta retorna os funcionários sem gerentes.
Você pode usar outra consulta dentro do comando de restrição WHERE
.
SELECT name
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location = 'London'
);
SELECT name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);
Isso retorna clientes que realizaram pelo menos um pedido.
SELECT *
FROM orders
WHERE YEAR(order_date) = 2024;
SELECT *
FROM employees
WHERE (department = 'Sales' AND salary > 50000)
OR (department = 'IT' AND hire_date > '2022-01-01');
SELECT e.name, d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = 'Finance';
Aliases deixam suas consultas mais limpas:
SELECT e.name, e.salary
FROM employees e
WHERE e.salary > 60000;
Na maioria dos bancos (como MySQL), WHERE name = 'Alice'
não diferencia maiúsculas de minúsculas. Já em outros (como PostgreSQL), diferencia. Use ILIKE
(Postgres) para correspondência sem diferenciação de maiúsculas.
Filtrar grandes conjuntos de dados é mais rápido se a coluna usada no filtro estiver indexada.
Exemplo:
CREATE INDEX idx_salary ON employees(salary);
Recupere apenas as colunas necessárias:
SELECT name, grade
FROM students
WHERE grade = 'A';
Em vez de escrever lógica confusa:
WHERE department = 'Sales' OR department = 'Marketing'
Use:
WHERE department IN ('Sales', 'Marketing');
-- ERRADO
WHERE name = Alice;
-- CORRETO
WHERE name = 'Alice';
-- ERRADO
WHERE manager_id = NULL;
-- CORRETO
WHERE manager_id IS NULL;
-- ERRADO
WHERE grade = 'A' OR grade = 'B' AND age > 20;
-- CORRETO
WHERE (grade = 'A' OR grade = 'B') AND age > 20;
Isso pode impedir o uso de índices:
-- LENTO
WHERE YEAR(order_date) = 2024;
-- MELHOR
WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01';
Sempre especifique as colunas para evitar sobrecarga desnecessária.
student_id | name | age | grade |
---|---|---|---|
1 | Alice | 20 | A |
2 | Bob | 19 | B |
3 | Charlie | 21 | C |
4 | Diana | 22 | B |
5 | Ethan | 20 | A |
employee_id | name | department | salary | hire_date | manager_id |
---|---|---|---|---|---|
1 | Alice | Sales | 60000 | 2020-03-15 | NULL |
2 | Bob | IT | 75000 | 2021-07-10 | 1 |
3 | Charlie | HR | 50000 | 2019-06-01 | 1 |
4 | Diana | IT | 80000 | 2022-01-20 | 2 |
5 | Ethan | Sales | 55000 | 2023-05-05 | 1 |
product_id | product_name | price | category |
---|---|---|---|
1 | Apple iPhone | 999 | Electronics |
2 | Samsung Galaxy | 899 | Electronics |
3 | Dell Laptop | 1200 | Computers |
4 | Nike Shoes | 150 | Apparel |
5 | Levi’s Jeans | 80 | Apparel |
order_id | customer_id | order_date | amount |
---|---|---|---|
1 | 101 | 2023-01-05 | 500 |
2 | 102 | 2023-02-12 | 150 |
3 | 103 | 2024-03-20 | 1200 |
4 | 101 | 2024-05-15 | 300 |
5 | 104 | 2024-07-25 | 750 |
O comando de restrição WHERE
pode parecer simples, mas é uma das ferramentas mais poderosas do SQL. Ela permite filtrar linhas com base em condições que variam de comparações simples a subconsultas complexas.
=
, <
, >
).IN
, BETWEEN
, LIKE
e IS NULL
.WHERE
com joins, subconsultas e estratégias de indexação para eficiência.Praticando com os datasets de exemplo e mantendo em mente as dicas e erros comuns, você dominará a filtragem em SQL.
✅ Próximo passo para você:
Escolha um dos datasets acima, carregue no seu banco favorito (MySQL, PostgreSQL ou SQLite) e escreva consultas usando o comando de restrição WHERE
. Comece pequeno e aumente a complexidade aos poucos.