I SQL er IN
operator giver dig mulighed for at filtrere dine forespørgselsresultater baseret på en liste med værdier.
Du kan også bruge den til at matche enhver værdi, der returneres af en underforespørgsel (en underforespørgsel er en forespørgsel, der er indlejret i en anden forespørgsel).
Kildetabeller
Følgende tabeller bruges til eksemplerne på denne side.
SELECT * FROM PetTypes;
SELECT * FROM Pets;
Resultat:
+-------------+-----------+ | 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)
Eksempel
Her er et eksempel til at demonstrere IN
operatør.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName IN ('Fluffy', 'Bark', 'Wag');
Resultat:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 4 | Wag | 2020-03-15 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | +---------+-----------+------------+
Vi kunne opnå det samme resultat ved at bruge to OR
operatører:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR PetName = 'Bark'
OR PetName = 'Wag';
Men IN
operatør er en mere kortfattet måde at gøre det på. IN
operator er især fordelagtig, når du har en lang liste af værdier, som du kan sammenligne med.
IN
operator udfører næsten altid hurtigere end flere OR
operatører, især på større datasæt.
Numeriske værdier
Værdierne er ikke begrænset til kun strenge. For eksempel kan du bruge IN
på en liste over numeriske værdier.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 5);
Resultat:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+
Datoer
Her er et eksempel, der bruger en liste over datoer.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE DOB IN (
'2020-11-20',
'2018-10-01',
'2015-10-01'
);
Resultat:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | +---------+-----------+------------+
Brug af IN
med underforespørgsler
En anden fordel ved IN
operator, er, at den kan indeholde en anden SELECT
liste. Dette er kendt som en underforespørgsel . En underforespørgsel er en forespørgsel, der er indlejret i en anden forespørgsel (eller endda en anden underforespørgsel).
Her er et eksempel.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Resultat:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Dette eksempel viser os, hvor mange kæledyrstyper der er på vores kæledyrshotel.
Ved brug af NOT IN
Vi kunne tilføje NOT
operatør til at vende dette rundt og se, hvor mange kæledyrstyper der ikke er i vores dyrehotel.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );
Resultat:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
I dette tilfælde indeholder vores database en kæledyrstype Rabbit
, men vi har i øjeblikket ingen kaniner som kæledyr.
Udtryk
De angivne værdier er en liste over udtryk. Derfor kan du gøre ting som dette:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 2 + 3);
Resultat:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+