SQL Academy · Lektion

IN og NOT IN til mængder

Filtrér mod lister af værdier med IN og NOT IN, lær faldgruben ved NULL i NOT IN, og omskriv til EXISTS for sikker semantik.

Lektion 2 af 413 trin

IN og NOT IN til mængder er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

IN: Match mod en liste

IN er en genvej til mange OR-udtryk:

SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');

-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';

IN med en underforespørgsel

Du kan bruge en underforespørgsel på højre side:

SELECT * FROM orders
WHERE user_id IN (
  SELECT id FROM users WHERE country = 'US'
);

NOT IN: Udeluk en liste

Filtrér matchende rækker fra:

SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');

NOT IN-fælden med NULL

Hvis højre side indeholder NULL, returnerer NOT IN NULL — og rækker, hvor prædikatet er NULL, fjernes. Resultat: nul rækker.

-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently

-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);

Derfor er NOT EXISTS sikrere

NOT EXISTS bruger standardsemantik for korrelerede underforespørgsler og er sikker i forhold til NULL. De fleste planlæggere optimerer det identisk med et korrekt udformet NOT IN.

IN kontra OR — læsbarhed

IN er tydeligere end lange OR-kæder, og planlæggeren optimerer det ofte identisk:

-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...

-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)

IN med tupler (række-konstruktører)

Match par af kolonner:

SELECT * FROM order_items
WHERE (order_id, product_id) IN (
  (1, 42), (2, 99), (3, 17)
);

Brug af indeks

En IN-liste på en indekseret kolonne kan udføres som flere indeksopslag (Bitmap Index Scan). Det er generelt hurtigt.

-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);

Store IN-lister

Lister med tusindvis af værdier kan blive langsomme. Foretræk:

  • JOIN mod en rigtig tabel eller en midlertidig tabel
  • = ANY(array) til at sende en array-parameter
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);

IN med en tom liste

En tom IN-liste er ulovlig i standard-SQL. Nogle klienter sender en pladsholder; det er sikrere at generere SQL-betingelsen betinget.

-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.

IN kontra JOIN

Nogle gange er en JOIN tydeligere end en IN-underforespørgsel:

-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);

-- With JOIN:
SELECT o.*
FROM orders o
JOIN users  u ON u.id = o.user_id
WHERE u.pro;

Opsummering

IN er den lettilgængelige form til medlemskab i et sæt.

  • Foretræk IN frem for OR af hensyn til læsbarheden
  • NOT IN er farligt med NULL-værdier — foretræk NOT EXISTS
  • Brug JOIN eller send arrays ved store sæt

Hurtigt tjek

Hvad er den sikreste erstatning for NOT IN (subquery), når underforespørgslen kan indeholde NULL-værdier?

Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “IN og NOT IN til mængder” gratis?

Ja — hele teksten til “IN og NOT IN til mængder” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “IN og NOT IN til mængder”?

Filtrér mod lister af værdier med IN og NOT IN, lær faldgruben ved NULL i NOT IN, og omskriv til EXISTS for sikker semantik. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “IN og NOT IN til mængder”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. LIKE-mønstre og jokertegn
  2. IN og NOT IN til mængder
  3. BETWEEN til intervaller
  4. IS NULL, IS NOT NULL og COALESCE
← Tilbage til SQL Academy