I SQL, IN
operatorn låter dig filtrera dina frågeresultat baserat på en lista med värden.
Du kan också använda den för att matcha alla värden som returneras av en underfråga (en underfråga är en fråga som är kapslad i en annan fråga).
Källtabeller
Följande tabeller används för exemplen på den här sidan.
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)
Exempel
Här är ett exempel för att demonstrera 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 skulle kunna uppnå samma resultat genom att använda två OR
operatörer:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR PetName = 'Bark'
OR PetName = 'Wag';
Men IN
operatör är ett mer kortfattat sätt att göra det på. IN
operatören är särskilt fördelaktig när du har en lång lista med värden att jämföra med.
IN
operatorn körs nästan alltid snabbare än flera OR
operatörer, särskilt på större datamängder.
Numeriska värden
Värdena är inte begränsade till bara strängar. Du kan till exempel använda IN
på en lista med numeriska värden.
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 | +---------+-----------+------------+
Datum
Här är ett exempel som använder en lista med datum.
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 | +---------+-----------+------------+
Använder IN
med underfrågor
En annan fördel med IN
operatorn, är att den kan innehålla en annan SELECT
lista. Detta är känt som en underfråga . En underfråga är en fråga som är kapslad i en annan fråga (eller till och med en annan underfråga).
Här är ett exempel.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Resultat:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Det här exemplet visar hur många djurtyper som finns på vårt djurhotell.
Med NOT IN
Vi skulle kunna lägga till NOT
operatören att vända på detta och se hur många husdjurstyper som inte är i vårt djurhotell.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );
Resultat:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
I det här fallet innehåller vår databas en husdjurstyp av Rabbit
, men vi har för närvarande inga kaniner som husdjur.
Uttryck
De angivna värdena är en lista med uttryck. Därför kan du göra sådant här:
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 | +---------+-----------+------------+