En SQL, el IN
El operador le permite filtrar los resultados de su consulta en función de una lista de valores.
También puede usarlo para hacer coincidir cualquier valor devuelto por una subconsulta (una subconsulta es una consulta anidada dentro de otra consulta).
Tablas de origen
Las siguientes tablas se utilizan para los ejemplos de esta 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)
Ejemplo
Aquí hay un ejemplo para demostrar el 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 | +---------+-----------+------------+
Podríamos lograr el mismo resultado usando dos OR
operadores:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR PetName = 'Bark'
OR PetName = 'Wag';
Sin embargo, el IN
operator es una forma más concisa de hacerlo. El IN
El operador es especialmente beneficioso cuando tiene una larga lista de valores con los que comparar.
El IN
operador casi siempre se ejecuta más rápido que múltiples OR
operadores, especialmente en conjuntos de datos más grandes.
Valores numéricos
Los valores no se limitan solo a cadenas. Por ejemplo, puede usar IN
en una 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 | +---------+-----------+------------+
Fechas
Aquí hay un ejemplo que usa una lista de fechas.
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
con subconsultas
Otro beneficio del IN
operador, es que puede contener otro SELECT
lista. Esto se conoce como una subconsulta . Una subconsulta es una consulta anidada dentro de otra consulta (o incluso otra subconsulta).
He aquí un ejemplo.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Resultado:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Este ejemplo nos muestra cuántos tipos de mascotas hay en nuestro hotel para mascotas.
Usando NOT IN
Podríamos agregar el NOT
operador para cambiar esto y ver cuántos tipos de mascotas no en nuestro hotel para mascotas.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );
Resultado:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
En este caso, nuestra base de datos contiene un tipo de mascota de Rabbit
, pero actualmente no tenemos conejos como mascotas.
Expresiones
Los valores proporcionados son una lista de expresiones. Por lo tanto, puedes hacer cosas como esta:
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 | +---------+-----------+------------+