Voltar para a lista de artigos Artigos
8 minutos de leitura

Operador SQL IN

Por que você precisa conhecer o operador SQL IN? Descubra o que você pode fazer com esse pequeno, mas poderoso operador.

O operador IN é uma ferramenta fundamental no SQL, permitindo que os analistas e desenvolvedores de dados filtrem e recuperem subconjuntos específicos de dados dos bancos de dados. Embora seu uso básico possa parecer simples, dominar as nuances e os aplicativos avançados do operador SQL IN pode aprimorar muito suas habilidades em SQL e levar a consultas mais eficientes e otimizadas.

Neste guia abrangente, vamos nos aprofundar no operador SQL IN, abordando sua sintaxe, casos de uso, considerações de desempenho e práticas recomendadas.

Introdução ao operador SQL IN

O operador SQL IN é usado para verificar se um valor corresponde a qualquer valor em uma lista ou subconsulta especificada. Ele oferece uma maneira concisa de combinar várias condições usando a lógica OR sem precisar escrever explicitamente cada condição separadamente. Isso pode simplificar bastante suas consultas SQL e melhorar a legibilidade, especialmente quando estiver lidando com um grande número de condições.

Se estiver procurando um ponto de partida para criar bases sólidas de SQL, recomendo nosso curso SQL para Iniciantes . Ele contém 129 exercícios práticos para que você possa dominar o SQL fundamental e aumentar sua confiança. Se você já conhece os conceitos básicos de SQL, confira nosso Trilha de Práticas em SQL - ele tem mais de 1.000 exercícios para ajudá-lo a aprimorar suas habilidades.

Uso do operador SQL IN

Um dos casos mais comuns de uso do SQL IN é verificar se um valor corresponde a qualquer valor em uma lista. Veja um exemplo:

SELECT *
FROM employees
WHERE department_id IN (10, 20, 30);

Nessa consulta, o operador SQL IN é usado para recuperar todas as linhas da tabela employees em que department_id é 10, 20 ou 30.

Sintaxe do operador IN

O operador SQL IN funciona como uma abreviação para várias condições OR no mesmo campo, tornando a consulta mais concisa e legível. Veja a seguir a sintaxe básica:

SELECT column1, column2, ...
FROM table_name
WHERE column_name IN (value1, value2, ...);

Uso do operador SQL NOT IN

O operador SQL NOT IN é o oposto do operador SQL IN. Ele é usado para recuperar registros em que o valor não corresponde a nenhum valor da lista especificada. Veja um exemplo:

SELECT *
FROM products
WHERE product_category NOT IN ('Electronics', 'Clothing');

Essa consulta recupera todas as linhas da tabela products em que product_category não é "Eletrônicos" ou "Roupas".

Uso de IN com SELECT

O operador SQL IN também pode ser usado em conjunto com uma subconsulta, que é uma consulta aninhada dentro de outra consulta. Essa combinação poderosa permite filtrar dados com base nos resultados de outra consulta. Veja um exemplo:

SELECT product_name, product_price
FROM products
WHERE product_id IN (
SELECT product_id FROM orders WHERE order_date >= '2023-01-01'
);

Nessa consulta, a subconsulta SELECT product_id FROM orders WHERE order_date >= '2023-01-01' recupera uma lista de valores product_id para pedidos feitos em 1º de janeiro de 2023 ou após essa data. Em seguida, a consulta principal usa o operador IN para recuperar product_name e product_price para todos os produtos cujo product_id esteja na lista retornada pela subconsulta.

Esse é apenas um exemplo de como você pode utilizar uma subconsulta em um operador IN. Há vários tipos de subconsultas que podem ser escritas em SQL, mas, para entender melhor, recomendamos dar uma olhada em mais exemplos de como usar uma subconsulta.

Uso de NOT IN com SELECT

Assim como no exemplo anterior, é possível usar o operador NOT IN com uma subconsulta para recuperar registros que não correspondam aos resultados da subconsulta. Aqui está um exemplo:

SELECT employee_name, department_name
FROM employees
WHERE department_id NOT IN (SELECT department_id
 FROM departments
 WHERE location = 'New York');

Essa consulta recupera o nome_do_funcionário e o nome_do_departamento de todos os funcionários que não estão em departamentos localizados em Nova York. A subconsulta SELECT department_id FROM departments WHERE location = 'New York' recupera uma lista de valores department_id para departamentos localizados em Nova York. Em seguida, a consulta principal usa o operador SQL NOT IN para excluir funcionários cujo department_id esteja na lista retornada pela subconsulta.

Exercício: Desafio do operador IN

Agora que lemos sobre diferentes maneiras de usar o operador IN para resolver problemas complexos de SQL, é hora de praticar o que aprendemos.

Imagine que você está trabalhando com um banco de dados que armazena informações sobre livros. O banco de dados tem uma tabela chamada Books com as seguintes colunas: BookID, Title, AuthorID, e GenreID. Há outra tabela chamada Genres (Gêneros ) com as colunas GenreID e GenreName. Aqui está um exemplo de algumas linhas que essas tabelas conteriam.

A Books tabela:

BookIDTitleAuthorIDGenreID
1The Hitchhiker's Guide to the Galaxy11
2Dune21
3The Lord of the Rings32
4The Da Vinci Code43
5Harry Potter and the Sorcerer’s Stone52
6The Girl on the Train63
7Pride and Prejudice74

A tabela Genres tabela:

GenreIDGenreName
1Science Fiction
2Fantasy
3Mystery
4Romance
5Non-Fiction

Seu desafio é escrever uma consulta SQL que selecione todos os títulos de livros que pertençam aos gêneros "Ficção científica", "Fantasia" ou "Mistério". (Suponha que você ainda não conheça os valores GenreID para esses gêneros).

Solução:

SELECT Title
FROM Books
WHERE GenreID IN (SELECT GenreID 
  FROM Genres 
  WHERE GenreName = 'Science Fiction' 
    OR GenreName = 'Fantasy' 
    OR GenreName = 'Mystery');

Explicação:

Selecione os títulos dos livros na tabela Books tabela. Filtre os resultados usando uma cláusula WHERE com o operador IN para incluir somente as linhas em que o GenreID é o mesmo que GenreID na tabela Genres para "Science Fiction" (Ficção científica), "Fantasy" (Fantasia) ou "Mystery" (Mistério).

Como alternativa, você pode escrever uma consulta que use dois operadores IN:

SELECT Title
FROM Books
WHERE GenreID IN (SELECT GenreID 
  FROM Genres 
  WHERE GenreName 
  IN ('Science Fiction','Fantasy','Mystery'));

Resultado:

Title
The Hitchhiker's Guide to the Galaxy
Dune
The Lord of the Rings
Harry Potter and the Sorcerer's Stone
The Da Vinci Code
The Girl on the Train

Exemplos avançados de IN e casos de uso

Embora o uso básico do operador SQL IN seja relativamente simples, seu verdadeiro poder está na capacidade de lidar com cenários complexos e casos de uso avançados. Vamos explorar alguns deles:

Subconsultas correlacionadas

As subconsultas correlacionadas são subconsultas que fazem referência a colunas da consulta externa. Isso permite que você filtre dados com base em critérios complexos que envolvem várias tabelas e condições. Veja um exemplo:

SELECT product_name, category_name
FROM products p
JOIN categories c ON p.category_id = c.category_id
WHERE p.product_id IN (SELECT product_id
  FROM order_items oi
  WHERE oi.order_id IN (SELECT order_id
FROM orders
WHERE customer_id = 1001));

Nessa consulta, a subconsulta mais interna recupera os valores de order_id para um cliente específico. A subconsulta intermediária usa esses valores order_id para recuperar os valores product_id correspondentes da tabela order_items tabela. Por fim, a consulta principal usa o operador SQL IN para recuperar product_name e category_name para esses produtos.

As subconsultas correlacionadas são apenas uma das maneiras avançadas de usar o operador IN. Para obter uma compreensão profunda de todos os tipos de subconsultas, recomendamos estes 15 exercícios práticos de subconsultas.

Manuseio de grandes listas de valores

Ao trabalhar com grandes listas de valores, usar uma subconsulta ou uma tabela temporária pode ser mais eficiente do que listar todos os valores na cláusula SQL IN. Isso pode melhorar o desempenho da consulta e reduzir o risco de atingir os limites de comprimento de consulta impostos pelo seu sistema de gerenciamento de banco de dados. Veja um exemplo:

-- Create a temporary table with the desired values
CREATE TEMPORARY TABLE temp_values (value INT);
INSERT INTO temp_values (value) VALUES (10), (20), (30), ...;
-- Use the temporary table with the SQL IN operator
SELECT *
FROM employees
WHERE department_id IN (SELECT value FROM temp_values);

Neste exemplo, uma tabela temporária temp_values é criada e preenchida com os valores desejados. Em seguida, a consulta principal usa uma subconsulta para recuperar esses valores da tabela temporária e filtrar a employees tabela de acordo.

Combinação de IN com outros operadores

O operador IN pode ser combinado com outros operadores SQL, como AND e OR, para criar condições de filtragem mais complexas. Isso permite lidar com cenários em que você precisa filtrar dados com base em vários critérios que envolvem diferentes operadores. Veja um exemplo:

SELECT *
FROM orders
WHERE order_date >= '2023-01-01'
  AND customer_id IN (SELECT customer_id
 FROM customers
 WHERE country = 'USA')
  AND total_amount > 1000;

Nessa consulta, IN é usado em combinação com AND para filtrar pedidos com base na data do pedido, no país do cliente e no valor total.

Agora é hora de praticar o uso do SQL IN

O operador IN é uma ferramenta poderosa e versátil que pode simplificar muito suas tarefas de análise de dados e relatórios SQL. Ao compreender a sintaxe, o uso avançado, as considerações de desempenho e as práticas recomendadas, você poderá aproveitar o IN para filtrar e recuperar com eficácia os dados relevantes dos bancos de dados e, ao mesmo tempo, garantir o desempenho ideal da consulta e a facilidade de manutenção.

Obrigado por ler o nosso artigo; esperamos que tenha gostado de conhecer os recursos avançados do operador SQL IN. Se estiver começando a usar o SQL, confira nosso curso interativo SQL para Iniciantes. Se você for um usuário experiente de SQL e estiver em busca de prática, confira o nosso Trilha de Práticas em SQL . Bom aprendizado!