database mysql

CROSS JOIN – czyli iloczyn kartezjański w SQL

Czym jest CROSS JOIN? Jak wygląda iloczyn kartezjański? Na czym polega łączenie tabel bez kluczy obcych?

CROSS JOIN to rodzaj złączenia tabel w języku SQL, który pozwala na połączenie dwóch lub więcej tabel bez użycia kluczy obcego. CROSS JOIN tworzy kartezjańskie złączenie, co oznacza, że dla każdego wiersza z jednej tabeli tworzy się kombinację z każdym wierszem z drugiej tabeli. W efekcie otrzymujemy wiele wierszy, które zawierają dane z obu tabel.

Składnia wygląda tak:

SELECT *
FROM table1
CROSS JOIN table2
WHERE table1.column1 = table2.column2;

W powyższym przykładzie CROSS JOIN łączy tabele table1 i table2, a następnie ogranicza wynik do tych wierszy, w których wartość kolumny column1 z tabeli table1 jest równa wartości kolumny column2 z tabeli table2.

Przykład CROSS JOIN, do przećwiczenia

-- Tworzymy tabele products i orders
CREATE TABLE products (
product_id INT NOT NULL AUTO_INCREMENT,
product_name VARCHAR(255) NOT NULL,
PRIMARY KEY (product_id)
);

CREATE TABLE orders (
order_id INT NOT NULL AUTO_INCREMENT,
product_id INT NOT NULL,
quantity INT NOT NULL,
PRIMARY KEY (order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);

-- Wstawiamy kilka wierszy do tabel
INSERT INTO products (product_name) VALUES
('Komputer'),
('Monitor'),
('Drukarka');

INSERT INTO orders (product_id, quantity) VALUES
(1, 2),
(2, 3),
(3, 1);

-- Wykonujemy złączenie tabel za pomocą CROSS JOIN
SELECT *
FROM products
CROSS JOIN orders;

W wyniku powyższego zapytania otrzymamy tabelę złożoną z 9 wierszy (3 x 3), która zawiera wszystkie możliwe kombinacje wierszy z obu tabel.

product_id product_name order_id product_id quantity
1 Komputer 1 1 2
1 Komputer 2 2 3
1 Komputer 3 3 1
2 Monitor 1 1 2
2 Monitor 2 2 3
2 Monitor 3 3 1
3 Drukarka 1 1 2
3 Drukarka 2 2 3
3 Drukarka 3 3 1

Czy CROSS JOIN pokazuje faktyczne relacje pomiędzy tabelami?

CROSS JOIN tworzy kartezjańskie złączenie, co oznacza, że dla każdego wiersza z jednej tabeli tworzy się kombinację z każdym wierszem z drugiej tabeli. W efekcie otrzymujemy wiele wierszy, które zawierają dane z obu tabel, ale nie przedstawiają one faktyczne relacje pomiędzy tabelami.

Jeśli chcesz otrzymać wiersze, które przedstawiają faktyczne relacje pomiędzy tabelami, musisz użyć innego rodzaju złączenia, takiego jak INNER JOIN lub OUTER JOIN.

INNER JOIN pozwala na połączenie wierszy z obu tabel tylko wtedy, gdy istnieje odpowiednia wartość klucza obcego.

OUTER JOIN pozwala na połączenie wierszy z obu tabel, nawet jeśli nie ma odpowiedniej wartości klucza obcego.