I SQL, EXISTS
operatorn anger en underfråga för att testa förekomsten av rader. Den returnerar TRUE
när underfrågan returnerar en eller flera rader.
En underfråga är en fråga som är kapslad i en annan fråga (eller till och med en annan underfråga)
Den här artikeln innehåller några grundläggande exempel på EXISTS
operatör.
Källtabeller
Följande tabeller används för exemplen på denna sida.
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 visa EXISTS
operatör.
SELECT
pt.PetTypeId,
pt.PetType
FROM PetTypes pt
WHERE EXISTS (
SELECT p.PetTypeId
FROM Pets p
WHERE p.PetTypeId = pt.PetTypeId
);
Resultat:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | +-------------+-----------+
Det här exemplet visar hur många djurtyper som finns på vårt djurhotell. Det finns faktiskt fyra husdjurstyper, men bara tre av dem matchar ett verkligt husdjur i Pets
bord.
Detta ger samma resultat som vi skulle ha fått med följande fråga som använder IN
operatör.
SELECT
PetTypeId,
PetType
FROM PetTypes
WHERE PetTypeId IN ( SELECT PetTypeId FROM Pets );
Med NOT EXISTS
Vi skulle kunna lägga till NOT
operatör för att förneka resultaten och se hur många husdjurstyper som inte är i vårt djurhotell.
SELECT
pt.PetTypeId,
pt.PetType
FROM PetTypes pt
WHERE NOT EXISTS (
SELECT p.PetTypeId
FROM Pets p
WHERE p.PetTypeId = pt.PetTypeId
);
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.