EXISTS og NOT EXISTS
Sjekk effektivt etter relaterte rader.
EXISTS og NOT EXISTS er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva er EXISTS?
Operatoren EXISTS tester om en underspørring returnerer minst én rad. Den evalueres til TRUE hvis underspørringen produserer et resultat, og til FALSE hvis underspørringen er tom.
I motsetning til andre underspørringsoperatorer som sammenligner verdier, bryr EXISTS seg bare om tilstedeværelse – den ser ikke på dataene som faktisk returneres av underspørringen.
Opprette eksempeltabeller
Før vi skriver EXISTS-spørringer, oppretter vi to tabeller: customers og orders. Vi bruker disse gjennom hele leksjonen for å utforske hvordan EXISTS og NOT EXISTS fungerer i praksis.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100),
country VARCHAR(50)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
order_date DATE
);
INSERT INTO customers VALUES
(1, 'Alice', 'US'),
(2, 'Bob', 'UK'),
(3, 'Charlie', 'US'),
(4, 'Diana', 'DE');
INSERT INTO orders VALUES
(101, 1, 250.00, '2024-01-10'),
(102, 1, 180.00, '2024-02-15'),
(103, 2, 95.00, '2024-03-01'),
(104, 3, 430.00, '2024-03-22');Grunnleggende EXISTS-syntaks
Den grunnleggende syntaksen for EXISTS plasserer operatoren i en WHERE-klausul. Underspørringen i EXISTS refererer vanligvis til en kolonne fra den ytre spørringen – dette kalles en korrelert underspørring.
Spørringen nedenfor finner alle kunder som har lagt inn minst én ordre.
SELECT customer_id, name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);SELECT 1 i EXISTS
Du har kanskje lagt merke til at underspørringen bruker SELECT 1 i stedet for å velge en faktisk kolonne. Dette er med hensikt — EXISTS sjekker bare om rader finnes, ikke hva de inneholder.
Å bruke SELECT 1 (eller til og med SELECT *) gjør ingen forskjell for resultatet, men SELECT 1 signaliserer tydelig både til databasemotoren og leseren at de faktiske verdiene ikke har betydning.
-- Both of these return the same result
SELECT name FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
SELECT name FROM customers c
WHERE EXISTS (SELECT o.* FROM orders o WHERE o.customer_id = c.customer_id);Slik evaluerer databasen EXISTS
For hver rad i den ytre spørringen kjører databasen den korrelerte underspørringen. Så snart én samsvarende rad er funnet, stopper motoren skanningen og markerer EXISTS som TRUE — denne kortslutningsevalueringen gjør EXISTS svært effektiv, selv i store tabeller.
I motsetning til dette bygger en JOIN hele mengden samsvarende rader før filtreringen, noe som kan være tregere når du bare trenger å vite om det finnes et treff.
-- EXISTS short-circuits after first match
-- Efficient even when orders table has millions of rows
SELECT name, country
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
AND o.amount > 200
);NOT EXISTS: Finne manglende rader
NOT EXISTS er det motsatte: Den returnerer TRUE når underspørringen ikke finner noen samsvarende rader. Dette er standardmåten i SQL å besvare spørsmål som «hvilke kunder har aldri lagt inn en bestilling?»
Hvis du prøver å løse dette med en vanlig JOIN eller NOT IN, kan du få feil resultater når NULL-verdier er involvert — NOT EXISTS unngår denne fallgruven helt.
-- Customers who have NOT placed any order
SELECT customer_id, name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);NOT EXISTS kontra NOT IN med NULL-verdier
En viktig fordel med NOT EXISTS fremfor NOT IN er NULL-sikkerhet. Hvis underspørringen som brukes av NOT IN returnerer selv én NULL, blir hele NOT IN-uttrykket NULL — noe som betyr at ingen rader returneres fra den ytre spørringen.
NOT EXISTS påvirkes ikke av dette problemet, fordi den evaluerer om rader finnes, ikke om verdier er like.
-- Dangerous: if any customer_id in orders is NULL,
-- NOT IN returns zero rows!
SELECT name FROM customers
WHERE customer_id NOT IN (SELECT customer_id FROM orders);
-- Safe: NOT EXISTS handles NULLs correctly
SELECT name FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.customer_id
);EXISTS med flere betingelser
Underspørringen i EXISTS kan inneholde hvilken som helst gyldig SQL, inkludert flere WHERE-betingelser. Dette lar deg kontrollere om det finnes svært spesifikke relaterte rader — for eksempel kunder som la inn en bestilling over en bestemt grense i en bestemt måned.
-- Customers who placed an order over 200 in March 2024
SELECT c.name, c.country
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
AND o.amount > 200
AND o.order_date >= '2024-03-01'
AND o.order_date < '2024-04-01'
);EXISTS i DELETE og UPDATE
EXISTS er ikke begrenset til SELECT-setninger. Du kan bruke den i UPDATE og DELETE for å endre eller slette rader basert på om det finnes relaterte data i en annen tabell.
Eksempelet nedenfor sletter bestillinger som tilhører kunder fra et bestemt land.
-- Delete orders placed by US customers
DELETE FROM orders o
WHERE EXISTS (
SELECT 1
FROM customers c
WHERE c.customer_id = o.customer_id
AND c.country = 'US'
);Sammenligne EXISTS med en JOIN
EXISTS og JOIN kan ofte uttrykke det samme spørsmålet, men de oppfører seg forskjellig. En JOIN dupliserer rader når det finnes flere treff, mens EXISTS alltid returnerer hver ytre rad maksimalt én gang.
Når du bare trenger å vite om det finnes en relasjon, og ikke trenger data fra den relaterte tabellen, er EXISTS ryddigere og vanligvis raskere.
-- JOIN may return duplicate customer rows if a customer has multiple orders
SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id;
-- EXISTS always returns each customer once
SELECT c.name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.customer_id
);NOT EXISTS for kontroller av datakvalitet
NOT EXISTS er et kraftig verktøy for revisjon av datakvalitet. Du kan bruke den til å finne foreldreløse poster, manglende referanser eller rader som burde ha relaterte data, men ikke har det.
Spørringen nedenfor finner eventuelle bestillingsrader der customer_id ikke samsvarer med noen rad i customers-tabellen — et tegn på brudd på referanseintegriteten.
-- Find orders with no matching customer (orphaned records)
SELECT o.order_id, o.customer_id, o.amount
FROM orders o
WHERE NOT EXISTS (
SELECT 1
FROM customers c
WHERE c.customer_id = o.customer_id
);Hurtigsjekk
Test forståelsen din av EXISTS og NOT EXISTS.
Oppsummering av leksjonen
I denne leksjonen lærte du hvordan EXISTS og NOT EXISTS lar deg kontrollere om relaterte rader finnes eller mangler, uten å sammenligne verdier direkte.
Sentrale poenger:
- EXISTS returnerer TRUE så snart underspørringen finner én samsvarende rad (kortslutningsevaluering).
- NOT EXISTS returnerer TRUE når underspørringen ikke finner noen samsvarende rader.
- Bruk
SELECT 1i EXISTS — de returnerte verdiene er irrelevante. - NOT EXISTS er NULL-sikker, mens NOT IN ikke er det — foretrekk NOT EXISTS når det kan forekomme NULL-verdier.
- EXISTS fungerer i SELECT-, UPDATE- og DELETE-setninger.
- Når du bare trenger å kontrollere om noe finnes, er EXISTS ofte ryddigere og raskere enn en JOIN.
Lær deg SQL med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 46
- Leksjoner
- 183
Ofte stilte spørsmål
Er leksjonen «EXISTS og NOT EXISTS» gratis?
Ja – hele teksten i «EXISTS og NOT EXISTS» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «EXISTS og NOT EXISTS»?
Sjekk effektivt etter relaterte rader. Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med SQL Academy?
Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «EXISTS og NOT EXISTS»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?
Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Korrelert under-spørring
- EXISTS og NOT EXISTS
- IN kontra ANY kontra ALL
- EXISTS kontra JOIN-ytelse