CROSS JOIN och kartesiska produkter
Avsiktliga cross joinar för att skapa kombinationer och oavsiktliga som exploderar radantalet
CROSS JOIN och kartesiska produkter är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 1 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örberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Joinen som intervjuare använder för att sätta dit Er
En CROSS JOIN parar varje rad i vänstertabellen med varje rad i högertabellen. Det finns inget ON-villkor. Om tabell A har 4 rader och tabell B har 3 rader får resultatet 4 x 3 = 12 rader.
Detta kallas en kartesisk produkt. Intervjuare frågar om den av två skäl: för att testa om Ni kan skapa kombinationer med avsikt och för att se om Ni känner igen en oavsiktlig cross join som får resultatmängden att svälla.
Explicit CROSS JOIN-syntax
Det moderna och lättlästa sättet att skriva en kartesisk produkt är att använda det explicita nyckelordet CROSS JOIN. Observera att det inte finns någon ON-sats, vilket tydligt visar avsikten för den som granskar koden.
Här kombinerar vi varje storlek med varje färg för att skapa en komplett produktmatris.
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;Den äldre kommasyntaxen
Ni kommer fortfarande att se kartesiska produkter skrivna med ett komma i FROM-satsen och utan något join-villkor. Detta är den äldre ANSI-syntaxen.
Den ger exakt samma resultat som CROSS JOIN, men är riskabel: om ni avsåg att lägga till ett join-villkor men glömde det, får ni tyst en cross join i stället för ett fel. Föredra explicit CROSS JOIN.
-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;Ett genomarbetat exempel: skapa en storlekstabell
Anta att en butik säljer T-shirts i 3 storlekar och 4 färger och vill ha en rad för varje möjlig variant, även sådana som ännu inte finns i lager. En cross join genererar alla 12 kombinationer i ett enda steg.
Detta är det vanligaste avsiktliga användningsfallet: att skapa ett komplett rutnät av alternativ.
SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;Generera en kalendermatris
Ett annat klassiskt användningsfall för CROSS JOIN i intervjuer är att skapa en tät matris där varje kombination finns med, även när data saknas.
Här kombinerar vi varje butik med varje datum, så att en senare LEFT JOIN mot försäljningen ger en rad per butik och dag och fyller luckor med nollor. Cross join garanterar att ingen kombination av butik och dag hoppas över.
SELECT st.store_id, d.day
FROM stores st
CROSS JOIN calendar d
WHERE d.day BETWEEN DATE '2024-01-01' AND DATE '2024-01-31';Den oavsiktliga kartesiska explosionen
Det som intervjuare brukar undersöka är följande: ni kopplar ihop två tabeller men glömmer join-villkoret. I stället för ett fel returnerar databasen utan problem alla kombinationer.
Om orders har 100 000 rader och customers har 50 000 blir resultatet 5 miljarder rader. Frågor hänger sig, minnet tar slut och siffrorna blir kraftigt överdrivna. Att känna igen detta mönster vid en kodgranskning är ett gott tecken.
-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rowsSå upptäcker ni en oavsiktlig cross join
Symtom som intervjuare vill att ni ska kunna nämna:
- Antalet rader motsvarar ungefär produkten av de två tabellernas storlekar, inte summan.
- Aggregat som
SUMblir överdrivna med en konstant faktor. - Frågeplanen visar en Nested Loop utan något join-filter.
Lösningen är nästan alltid ett saknat likhetsvillkor i ON eller WHERE mellan tabellerna.
CROSS JOIN jämfört med INNER JOIN med alltid sant ON-villkor
En CROSS JOIN är logiskt identisk med en INNER JOIN ... ON 1=1. Båda ger den fullständiga kartesiska produkten.
En inner join är faktiskt bara en cross join följd av ett filter på ON-villkoret. Den mentala modellen förklarar varför ett saknat villkor reducerar en inner join till en cross join.
-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;CROSS JOIN mot en tabell med tal
Ett kraftfullt knep är att göra en cross join mot en liten tabell med numbers eller generate_series för att medvetet multiplicera rader. Det används för att expandera en rad till många, till exempel för att omvandla ett antal till individuella enhetsrader.
Här upprepas varje produktrad qty gånger genom att den kopplas till en serie och endast behåller tal upp till antalet.
SELECT p.product_id, n.n AS unit_number
FROM products p
CROSS JOIN generate_series(1, 100) AS n(n)
WHERE n.n <= p.qty;Prestanda och säkra arbetssätt
Eftersom resultatet växer multiplikativt ska ni aldrig göra en cross join mellan två stora tabeller. Håll minst den ena sidan mycket liten, till exempel en lista med storlekar, en liten kalender eller en tabell med tal.
Säg detta uttryckligen i intervjuer: ”En CROSS JOIN är bara säker när ena sidan är liten och begränsad; annars blir resultatet ohanterligt.” Den meningen visar gott omdöme, inte bara kunskap om syntax.
När ni bör använda CROSS JOIN
Använd en avsiktlig CROSS JOIN när ni behöver alla kombinationer av två mängder:
- Generera matriser av alternativ (storlek x färg).
- Göra tidsserier fullständiga (butik x dag) före en LEFT JOIN.
- Expandera rader via en tabell med tal.
Om ni inte vill ha alla kombinationer behöver ni nästan säkert en join med ett ON-villkor i stället.
Snabbtest
Testa er förståelse av kartesiska produkter.
Sammanfattning: CROSS JOIN
Viktigaste punkterna:
- En CROSS JOIN kombinerar varje vänsterrad med varje högerrad; resultatets storlek är produkten av indatamängderna.
- Kommasyntax utan villkor skapar samma kartesiska produkt, ofta av misstag.
- Använd den avsiktligt för kombinationsmatriser, för att göra tidsserier fullständiga och för radexpansion via en tabell med tal.
- En inner join där
ONsaknas övergår tyst till en cross join, det explosionsfel som intervjuare älskar.
Lär dig SQL 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
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”CROSS JOIN och kartesiska produkter” gratis?
Ja – hela texten till ”CROSS JOIN och kartesiska produkter” 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örberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Vad lär jag mig i ”CROSS JOIN och kartesiska produkter”?
Avsiktliga cross joinar för att skapa kombinationer och oavsiktliga som exploderar radantalet Ni övar på Förberedelser inför SQL-intervjun 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örberedelser inför SQL-intervjun?
Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun 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 1 av 4.
Hur lång tid tar lektionen ”CROSS JOIN och kartesiska produkter”?
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örberedelser inför SQL-intervjun-lektionen?
Ja. Varje Förberedelser inför SQL-intervjun-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
- CROSS JOIN och kartesiska produkter
- SELF JOIN för hierarkier
- Jämför rader i en och samma tabell
- Välj rätt join-typ