W SQL EXISTS
operator określa podzapytanie do przetestowania pod kątem istnienia wierszy. Zwraca TRUE
gdy podzapytanie zwróci jeden lub więcej wierszy.
Podzapytanie to zapytanie zagnieżdżone w innym zapytaniu (lub nawet innym podzapytaniu)
Ten artykuł zawiera kilka podstawowych przykładów EXISTS
operatora.
Tabele źródłowe
Poniższe tabele są używane jako przykłady na tej stronie.
SELECT * FROM PetTypes;
SELECT * FROM Pets;
Wynik:
+-------------+-----------+ | 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)
Przykład
Oto przykład demonstrujący EXISTS
operatora.
SELECT
pt.PetTypeId,
pt.PetType
FROM PetTypes pt
WHERE EXISTS (
SELECT p.PetTypeId
FROM Pets p
WHERE p.PetTypeId = pt.PetTypeId
);
Wynik:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Ten przykład pokazuje nam, ile rodzajów zwierząt znajduje się w naszym hotelu dla zwierząt. W rzeczywistości istnieją cztery typy zwierząt, ale tylko trzy z nich pasują do rzeczywistego zwierzaka w Pets
tabela.
Daje to ten sam wynik, który otrzymalibyśmy z następującym zapytaniem, które używa IN
operatora.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Korzystanie z NOT EXISTS
Moglibyśmy dodać NOT
operatora, aby zanegować wyniki i zobaczyć, ile typów zwierząt nie w naszym hotelu dla zwierząt.
SELECT
pt.PetTypeId,
pt.PetType
FROM PetTypes pt
WHERE NOT EXISTS (
SELECT p.PetTypeId
FROM Pets p
WHERE p.PetTypeId = pt.PetTypeId
);
Wynik:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 4 | Rabbit | +-------------+-----------+
W tym przypadku nasza baza danych zawiera typ zwierzaka Rabbit
, ale obecnie nie mamy żadnych królików jako zwierząt domowych.