您好!欢迎访问家园网-www.jy.wang!

家园网

交叉连接

网络 作者:本站 点击:

下面是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.name

brand.cat_name

goods.goods_name

华为

手机

Mate60

华为

手机

iPhone15

华为

手机

小米14

苹果

手机

Mate60

苹果

手机

iPhone15

...

...

...


关键特点

  1. 无条件连接 - 不需要ON子句(不像INNER/LEFT JOIN)

  2. 结果行数 = 表1行数 × 表2行数

  3. 实际用途有限,除非:

    • 需要生成测试数据

    • 计算所有可能组合(如:颜色×尺码)

    • 与聚合函数配合使用

等价写法

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...

⚠️ 你的示例中的问题

在真实业务中,brandgoods通常通过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;

总结

  • 交叉连接 = 无条件全组合

  • 除非明确需要笛卡尔积,否则慎用(容易产生海量数据)

  • 你的示例会产生:品牌数 × 商品数 条记录,其中大部分是逻辑错误的数据


标签: