En SQL, le IN
L'opérateur vous permet de filtrer les résultats de votre requête en fonction d'une liste de valeurs.
Vous pouvez également l'utiliser pour faire correspondre toute valeur renvoyée par une sous-requête (une sous-requête est une requête imbriquée dans une autre requête).
Tableaux sources
Les tableaux suivants sont utilisés pour les exemples sur cette page.
SELECT * FROM PetTypes;
SELECT * FROM Pets;
Résultat :
+-------------+-----------+ | 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)
Exemple
Voici un exemple pour démontrer le IN
opérateur.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName IN ('Fluffy', 'Bark', 'Wag');
Résultat :
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 4 | Wag | 2020-03-15 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | +---------+-----------+------------+
Nous pourrions obtenir le même résultat en utilisant deux OR
opérateurs :
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR PetName = 'Bark'
OR PetName = 'Wag';
Cependant, le IN
L'opérateur est une manière plus concise de le faire. Le IN
L'opérateur est particulièrement utile lorsque vous disposez d'une longue liste de valeurs à comparer.
Le IN
l'opérateur s'exécute presque toujours plus rapidement que plusieurs OR
opérateurs, en particulier sur les grands ensembles de données.
Valeurs numériques
Les valeurs ne sont pas limitées aux chaînes. Par exemple, vous pouvez utiliser IN
sur une liste de valeurs numériques.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 5);
Résultat :
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+
Dates
Voici un exemple qui utilise une liste de dates.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE DOB IN (
'2020-11-20',
'2018-10-01',
'2015-10-01'
);
Résultat :
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | +---------+-----------+------------+
Utiliser IN
avec des sous-requêtes
Un autre avantage du IN
opérateur, est qu'il peut contenir un autre SELECT
liste. C'est ce qu'on appelle une sous-requête . Une sous-requête est une requête imbriquée dans une autre requête (ou même une autre sous-requête).
Voici un exemple.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Résultat :
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Cet exemple nous montre combien de types d'animaux se trouvent dans notre hôtel pour animaux de compagnie.
Utiliser NOT IN
Nous pourrions ajouter le NOT
opérateur pour retourner cela et voir combien de types d'animaux ne sont pas dans notre hôtel pour animaux de compagnie.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );
Résultat :
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
Dans ce cas, notre base de données contient un animal de compagnie de type Rabbit
, mais nous n'avons actuellement aucun lapin comme animal de compagnie.
Expressions
Les valeurs fournies sont une liste d'expressions. Par conséquent, vous pouvez faire des choses comme ceci :
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 2 + 3);
Résultat :
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+