В SQL, EXISTS
операторът посочва подзаявка, която да тества за съществуването на редове. Връща TRUE
когато подзаявката върне един или повече реда.
Подзаявката е заявка, която е вложена в друга заявка (или дори друга подзаявка)
Тази статия съдържа някои основни примери за EXISTS
оператор.
Изходни таблици
Следните таблици се използват за примерите на тази страница.
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)
Пример
Ето пример за демонстрация на EXISTS
оператор.
SELECT
pt.PetTypeId,
pt.PetType
FROM PetTypes pt
WHERE EXISTS (
SELECT p.PetTypeId
FROM Pets p
WHERE p.PetTypeId = pt.PetTypeId
);
Резултат:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Този пример ни показва колко вида домашни любимци има в нашия хотел за домашни любимци. Всъщност има четири типа домашни любимци, но само три от тях съвпадат с истински домашен любимец в Pets
таблица.
Това осигурява същия резултат, който бихме получили със следната заявка, която използва IN
оператор.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Използване на NOT EXISTS
Бихме могли да добавим NOT
оператор, за да отхвърлите резултатите и да видите колко вида домашни любимци не в нашия хотел за домашни любимци.
SELECT
pt.PetTypeId,
pt.PetType
FROM PetTypes pt
WHERE NOT EXISTS (
SELECT p.PetTypeId
FROM Pets p
WHERE p.PetTypeId = pt.PetTypeId
);
Резултат:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
В този случай нашата база данни съдържа домашен любимец тип Rabbit
, но в момента нямаме зайци като домашни любимци.