Bài viết này cung cấp tổng quan về CROSS JOIN
trong SQL, cũng như một số ví dụ cơ bản.
SQL CROSS JOIN
(hoặc FULL OUTER JOIN
) trả về các hàng kết hợp mỗi hàng từ bảng đầu tiên với mỗi hàng từ bảng thứ hai.
Nói cách khác, nó trả về tích số Descartes của các hàng từ các bảng trong phép nối.
Cú pháp
Bạn chỉ định một liên kết chéo trong FROM
mệnh đề.
Cú pháp như sau:
SELECT *
FROM Table1 CROSS JOIN Table2
ON Table1.Column = Table2.Column;
Ví dụ 1
Đây là một ví dụ để chứng minh.
Dữ liệu mẫu
Đầu tiên, đây là các bảng mà chúng tôi sẽ sử dụng để làm ví dụ.
t1
bảng:
+--------+ | col1 | |--------| | a | | b | | c | +--------+
t2
bảng:
+--------+ | col1 | |--------| | 1 | | 2 | | 3 | +--------+
Truy vấn tham gia chéo
Dưới đây là một ví dụ về thực hiện kết hợp chéo với hai bảng đó.
SELECT * FROM t1
CROSS JOIN t2;
Kết quả:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
Vì vậy, truy vấn của chúng tôi trả về 9 hàng, mặc dù chỉ có 3 hàng trong mỗi bảng.
Điều này là do cách thức hoạt động của phép nối chữ thập. Số hàng được trả về là số hàng trong bảng bên trái, nhân với số hàng trong bảng bên phải.
Xem cách nó lặp qua bảng bên trái, xuất ra từng hàng trong bảng bên phải cho mỗi hàng trong bảng bên trái.
Điều này có tác dụng tương tự như làm như sau:
SELECT * FROM t1, t2
Kết quả:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | b | 1 | | c | 1 | | a | 2 | | b | 2 | | c | 2 | | a | 3 | | b | 3 | | c | 3 | +--------+--------+ (9 rows affected)
Ví dụ 2
Đây là những gì sẽ xảy ra nếu chúng ta thêm WHERE
điều khoản tham gia chéo của chúng tôi.
SELECT * FROM t1
CROSS JOIN t2
WHERE t1.col1 = 'a';
Kết quả:
+--------+--------+ | col1 | col1 | |--------+--------| | a | 1 | | a | 2 | | a | 3 | +--------+--------+ (3 rows affected)
Ví dụ 3
Giả sử chúng ta có các bảng sau.
PetTypes
bảng:
+-------------+-----------+ | PetTypeId | PetType | |-------------+-----------| | 1 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
bảng:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Trong trường hợp này, Pets.PetTypeId
là một khóa ngoại của PetTypes.PetTypeId
cột.
Bây giờ, đây là một ví dụ về chạy kết hợp chéo trên hai bảng đó, nhưng sử dụng WHERE
mệnh đề.
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;
Kết quả:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Thêm WHERE
mệnh đề đến phép nối chéo đã biến nó thành một phép nối bên trong.
Đây là những gì sẽ xảy ra nếu chúng tôi xóa WHERE
mệnh đề.
SELECT
p.PetName,
pt.PetType
FROM Pets p
CROSS JOIN PetTypes pt;
Kết quả:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Bird | | Fetch | Bird | | Scratch | Bird | | Wag | Bird | | Tweet | Bird | | Fluffy | Bird | | Bark | Bird | | Meow | Bird | | Fluffy | Cat | | Fetch | Cat | | Scratch | Cat | | Wag | Cat | | Tweet | Cat | | Fluffy | Cat | | Bark | Cat | | Meow | Cat | | Fluffy | Dog | | Fetch | Dog | | Scratch | Dog | | Wag | Dog | | Tweet | Dog | | Fluffy | Dog | | Bark | Dog | | Meow | Dog | | Fluffy | Rabbit | | Fetch | Rabbit | | Scratch | Rabbit | | Wag | Rabbit | | Tweet | Rabbit | | Fluffy | Rabbit | | Bark | Rabbit | | Meow | Rabbit | +-----------+-----------+ (32 rows affected)
Chúng tôi nhận được một phép nối chéo trả về 32 hàng.