Oversigt :i denne vejledning lærer du, hvordan du bruger SQLite EXISTS
operator til at teste for eksistensen af rækker, der returneres af en underforespørgsel.
Introduktion til SQLite FINDER
operatør
Her er den grundlæggende syntaks for EXISTS
operatør:
EXISTS(subquery)
Code language: SQL (Structured Query Language) (sql)
I denne syntaks er underforespørgslen en SELECT
sætning, der returnerer nul eller flere rækker.
Hvis underforespørgslen returnerer en eller flere rækker, vil EXISTS
operatør returnerer sandt. Ellers FINDER
operator returnerer false eller NULL
.
Bemærk, at hvis underforespørgslen returnerer én række med NULL
, resultatet af EXISTS
operatoren er stadig sand, fordi resultatsættet indeholder én række med NULL.
For at ophæve koden EXISTS
operatør, bruger du EKSISTERER IKKE
operatør som følger:
NOT EXISTS (subquery)
Code language: SQL (Structured Query Language) (sql)
SQLite FINDER
operatøreksempel
Se følgende Kunder
og Fakturaer
tabeller fra eksempeldatabasen:
Følgende erklæring finder kunder, der har fakturaer:
SELECT
CustomerId,
FirstName,
LastName,
Company
FROM
Customers c
WHERE
EXISTS (
SELECT
1
FROM
Invoices
WHERE
CustomerId = c.CustomerId
)
ORDER BY
FirstName,
LastName;
Code language: SQL (Structured Query Language) (sql)
Følgende billede viser det delvise resultatsæt:
I dette eksempel, for hver kunde, er EXISTS
operatør kontrollerer, om kunde-id'et findes i fakturaerne
tabel.
- Hvis ja, returnerer underforespørgslen én række med værdien 1, der forårsager
EXISTS
operatør vurdere til sandt. Derfor inkluderer forespørgslen curstomer i resultatsættet. - Hvis kunde-id'et ikke findes i
Fakturaer
tabel, returnerer underforespørgslen ingen rækker, som forårsagerEXISTS
operatør for at evaluere til falsk, derfor inkluderer forespørgslen ikke kunden i resultatsættet.
Bemærk, at du kan bruge IN
operator i stedet for FINDER
operatør i dette tilfælde for at opnå det samme resultat:
SELECT
CustomerId,
FirstName,
LastName,
Company
FROM
Customers c
WHERE
CustomerId IN (
SELECT
CustomerId
FROM
Invoices
)
ORDER BY
FirstName,
LastName;
Code language: SQL (Structured Query Language) (sql)
Når underforespørgslen returnerer den første række, FINDER
operatør stopper med at søge, fordi den kan bestemme resultatet. På den anden side er IN
operatøren skal scanne alle rækker returneret af underforespørgslen for at bestemme resultatet.
Generelt set er FINDER
operatoren er hurtigere end IN
operator, hvis resultatsættet, der returneres af underforespørgslen, er stort. Derimod er IN
operatoren er hurtigere end EXISTS
operator, hvis resultatsættet, der returneres af underforespørgslen, er lille.
SQLite FINDER IKKE
operatøreksempel
Se følgende tabel over kunstnere og album fra eksempeldatabasen:
Denne forespørgsel finder alle kunstnere, der ikke har noget album i tabellen Album:
SELECT
*
FROM
Artists a
WHERE
NOT EXISTS(
SELECT
1
FROM
Albums
WHERE
ArtistId = a.ArtistId
)
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql)
Her er det delvise output:
I denne øvelse har du lært, hvordan du bruger SQLite EXISTS
operator til at teste for eksistensen af rækker, der returneres af en underforespørgsel.