使用CROSS JOIN时会返回两个表的笛卡尔积即第一个表的每一行与第二个表的每一行进行组合。如果两个表分别有m和n行结果将会有m*n行。注意CROSS JOIN不需要连接条件但可以通过WHERE子句进行过滤。示例表A有3条记录表B有2条记录CROSS JOIN结果3*26条记录语法SELECT * FROM table1 CROSS JOIN table2;简写形式SELECT * FROM table1, table2;但是在实际应用中我们通常会在CROSS JOIN之后加上一些条件来限制结果这时候它就变成了内连接。不过如果我们需要生成组合比如生成序列、日期序列与业务数据组合等时CROSS JOIN很有用。例如假设我们有一个日期维度表和一个商店表我们想要生成每个日期和每个商店的组合就可以使用CROSS JOIN。但是如果表很大CROSS JOIN会产生巨大的结果集需要谨慎使用。实际应用场景1. **生成组合数据**sql-- 生成颜色和尺寸的所有组合SELECT colors.color, sizes.sizeFROM (VALUES (红), (蓝), (绿)) AS colors(color)CROSS JOIN (VALUES (S), (M), (L)) AS sizes(size);结果颜色 尺寸红 S红 M红 L蓝 S蓝 M蓝 L绿 S绿 M绿 L2. **日期范围扩展**sql-- 为每个用户生成连续日期SELECT users.user_id, dates.dateFROM usersCROSS JOIN (SELECT DATE_ADD(2024-01-01, INTERVAL n DAY) as dateFROM (SELECT 0 as n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) numbers) dates;3. **在数据分析中的应用**sql-- 计算所有商品在所有门店的潜在组合SELECT p.product_id, s.store_id,p.price * s.estimated_demand as potential_revenueFROM products pCROSS JOIN stores s;注意事项⚠️ **性能警告**sql-- 危险示例大表的CROSS JOINSELECT *FROM huge_table_1 -- 假设有100万行CROSS JOIN huge_table_2; -- 假设有100万行-- 结果将产生1万亿行可能导致系统崩溃✅ **安全使用建议**sql-- 1. 限制数据量SELECT *FROM (SELECT * FROM table1 LIMIT 100) t1CROSS JOIN (SELECT * FROM table2 LIMIT 100) t2;-- 2. 添加WHERE条件过滤SELECT *FROM small_table t1CROSS JOIN small_table t2WHERE t1.id 100 AND t2.id 100;## 实际业务案例### 案例促销活动组合分析sql-- 分析所有促销方式与所有商品类别的组合效果SELECTp.promotion_type,c.category_name,AVG(s.sales_amount) as avg_salesFROM promotions pCROSS JOIN product_categories cLEFT JOIN sales_data s ON p.promotion_id s.promotion_idAND c.category_id s.category_idGROUP BY p.promotion_type, c.category_name;
CROSS JOIN-笛卡尔积
发布时间:2026/6/6 2:15:19
使用CROSS JOIN时会返回两个表的笛卡尔积即第一个表的每一行与第二个表的每一行进行组合。如果两个表分别有m和n行结果将会有m*n行。注意CROSS JOIN不需要连接条件但可以通过WHERE子句进行过滤。示例表A有3条记录表B有2条记录CROSS JOIN结果3*26条记录语法SELECT * FROM table1 CROSS JOIN table2;简写形式SELECT * FROM table1, table2;但是在实际应用中我们通常会在CROSS JOIN之后加上一些条件来限制结果这时候它就变成了内连接。不过如果我们需要生成组合比如生成序列、日期序列与业务数据组合等时CROSS JOIN很有用。例如假设我们有一个日期维度表和一个商店表我们想要生成每个日期和每个商店的组合就可以使用CROSS JOIN。但是如果表很大CROSS JOIN会产生巨大的结果集需要谨慎使用。实际应用场景1. **生成组合数据**sql-- 生成颜色和尺寸的所有组合SELECT colors.color, sizes.sizeFROM (VALUES (红), (蓝), (绿)) AS colors(color)CROSS JOIN (VALUES (S), (M), (L)) AS sizes(size);结果颜色 尺寸红 S红 M红 L蓝 S蓝 M蓝 L绿 S绿 M绿 L2. **日期范围扩展**sql-- 为每个用户生成连续日期SELECT users.user_id, dates.dateFROM usersCROSS JOIN (SELECT DATE_ADD(2024-01-01, INTERVAL n DAY) as dateFROM (SELECT 0 as n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) numbers) dates;3. **在数据分析中的应用**sql-- 计算所有商品在所有门店的潜在组合SELECT p.product_id, s.store_id,p.price * s.estimated_demand as potential_revenueFROM products pCROSS JOIN stores s;注意事项⚠️ **性能警告**sql-- 危险示例大表的CROSS JOINSELECT *FROM huge_table_1 -- 假设有100万行CROSS JOIN huge_table_2; -- 假设有100万行-- 结果将产生1万亿行可能导致系统崩溃✅ **安全使用建议**sql-- 1. 限制数据量SELECT *FROM (SELECT * FROM table1 LIMIT 100) t1CROSS JOIN (SELECT * FROM table2 LIMIT 100) t2;-- 2. 添加WHERE条件过滤SELECT *FROM small_table t1CROSS JOIN small_table t2WHERE t1.id 100 AND t2.id 100;## 实际业务案例### 案例促销活动组合分析sql-- 分析所有促销方式与所有商品类别的组合效果SELECTp.promotion_type,c.category_name,AVG(s.sales_amount) as avg_salesFROM promotions pCROSS JOIN product_categories cLEFT JOIN sales_data s ON p.promotion_id s.promotion_idAND c.category_id s.category_idGROUP BY p.promotion_type, c.category_name;