No SQL, o
IN
O operador permite filtrar os resultados da consulta com base em uma lista de valores. Você também pode usá-lo para corresponder a qualquer valor retornado por uma subconsulta (uma subconsulta é uma consulta aninhada dentro de outra consulta).
Tabelas de origem
As tabelas a seguir são usadas para os exemplos nesta página.
SELECT * FROM PetTypes;
SELECT * FROM Pets;
Resultado:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected) +---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Exemplo
Aqui está um exemplo para demonstrar o
IN
operador. SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName IN ('Fluffy', 'Bark', 'Wag');
Resultado:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 4 | Wag | 2020-03-15 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | +---------+-----------+------------+
Poderíamos obter o mesmo resultado usando dois
OR
operadores:SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR PetName = 'Bark'
OR PetName = 'Wag';
No entanto, o
IN
operador é uma maneira mais concisa de fazê-lo. O IN
O operador é especialmente benéfico quando você tem uma longa lista de valores para comparar. O
IN
operador quase sempre executa mais rápido que vários OR
operadores, especialmente em conjuntos de dados maiores. Valores numéricos
Os valores não se limitam apenas a strings. Por exemplo, você pode usar
IN
em uma lista de valores numéricos. SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 5);
Resultado:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+
Datas
Aqui está um exemplo que usa uma lista de datas.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE DOB IN (
'2020-11-20',
'2018-10-01',
'2015-10-01'
);
Resultado:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | +---------+-----------+------------+
Usando IN
com subconsultas
Outro benefício do
IN
operador, é que ele pode conter outro SELECT
Lista. Isso é conhecido como uma subconsulta . Uma subconsulta é uma consulta aninhada dentro de outra consulta (ou mesmo outra subconsulta). Aqui está um exemplo.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Resultado:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Este exemplo nos mostra quantos tipos de animais de estimação existem em nosso hotel para animais de estimação.
Usando NOT IN
Poderíamos adicionar o
NOT
operador para inverter isso e ver quantos tipos de animais de estimação não em nosso hotel para animais de estimação. SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );
Resultado:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
Neste caso, nosso banco de dados contém um tipo de animal de estimação de
Rabbit
, mas atualmente não temos coelhos como animais de estimação. Expressões
Os valores fornecidos são uma lista de expressões. Portanto, você pode fazer coisas assim:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 2 + 3);
Resultado:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+