0Pricing
SQL Interview Prep · Lekcja

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 SQL 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 SQL Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL 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) rows

Jak 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 ON po 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 SQL Interview Prep, przejdź na CoddyKit PRO. Kurs SQL 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 SQL 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ąć SQL Interview Prep?

Nie wymagamy żadnego doświadczenia. SQL 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 SQL Interview Prep?

Tak. Każda lekcja SQL 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

  1. CROSS JOIN i iloczyny kartezjańskie
  2. SELF JOIN dla hierarchii
  3. Porównywanie wierszy w jednej tabeli
  4. Wybór właściwego typu złączenia
← Powrót do SQL Interview Prep