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.
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?
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
- LIKE-mønstre og jokertegn
- IN og NOT IN til mængder
- BETWEEN til intervaller
- IS NULL, IS NOT NULL og COALESCE