V SQL, IN
Operátor umožňuje filtrovat výsledky dotazu na základě seznamu hodnot.
Můžete jej také použít k porovnání jakékoli hodnoty vrácené poddotazem (poddotaz je dotaz, který je vnořen do jiného dotazu).
Tabulky zdrojů
Následující tabulky jsou použity pro příklady na této stránce.
SELECT * FROM PetTypes;
SELECT * FROM Pets;
Výsledek:
+-------------+-----------+ | 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)
Příklad
Zde je příklad demonstrující IN
operátor.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName IN ('Fluffy', 'Bark', 'Wag');
Výsledek:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 4 | Wag | 2020-03-15 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | +---------+-----------+------------+
Stejného výsledku bychom mohli dosáhnout použitím dvou OR
operátoři:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR PetName = 'Bark'
OR PetName = 'Wag';
Nicméně IN
operátor je stručnější způsob, jak to udělat. IN
Operátor je zvláště výhodný, když máte dlouhý seznam hodnot, se kterými můžete porovnávat.
IN
Operátor se téměř vždy provádí rychleji než více OR
operátorů, zejména u větších datových souborů.
Číselné hodnoty
Hodnoty nejsou omezeny pouze na řetězce. Můžete například použít IN
na seznamu číselných hodnot.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 5);
Výsledek:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+
Data
Zde je příklad, který používá seznam dat.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE DOB IN (
'2020-11-20',
'2018-10-01',
'2015-10-01'
);
Výsledek:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | +---------+-----------+------------+
Pomocí IN
s poddotazy
Další výhoda IN
operátor je, že může obsahovat další SELECT
seznam. Toto je známé jako poddotaz . Poddotaz je dotaz, který je vnořen do jiného dotazu (nebo dokonce jiného poddotazu).
Zde je příklad.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Výsledek:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Tento příklad nám ukazuje, kolik druhů zvířat je v našem hotelu pro domácí mazlíčky.
Pomocí NOT IN
Mohli bychom přidat NOT
operátora otočte a uvidíte, kolik typů mazlíčků ne je v našem zvířecím hotelu.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );
Výsledek:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
V tomto případě naše databáze obsahuje mazlíčka typu Rabbit
, ale v současné době nemáme žádné králíky jako domácí mazlíčky.
Výrazy
Uvedené hodnoty jsou seznamem výrazů. Proto můžete dělat věci jako toto:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 2 + 3);
Výsledek:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+