Voltar para a lista de artigos Artigos
10 minutos de leitura

O Guia Completo da Cláusula SQL WHERE

Aprenda como usar a cláusula SQL ONDE quer filtrar as linhas. Neste artigo abrangente, abordamos os operadores de comparação e os operadores ENTRE, IN, LIKE, AND, OR, e NÃO.

Filtrar as linhas de saída é uma das primeiras coisas que você precisa aprender ao iniciar sua jornada SQL. Neste guia, veremos como usar a cláusula SQL WHERE para filtrar as linhas em diferentes cenários. Vamos cobrir casos de uso básico e alguns mais avançados.

A Cláusula WHERE em SQL

Vamos imaginar que você esteja trabalhando em um de seus primeiros projetos SQL e executando suas primeiras consultas SQL. Você já conhece a sintaxe básica da declaração SELECT e como recuperar colunas de uma ou duas tabelas em seu banco de dados. Mas então você notou que muitas vezes você não precisa de todos os registros de uma tabela. Você quer aprender como filtrar sua saída para poder retornar apenas alguns poucos registros que atendam a certos critérios.

Você quer apenas aqueles registros que correspondem a um cliente específico? Ou você precisa recuperar a lista de produtos com baixo estoque (por exemplo, menos de 10 itens)? Ou talvez você queira obter uma lista de representantes de vendas que trabalham na filial X e que tiveram vendas acima da média no último mês?

Em todos estes casos, você precisará da cláusula SQL WHERE para filtrar seus resultados. Esta cláusula introduz certas condições, como por exemplo:

  • quantity < 100
  • price BETWEEN 100 AND 500
  • customer_name = ‘John Smith’.

Para que as condições de filtragem sejam executadas corretamente, a cláusula WHERE deve ser colocada após FROM e JOIN e antes de GROUP BY, HAVING, e ORDER BY.

Por exemplo, aqui está uma consulta SQL para obter informações sobre livros emitidos desde 2020, ordenados pelo nome do autor:

SELECT b.title, a.name, b.year
FROM books b
JOIN authors a
ON books.author_id = authors.id
WHERE b.year >= 2020
ORDER BY a.name;

Note que temos informações combinadas de duas tabelas (books e authors) e colocou a cláusula WHERE após a condição de adesão ON e antes da cláusula ORDER BY. Você pode saber mais sobre a sintaxe correta da cláusula WHERE neste guia para iniciantes.

Também pode ser uma boa idéia começar a praticar a WHERE imediatamente. Neste caso, eu recomendaria nossa SQL para Iniciantes curso. Seus 129 exercícios interativos cobrem os principais conceitos SQL, incluindo condições simples e complexas WHERE.

Se você quiser obter uma visão geral primeiro, vamos continuar explorando os operadores que você pode usar na cláusula WHERE.

Operadores a usar com SQL ONDE

Você pode construir condições de filtragem muito básicas e complexas em WHERE graças a uma ampla gama de operadores que podem ser usados para comparar valores em SQL. Vamos rever as principais que permitem a filtragem por valores numéricos, strings, valores NULL, e uma lista de valores.

Valores numéricos

Para valores numéricos, você pode utilizar estes operadores de comparação:

  • = Igual a.
  • != (ou <>) Não igual a.
  • < Menos do que.
  • <= Menor ou igual a.
  • > Maior do que.
  • >= Maior ou igual a.

Para ver como estes operadores funcionam na prática, teremos alguns exemplos. Para nossos exemplos, utilizaremos a seguinte tabela que inclui informações sobre os vendedores: ID, nome, sobrenome, salário anual, taxa de comissão, a comissão que receberam em 2021, e sua identificação de filial.

salespeople
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
22DembeZuma400000.1231540.705
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502
37IanGarvey430000.08NULL1
38IvanStepanov410000.08NULL1

Primeiro, queremos obter os registros de todos os vendedores cujo salário anual é igual ou superior a 50 mil dólares. Podemos utilizar a seguinte consulta:

SELECT *
FROM salespeople
WHERE salary >= 50000;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
20ElisabethKeen590000.1445350.002
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502

Como esperado, temos a lista de vendedores cujo salário é igual ou superior a $50K.

A seguir, vamos ver como podemos utilizar números de flutuação em vez de números inteiros com os operadores de comparação. Vamos listar todos os vendedores que, graças à sua longa experiência com a empresa, têm uma taxa de comissão acima de 0,12:

SELECT *
FROM salespeople
WHERE commission_rate > 0.12;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
13MeeraMalik500000.1539045.632
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002

