CROSS JOIN i iloczyny kartezjańskie
Celowe złączenia krzyżowe do generowania kombinacji oraz przypadkowe złączenia gwałtownie zwiększające liczbę wierszy
CROSS JOIN i iloczyny kartezjańskie to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Złączenie, którym osoby rekrutujące zastawiają pułapkę
CROSS JOIN łączy każdy wiersz lewej tabeli z każdym wierszem prawej tabeli. Nie ma warunku ON. Jeśli tabela A ma 4 wiersze, a tabela B ma 3 wiersze, wynik zawiera 4 x 3 = 12 wierszy.
Nazywa się to iloczynem kartezjańskim. Osoby prowadzące rozmowy pytają o niego z dwóch powodów: aby sprawdzić, czy potrafią Państwo celowo generować kombinacje, oraz czy rozpoznają Państwo przypadkowe złączenie krzyżowe, które gwałtownie zwiększa zbiór wynikowy.
Jawna składnia CROSS JOIN
Nowoczesnym i czytelnym sposobem zapisu iloczynu kartezjańskiego jest użycie jawnego słowa kluczowego CROSS JOIN. Proszę zauważyć, że nie ma tu klauzuli ON, co jasno sygnalizuje intencję osobie przeglądającej kod.
W tym przykładzie łączymy każdy rozmiar z każdym kolorem, aby utworzyć pełną macierz produktów.
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;Dawna składnia z przecinkiem
Nadal można spotkać iloczyny kartezjańskie zapisane za pomocą przecinka w klauzuli FROM, bez warunku złączenia. Jest to starsza składnia ANSI.
Daje dokładnie ten sam wynik co CROSS JOIN, ale jest niebezpieczna: jeśli zamierzali Państwo dodać warunek złączenia i o nim zapomnieli, zamiast błędu otrzymają Państwo po cichu złączenie krzyżowe. Należy preferować jawne CROSS JOIN.
-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;Przykład: tworzenie tabeli rozmiarów
Załóżmy, że sklep sprzedaje koszulki w 3 rozmiarach i 4 kolorach i chce mieć wiersz dla każdego możliwego wariantu, nawet jeśli niektóre z nich nie są jeszcze dostępne w magazynie. Złączenie krzyżowe tworzy wszystkie 12 kombinacji w jednym kroku.
To najczęstsze zamierzone zastosowanie: tworzenie kompletnej siatki opcji.
SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;Tworzenie siatki kalendarza
Innym klasycznym zastosowaniem CROSS JOIN na rozmowach rekrutacyjnych jest utworzenie pełnej siatki, w której występuje każda kombinacja, nawet gdy brakuje danych.
W tym przykładzie łączymy każdy sklep z każdą datą, aby późniejsze użycie LEFT JOIN z danymi sprzedażowymi dało jeden wiersz na sklep i dzień, a brakujące wartości zostały uzupełnione zerami. Złączenie krzyżowe gwarantuje, że żaden dzień dla żadnego sklepu nie zostanie pominięty.
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';Przypadkowa eksplozja iloczynu kartezjańskiego
Niebezpieczeństwo, o które często pytają rekruterzy: łączą Państwo dwie tabele, ale zapominają o warunku złączenia. Zamiast zgłosić błąd, baza danych bez problemu zwraca każdą możliwą kombinację.
Jeśli orders ma 100 000 wierszy, a customers 50 000, wynik zawiera 5 miliardów wierszy. Zapytania zawieszają się, pamięć się wyczerpuje, a liczby są znacznie zawyżone. Rozpoznanie tego wzorca podczas przeglądu kodu jest bardzo dobrym sygnałem.
-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rowsJak rozpoznać przypadkowe złączenie krzyżowe
Objawy, które należy wymienić na rozmowie rekrutacyjnej:
- Liczba wierszy jest w przybliżeniu równa iloczynowi rozmiarów obu tabel, a nie ich sumie.
- Wartości agregatów, takich jak
SUM, są zawyżone o stałą wielokrotność. - Plan zapytania pokazuje Nested Loop bez filtra złączenia.
Naprawa niemal zawsze polega na dodaniu brakującego warunku równości ON lub WHERE między tabelami.
CROSS JOIN a INNER JOIN z zawsze prawdziwym warunkiem ON
CROSS JOIN jest logicznie równoważne konstrukcji INNER JOIN ... ON 1=1. Obie zwracają pełny iloczyn kartezjański.
W rzeczywistości złączenie wewnętrzne to złączenie krzyżowe, po którym następuje filtrowanie według warunku ON. Ten model mentalny wyjaśnia, dlaczego brakujący warunek zmienia złączenie wewnętrzne w złączenie krzyżowe.
-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;Złączenie krzyżowe z tabelą liczb
Przydatna technika polega na celowym złączeniu krzyżowym z niewielką tabelą numbers lub generate_series, aby powielić wiersze. Stosuje się ją do rozwijania jednego wiersza do wielu wierszy, na przykład do przekształcenia ilości w osobne wiersze jednostkowe.
W tym przykładzie każdy wiersz produktu jest powtarzany qty razy przez złączenie z szeregiem liczb i zachowanie liczb nie większych od podanej ilości.
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;Wydajność i bezpieczne stosowanie
Ponieważ wynik rośnie multiplikatywnie, nigdy nie należy wykonywać złączenia krzyżowego dwóch dużych tabel. Co najmniej jedna ze stron powinna być mała i mieć ograniczony rozmiar, na przykład lista rozmiarów, niewielki kalendarz lub tabela liczb.
Na rozmowie rekrutacyjnej należy powiedzieć to wprost: 'CROSS JOIN jest bezpieczne tylko wtedy, gdy jedna ze stron jest mała i ma ograniczony rozmiar; w przeciwnym razie wynik staje się niemożliwy do opanowania.' To zdanie pokazuje umiejętność oceny sytuacji, a nie tylko znajomość składni.
Kiedy używać CROSS JOIN
Celowego CROSS JOIN należy użyć, gdy potrzebne są wszystkie kombinacje dwóch zbiorów:
- Tworzenie macierzy opcji (rozmiar x kolor).
- Zagęszczanie szeregów czasowych (sklep x dzień) przed użyciem LEFT JOIN.
- Rozwijanie wierszy za pomocą tabeli liczb.
Jeśli nie potrzebują Państwo wszystkich kombinacji, niemal na pewno należy użyć złączenia z warunkiem ON.
Szybki test
Sprawdźmy, czy rozumieją Państwo iloczyny kartezjańskie.
Podsumowanie: CROSS JOIN
Najważniejsze informacje:
- CROSS JOIN łączy każdy wiersz z lewej strony z każdym wierszem z prawej strony; rozmiar wyniku jest równy iloczynowi rozmiarów danych wejściowych.
- Składnia z przecinkiem bez warunku tworzy ten sam iloczyn kartezjański, często przypadkowo.
- Należy używać jej celowo do tworzenia siatek kombinacji, zagęszczania szeregów czasowych i rozwijania wierszy za pomocą tabeli liczb.
- Złączenie wewnętrzne bez warunku
ONpo cichu zmienia się w złączenie krzyżowe — jest to błąd prowadzący do eksplozji liczby wierszy, który rekruterzy szczególnie lubią omawiać.
Często zadawane pytania
Czy lekcja „CROSS JOIN i iloczyny kartezjańskie” jest bezpłatna?
Tak — pełny tekst „CROSS JOIN i iloczyny kartezjańskie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „CROSS JOIN i iloczyny kartezjańskie”?
Celowe złączenia krzyżowe do generowania kombinacji oraz przypadkowe złączenia gwałtownie zwiększające liczbę wierszy Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?
Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „CROSS JOIN i iloczyny kartezjańskie”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?
Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- CROSS JOIN i iloczyny kartezjańskie
- SELF JOIN dla hierarchii
- Porównywanie wierszy w jednej tabeli
- Wybór właściwego typu złączenia