In SQL, il IN
operatore consente di filtrare i risultati della query in base a un elenco di valori.
Puoi anche usarlo per trovare una corrispondenza con qualsiasi valore restituito da una sottoquery (una sottoquery è una query nidificata all'interno di un'altra query).
Tabelle di origine
Le seguenti tabelle vengono utilizzate per gli esempi in questa pagina.
SELECT * FROM PetTypes;
SELECT * FROM Pets;
Risultato:
+-------------+-----------+ | 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)
Esempio
Ecco un esempio per dimostrare il IN
operatore.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName IN ('Fluffy', 'Bark', 'Wag');
Risultato:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 4 | Wag | 2020-03-15 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | +---------+-----------+------------+
Potremmo ottenere lo stesso risultato usando due OR
operatori:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR PetName = 'Bark'
OR PetName = 'Wag';
Tuttavia, il IN
operatore è un modo più conciso per farlo. Il IN
operatore è particolarmente utile quando si dispone di un lungo elenco di valori con cui confrontare.
Il IN
l'operatore viene quasi sempre eseguito più velocemente di più OR
operatori, soprattutto su set di dati più grandi.
Valori numerici
I valori non sono limitati alle sole stringhe. Ad esempio, puoi utilizzare IN
su un elenco di valori numerici.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 5);
Risultato:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+
Date
Ecco un esempio che utilizza un elenco di date.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE DOB IN (
'2020-11-20',
'2018-10-01',
'2015-10-01'
);
Risultato:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | +---------+-----------+------------+
Utilizzo di IN
con sottoquery
Un altro vantaggio del IN
operatore, è che può contenere un altro SELECT
elenco. Questa è nota come sottoquery . Una sottoquery è una query nidificata all'interno di un'altra query (o anche di un'altra sottoquery).
Ecco un esempio.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Risultato:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Questo esempio ci mostra quanti tipi di animali sono presenti nel nostro hotel per animali domestici.
Utilizzo di NOT IN
Potremmo aggiungere il NOT
operatore per capovolgerlo e vedere quanti tipi di animali non sono nel nostro hotel per animali domestici.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );
Risultato:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
In questo caso, il nostro database contiene un tipo di animale domestico di Rabbit
, ma al momento non abbiamo conigli come animali domestici.
Espressioni
I valori forniti sono un elenco di espressioni. Pertanto, puoi fare cose come questa:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 2 + 3);
Risultato:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+