Database
 sql >> Database >  >> RDS >> Database

Operatore SQL IN per principianti

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