Database
 sql >> Base de Dados >  >> RDS >> Database

Operador SQL IN para iniciantes


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 |
+---------+-----------+------------+