Desde que temos usado o operador não incluído > na cláusula WHERE, temos apenas os vendedores cuja taxa de comissão é estritamente acima de 0,12. Isto exclui aqueles cuja taxa é igual a 0,12.

Observe também que temos usado operadores de comparação com os literais (ou seja, 50000 e 0.12). Ao filtrar os registros, também podemos usar operadores de comparação com expressões. Por exemplo, vamos enumerar os vendedores cujos ganhos de comissão em 2021 foram maiores do que seu salário anual:

SELECT *
FROM salespeople
WHERE commission_2021 > salary;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
11KatarinaRostova450000.1547345.601
12AlinaPark430000.1545678.902
18DonaldRessler400000.1441345.752
21TomKeen410000.1241560.751

A consulta funcionou como pretendido; vemos quatro vendedores que aparentemente tiveram vendas muito altas em 2021, de modo que seus ganhos em comissões excederam seu salário.

Neste momento, você deve se sentir mais ou menos à vontade com os operadores de comparação demonstrados acima. É hora de introduzir mais um operador que você pode usar com valores numéricos em WHERE: o operador BETWEEN.

Para listar todos os vendedores cuja taxa de comissão está entre 0,10 e 0,14, você pode usar a seguinte consulta:

SELECT *
FROM salespeople
WHERE commission_rate BETWEEN 0.10 AND 0.14;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
17SamarNavabi520000.1423023.452
18DonaldRessler400000.1441345.752
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
22DembeZuma400000.1231540.705
23AramMojtabai500000.1229050.652
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
34RaymondReddington600000.1017570.805
35HaroldCooper570000.1015450.502

Observe que o operador ENTREVENDE é inclusivo tanto no limite inferior quanto no superior, portanto o conjunto de resultados inclui registros correspondentes às taxas de comissão de 0,10 e 0,14.

Agora, vamos passar para os operadores que você pode usar com valores de texto.

Valores de texto

Em primeiro lugar, com valores de texto, você pode usar o seguinte conjunto de operadores de comparação que trabalham de forma similar com cadeias de caracteres como fazem com valores numéricos, mas no caso dos valores de texto, os registros são ordenados e comparados em ordem alfabética:

  • = Igual a.
  • != (ou <>) Não igual a.
  • < Menor do que (ocorre primeiro em ordem alfabética, ou seja, a < b).
  • <= Menor ou igual a.
  • > Maior do que (ocorre depois em ordem alfabética, isto é, b > a).
  • >= -Mais ou igual a.

Para recuperar informações sobre todos os vendedores cujo sobrenome (quando ordenado alfabeticamente) esteja antes de "Keen", usaríamos a seguinte consulta:

SELECT *
FROM salespeople
WHERE last_name < ‘Keen’;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005
35HaroldCooper570000.1015450.502
37IanGarvey430000.08NULL1

Estes operadores de comparação trabalham bem com valores de texto. No entanto, observe que sempre incluímos aspas com literal de string utilizadas nas condições WHERE (por exemplo, 'Keen'). Além disso, enquanto alguns bancos de dados não são sensíveis a maiúsculas e minúsculas por padrão (por exemplo, SQL Server, MySQL), outros são sensíveis a maiúsculas e minúsculas (por exemplo, Oracle) e não retornariam nenhum registro se você pesquisasse por 'keen' em vez de 'Keen'.

Muitas vezes precisamos de muito mais flexibilidade com strings do que com números, e é aí que o operador LIKE vem a calhar. Ele nos permite fazer alguma filtragem avançada com valores de texto, especialmente quando combinado com um curinga SQL (por exemplo, '_' para um caracter faltando ou '%' para qualquer número de caracteres).

Por exemplo, se quisermos listar todos os vendedores cujo sobrenome comece com K, podemos escrever a seguinte consulta SQL:

SELECT *
FROM salespeople
WHERE last_name LIKE ‘K%’;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
20ElisabethKeen590000.1445350.002
21TomKeen410000.1241560.751
30KateKaplan540000.1025760.455

Leia este artigo se você quiser saber mais sobre como os wildcards SQL podem ser usados para filtrar os registros com valores de texto em SQL.

Comparações com os valores NULL

A combinação de operadores de comparação e valores NULL pode tropeçar nos iniciantes SQL por causa de alguns comportamentos contraintuitivos. Por exemplo, se testarmos que um determinado valor é igual a NULL, o resultado será desconhecido mesmo que o valor da coluna seja NULL. Como a cláusula WHERE exige true condições, você terá zero filas com uma condição como a seguinte:

SELECT *
FROM salespeople
WHERE commission_2021 = NULL;

