В SQL, IN
операторът ви позволява да филтрирате резултатите от заявката си въз основа на списък със стойности.
Можете също да го използвате, за да съответства на всяка стойност, върната от подзаявка (подзаявката е заявка, която е вложена в друга заявка).
Изходни таблици
Следните таблици се използват за примерите на тази страница.
SELECT * FROM PetTypes;
SELECT * FROM Pets;
Резултат:
+-------------+-----------+ | 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)
Пример
Ето пример за демонстриране на IN
оператор.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName IN ('Fluffy', 'Bark', 'Wag');
Резултат:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 4 | Wag | 2020-03-15 | | 6 | Fluffy | 2020-09-17 | | 7 | Bark | NULL | +---------+-----------+------------+
Можем да постигнем същия резултат, като използваме две OR
оператори:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetName = 'Fluffy'
OR PetName = 'Bark'
OR PetName = 'Wag';
Въпреки това, IN
operator е по-сбит начин да го направите. IN
операторът е особено полезен, когато имате дълъг списък от стойности, с които да сравните.
IN
операторът почти винаги се изпълнява по-бързо от множество OR
оператори, особено при по-големи набори от данни.
Числови стойности
Стойностите не са ограничени само до низове. Например, можете да използвате IN
в списък с числови стойности.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 5);
Резултат:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+
Дати
Ето пример, който използва списък с дати.
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE DOB IN (
'2020-11-20',
'2018-10-01',
'2015-10-01'
);
Резултат:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | +---------+-----------+------------+
Използване на IN
с подзаявки
Друго предимство на IN
оператор, е, че може да съдържа друг SELECT
списък. Това е известно като подзаявка . Подзаявката е заявка, която е вложена в друга заявка (или дори друга подзаявка).
Ето един пример.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Резултат:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Този пример ни показва колко вида домашни любимци има в нашия хотел за домашни любимци.
Използване на NOT IN
Бихме могли да добавим NOT
оператор, за да обърне това и да види колко вида домашни любимци не в нашия хотел за домашни любимци.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId NOT IN ( SELECT PetTypeId FROM Pets );
Резултат:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
В този случай нашата база данни съдържа домашен любимец тип Rabbit
, но в момента нямаме зайци като домашни любимци.
Изрази
Предоставените стойности са списък с изрази. Следователно можете да правите неща като това:
SELECT
PetId,
PetName,
DOB
FROM Pets
WHERE PetId IN (1, 3, 2 + 3);
Резултат:
+---------+-----------+------------+ | PetId | PetName | DOB | |---------+-----------+------------| | 1 | Fluffy | 2020-11-20 | | 3 | Scratch | 2018-10-01 | | 5 | Tweet | 2020-11-28 | +---------+-----------+------------+