Förberedelse inför kodningsintervjuer · Lektion

Efterlikna mängdoperationer med joinar

Skriv om EXCEPT och INTERSECT i dialekter som saknar dem

Lektion 4 av 413 steg

Efterlikna mängdoperationer med joinar är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.

Varför emulera mängdoperationer

Alla databaser stöder inte INTERSECT och EXCEPT. Äldre MySQL-versioner saknade dem till exempel helt. Intervjuare testar om du kan återskapa mängdlogik med JOIN och underfrågor när operatorn inte är tillgänglig.

Att känna till både mängdoperatorn och dess JOIN-motsvarighet visar att du förstår vad operatorn faktiskt beräknar.

INTERSECT som INNER JOIN

INTERSECT hittar rader som är gemensamma för båda mängderna. Motsvarigheten med JOIN är en INNER JOIN på alla kolumner som jämförs, plus DISTINCT för att efterlikna dedupliceringen.

Varje kolumn i jämförelsen blir en del av JOIN-predikatet.

-- A INTERSECT B emulated:
SELECT DISTINCT a.customer_id
FROM orders_2023 a
JOIN orders_2024 b
  ON a.customer_id = b.customer_id;

Varför DISTINCT behövs för INTERSECT

En vanlig INNER JOIN kan ge flera matchningar: om ett värde förekommer flera gånger på någon sida multiplicerar JOIN antalet rader. Standardversionen av INTERSECT returnerar varje gemensam rad en gång, så du lägger till DISTINCT för att slå ihop de dubbletter som JOIN introducerar.

Att glömma DISTINCT här är ett vanligt misstag i intervjuer.

-- without DISTINCT, a customer with 3 orders in each year
-- would appear 9 times from the join

EXCEPT som LEFT JOIN / IS NULL

EXCEPT (A men inte B) är en anti-join. Den portabla formen är en LEFT JOIN från A till B på alla kolumner, där endast rader där B-sidan är NULL (ingen träff) behålls, följt av DISTINCT.

Mönstret LEFT JOIN / IS NULL är ett av de mest återanvända knepen i SQL-intervjuer.

SELECT DISTINCT a.customer_id
FROM orders_2023 a
LEFT JOIN orders_2024 b
  ON a.customer_id = b.customer_id
WHERE b.customer_id IS NULL;

EXCEPT med NOT EXISTS

En lika portabel variant av EXCEPT använder NOT EXISTS. Den kan läsas som "behåll varje rad i A för vilken ingen matchande rad i B finns" och hanterar NULL robust.

Många utvecklare föredrar NOT EXISTS eftersom avsikten är tydlig och fällan med NOT IN + NULL undviks.

SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE NOT EXISTS (
  SELECT 1 FROM orders_2024 b
  WHERE b.customer_id = a.customer_id
);

INTERSECT med EXISTS

På motsvarande sätt kan INTERSECT skrivas med EXISTS: behåll varje distinkt rad i A för vilken en matchande rad i B finns.

EXISTS avbryter sökningen vid den första träffen, vilket kan vara effektivt. Det undviker också att en join skapar flera kopior av samma rad, så ibland behövs inte DISTINCT på join-sidan.

SELECT DISTINCT a.customer_id
FROM orders_2023 a
WHERE EXISTS (
  SELECT 1 FROM orders_2024 b
  WHERE b.customer_id = a.customer_id
);

Fällan med NULL i NOT IN

En frestande emulering av EXCEPT är NOT IN, men den är farlig: om underfrågan returnerar något NULL ger NOT IN inte tillbaka några rader alls, eftersom jämförelsen blir UNKNOWN.

Det här är en vanlig detalj som testas ingående. Föredra NOT EXISTS eller LEFT JOIN / IS NULL, som är NULL-säkra.

-- RISKY if orders_2024.customer_id can be NULL:
SELECT DISTINCT customer_id FROM orders_2023
WHERE customer_id NOT IN (
  SELECT customer_id FROM orders_2024
);

