CROSS JOIN (笛卡尔积)是一种 SQL 连接方式,它会将 第一个表的每一行 与 第二个表的每一行 进行组合,生成所有可能的配对。
-
如果表 A 有
m
行,表 B 有n
行,那么A CROSS JOIN B
的结果会有m × n
行。 -
不依赖任何连接条件 (没有
ON
或WHERE
子句),直接组合所有数据。
sql
-- 显式 CROSS JOIN
SELECT * FROM table1 CROSS JOIN table2;
-- 隐式 CROSS JOIN(用逗号分隔表)
SELECT * FROM table1, table2;
虽然笛卡尔积通常会导致数据量爆炸(慎用!),但在特定场景下很有价值:
-
生成所有可能的组合。
-
**计算排列组合或矩阵。**例如:统计不同性别和年龄段的用户分布。
-
测试数据生成。快速创建大量测试数据(如压力测试)。
场景: 生成日期与产品的所有组合
sql
-- 生成日期序列的递归CTE(MySQL 8.0+)
WITH RECURSIVE date_range AS (
SELECT '2023-01-01' AS date
UNION ALL
SELECT DATE_ADD(date, INTERVAL 1 DAY)
FROM date_range
WHERE date < '2023-01-05'
)
SELECT
d.date,
p.product_id,
p.product_name
FROM date_range d
CROSS JOIN products p
ORDER BY d.date, p.product_id;
思路:
- 用递归CTE
date_range
生成连续日期序列。 - 通过
CROSS JOIN
将每个日期与产品表中的所有记录组合。
建表示例:
sql
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL
);
INSERT INTO products (product_id, product_name) VALUES
(1, 'Laptop'),
(2, 'Smartphone'),
(3, 'Headphones');