Result:
Query has no result

A solução é utilizar os operadores IS NULL ou IS NOT NULL. Veja como você pode recuperar todos os registros que têm NULL na coluna commision_2021:

SELECT *
FROM salespeople
WHERE commission_2021 IS NULL;
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
37IanGarvey430000.08NULL1
38IvanStepanov410000.08NULL1

Confira este guia para mais exemplos do comportamento do NULL com vários operadores de comparação.

Operador IN - Comparação com uma lista de valores

Finalmente, você pode usar o operador IN para verificar uma lista de valores pré-definidos. Por exemplo, digamos que você tenha uma lista de funcionários cujos ganhos precisam ser verificados. Você pode recuperar os registros necessários usando uma consulta SQL como esta:

SELECT *
FROM salespeople
WHERE last_name IN (‘Kaplan’, ‘Gerard’, ‘Zuma’);
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
22DembeZuma400000.1231540.705
30KateKaplan540000.1025760.455
32MarvinGerard550000.1022500.005

Parece perfeito! No entanto, muitas vezes há algumas nuances de sintaxe a serem observadas quando se utiliza vários operadores na cláusula WHERE. Para sua conveniência, preparamos uma folha de consulta SQL para Iniciantes de 2 páginas que inclui numerosos exemplos de operadores sendo usados para filtrar a saída de uma consulta SQL.

Combinando condições de filtragem em WHERE

Em tarefas do mundo real, ter uma condição na cláusula WHERE é muitas vezes insuficiente. Felizmente, é possível combinar diferentes condições de filtragem com os operadores AND, OR, e NOT:

  • O operador AND exibe um registro se todas as condições forem verdadeiras.
  • O operador do OR exibe um registro se alguma das condições for verdadeira.
  • O operador do NOT exibe um registro se a condição correspondente não for verdadeira.

Como estes trabalhos se tornarão mais claros com exemplos.

Para listar todos os vendedores que trabalham no ramo #5 e têm salários iguais ou superiores a $50K, use a seguinte consulta:

SELECT *
FROM salespeople
WHERE branch_id = 5 AND salary >= 50000;

Para recuperar todos os registros onde o sobrenome é 'Kaplan' ou 'Reddington', use a seguinte consulta:

SELECT *
FROM salespeople
WHERE last_name = ‘Kaplan’ OR last_name = ‘Reddington’;

Finalmente, para obter informações sobre todos os vendedores , exceto os que trabalham no ramo nº 2, use esta consulta:

SELECT *
FROM salespeople
WHERE NOT branch_id = 2;

Se você quiser obter mais exemplos de utilização AND, OR, e NOT, consulte este artigo.

Para criar condições de filtragem ainda mais complexas, você pode realmente combinar várias condições usando AND, OR, e NOT na mesma declaração WHERE. Entretanto, é importante lembrar a precedência destes operadores em SQL: NÃO EM → E → OU. Para maior clareza, é altamente recomendável o uso de parênteses, mesmo que não sejam necessários em um caso específico.

Digamos que queremos recuperar todos os registros onde o sobrenome de um funcionário é 'Keen' ou 'Park', seus ganhos em comissões foram superiores ao seu salário em 2021, e eles não estão trabalhando no ramo #2. Aqui está uma possível pergunta:

SELECT *
FROM salespeople
WHERE (last_name = ‘Keen’ OR last_name = ‘Park’) 
AND (commission_2021 > salary)
AND (NOT branch_id = 2);
idfirst_namelast_namesalarycommission_ratecommission_2021branch_id
21TomKeen410000.1241560.751

E agora terminamos com os exemplos! Se você precisar de mais orientações sobre a cláusula WHERE com alguns exemplos adicionais, leia mais de nossos guias para iniciantes. E então, pratique, pratique e pratique!

Hora de usar a cláusula SQL ONDE!

A melhor maneira de dominar qualquer novo conceito em SQL é experimentá-lo em múltiplas consultas. Para iniciantes, acho que o ambiente mais confortável para praticar algo novo é em cursos interativos on-line - você tem todos os exemplos prontos para você e pode escrever consultas a partir do conforto de seu navegador.

Para praticar SQL ONDE, eu recomendaria começar com nossos cursos interativos SQL para Iniciantes curso. Ele cobre tudo o que você precisará para começar a recuperar dados de um banco de dados, incluindo a escrita de condições sofisticadas de filtragem.

Para exercícios ainda mais práticos, confira o Trilha de Práticas em SQL pista de aprendizagem. Inclui 5 cursos interativos com centenas de desafios de codificação.

Obrigado por ler, e feliz aprendizado!