Matchning på flera kolumner

När mängdjämförelsen omfattar flera kolumner måste varje kolumn ingå i predikatet. För en anti-join måste ni dessutom hantera möjligheten att dessa kolumner innehåller NULL, vilket är ett område där NOT EXISTS fungerar särskilt bra.

Ange varje kolumn uttryckligen i ON-satsen. Om en kolumn saknas ändras betydelsen av "lika rad" i tysthet.

SELECT DISTINCT a.id, a.city
FROM a
LEFT JOIN b
  ON a.id = b.id AND a.city = b.city
WHERE b.id IS NULL;

Emulera UNION utan operatorn

UNION ALL är bara en sammanfogning, vilket alla dialekter stöder direkt. För att vid behov emulera distinkt UNION sammanfogar ni med UNION ALL i en underfråga och omsluter den med SELECT DISTINCT eller GROUP BY på alla kolumner.

Det visar att UNION helt enkelt är UNION ALL plus ett steg för att ta bort dubbletter.

SELECT DISTINCT * FROM (
  SELECT city FROM a
  UNION ALL
  SELECT city FROM b
) combined;

Välja rätt emulering

Beslutsstöd:

  • INTERSECT → EXISTS eller INNER JOIN + DISTINCT.
  • EXCEPT → NOT EXISTS eller LEFT JOIN / IS NULL.
  • Undvik NOT IN när NULL kan förekomma.
  • UNION → UNION ALL omsluten av DISTINCT.

EXISTS / NOT EXISTS är de mest portabla och NULL-säkra alternativen, vilket gör dem till de tryggaste svaren i intervjuer.

Knyta ihop det

Att kunna översätta mängdoperatorer till join-operationer visar att ni förstår dem som mängdlogik, inte bara som syntax. Anti-join (LEFT JOIN / IS NULL eller NOT EXISTS) är det viktigaste mönstret: det förekommer vid emulering av EXCEPT, när föräldralösa poster ska hittas och i frågor om saknade poster.

Börja med NOT EXISTS för korrekthetens skull och nämn sedan join-formen i en diskussion om prestanda.

Snabbtest

Er databas stöder inte EXCEPT. Ni behöver customer_ids i orders_2023 som inte finns i orders_2024, och kolumnen kan innehålla NULL.

Sammanfattning

Viktiga slutsatser:

  • INTERSECT → INNER JOIN + DISTINCT eller EXISTS.
  • EXCEPT → LEFT JOIN / IS NULL eller NOT EXISTS (anti-join).
  • Lägg till DISTINCT för att motsvara mängdoperatorernas beteende och begränsa det antal kopior som en join kan skapa.
  • Undvik NOT IN när NULL kan förekomma. Föredra NOT EXISTS.
  • UNION = UNION ALL omsluten av DISTINCT.
Gratis att börja

Lär dig Förberedelse inför kodningsintervjuer med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
90
Lektioner
360

Vanliga frågor

Är lektionen ”Efterlikna mängdoperationer med joinar” gratis?

Ja – hela texten till ”Efterlikna mängdoperationer med joinar” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.

Vad lär jag mig i ”Efterlikna mängdoperationer med joinar”?

Skriv om EXCEPT och INTERSECT i dialekter som saknar dem Ni övar på Förberedelse inför kodningsintervjuer med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Förberedelse inför kodningsintervjuer?

Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Efterlikna mängdoperationer med joinar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Förberedelse inför kodningsintervjuer-lektionen?

Ja. Varje Förberedelse inför kodningsintervjuer-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. UNION kontra UNION ALL
  2. Antal kolumner och typkompatibilitet
  3. INTERSECT och EXCEPT för jämförelse
  4. Efterlikna mängdoperationer med joinar
← Tillbaka till Förberedelse inför kodningsintervjuer