下面是sql交叉连接的示例,请讲一下,交叉连接是个怎么回事啊。
在brand商品品牌表和goods商品信息表中,通过交叉连接查询品牌名称(name)、
品牌分类名称(cat_name)和商品名称:
SELECT a.name,a.cat_name,b.goods_name FROM brand a CROSS JOIN goods b;
交叉连接(CROSS JOIN)详解
核心概念
交叉连接返回两个表的笛卡尔积——即第一个表的每一行与第二个表的每一行进行组合。
你的示例分析
sql
SELECT a.name, a.cat_name, b.goods_nameFROM brand a CROSS JOIN goods b;
假设数据:
brand表有3条记录(如:华为、苹果、小米)goods表有5条记录(如:Mate60、iPhone15、小米14等)
结果: 3 × 5 = 15条记录
每条品牌记录都会与所有商品记录配对一次:
brand.cat_name | goods.goods_name | |
华为 | 手机 | Mate60 |
华为 | 手机 | iPhone15 |
华为 | 手机 | 小米14 |
苹果 | 手机 | Mate60 |
苹果 | 手机 | iPhone15 |
... | ... | ... |
关键特点
无条件连接 - 不需要ON子句(不像INNER/LEFT JOIN)
结果行数 = 表1行数 × 表2行数
实际用途有限,除非:
需要生成测试数据
计算所有可能组合(如:颜色×尺码)
与聚合函数配合使用
等价写法
sql
-- 方式1:CROSS JOINSELECT * FROM table1 CROSS JOIN table2;-- 方式2:逗号(隐式交叉连接)SELECT * FROM table1, table2;-- 注意:加上WHERE条件后就不是交叉连接了SELECT * FROM table1, table2 WHERE table1.id = table2.id; -- 实际变成内连接
实际示例:生成排列组合
sql
-- 衣服颜色×尺码SELECT color.name, size.nameFROM colors CROSS JOIN sizes;-- 结果:红S、红M、红L、蓝S、蓝M、蓝L...
⚠️ 你的示例中的问题
在真实业务中,brand和goods通常通过brand_id关联。直接交叉连接会产生大量无意义数据(华为配iPhone、苹果配小米14),这通常是错误用法。
正确做法应该是:
sql
SELECT a.name, a.cat_name, b.goods_nameFROM brand a INNER JOIN goods b ON a.brand_id = b.brand_id;
总结
交叉连接 = 无条件全组合
除非明确需要笛卡尔积,否则慎用(容易产生海量数据)
你的示例会产生:品牌数 × 商品数 条记录,其中大部分是逻辑错误的数据