sql left join 重复数据_「SQL」 当我们join数据时,到底发生了什么?一文让你不再混淆...

本文从笛卡尔积出发,

介绍SQL在 join 时数据是怎样组合和筛选来获得结果的,

帮助你理清join、left join、right join、full join等各类不同join的差异。

笛卡尔积

首先,让我们了解一下join中涉及到的重要概念,笛卡尔积。

两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,是第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 。

现在,我们有两个集合A和B。

A = {0,1} ,B = {2,3,4}

集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:

A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};

B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};

以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。

从以上的数据分析我们可以得出以下两点结论:

1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;

2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数。

0e393f40463c25ba98250c6bbcde043e.png

jon解析

假设,我们有table_a和table_b两个表,如图所示。

6262a34606f89d172281f46a8947999b.png

接下来,我们看一下不同类型的 join下,到底发生了什么。

1. Inner Join / Join

select * from table_a a join table_b b on a.id = b.id;

首先,我们分别为table_a与table_b添加一个空行,

5e6a83bef5dcba3e6a92e3c1a9afd549.png

接下来,作出table_a’和table_b’的笛卡尔积,

23b1d2b2c6e804a39e5e18375dfdd41d.png

最后一步就非常简单了,就是筛选出上表中满足on条件的部分,即id_a = id_b,

2671bf42544367d60728e3d3ad2eff17.png

可能有同学奇怪,为什么id_a 、 id_b均为NULL的数据为什么没有被选出呢?

这是因为在SQL中,null代表什么都不是,用“=、>、< ...” 所有的判断,结果都是false。

2. Left Join

select * from table_a a left join table_b b on a.id = b.id;

首先,仍然是为table_a与table_b添加一个空行,并做笛卡尔积,

但最后一步中,我们不仅筛选出符合id_a = id_b条件的数据,还会筛选出table_a’未关联到table_b’的数据。

203a1c1d4ddb5fc53db59d75b68f0470.png

2. Right Join

select * from table_a a right join table_b b on a.id = b.id;

与left join类似,做出笛卡尔积后,筛选出符合id_a = id_b条件的数据,和table_b’未关联到table_a’的数据。

c2f023e98b54dbebfc0f5716b8c9b65a.png

2. Full Join

select * from table_a a full join table_b b on a.id = b.id;

full join的结果为left join、right join的并集,

做出笛卡尔积后,筛选出符合id_a = id_b条件的数据、table_a’未关联到table_b’的数据和table_b’未关联到table_a’的数据。

93eead405654fb704be822c294a05cb0.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个SQL的查询语句,它使用了`LEFT JOIN`来连接两个表`t_ip`和`t_res`。 `LEFT JOIN`是一种连接操作,它会返回左表(`ips`)中的所有记录,即使在右表(`res`)中没有与之匹配的记录。如果在右表中没有匹配到任何记录,则返回的结果中将包含`NULL`值。 `t_ip AS ips`表示将`t_ip`表重命名为`ips`表,`t_res AS res`表示将`t_res`表重命名为`res`表。这种重命名操作可以使查询语句更加易读,同还可以避免表名冲突的问题。 `ON ips.id=res._ip_id`表示将`ips`表中的`id`字段与`res`表中的`_ip_id`字段进行连接。具体而言,这意味着查询结果将包含所有在`t_ip`表中存在的记录,而且如果在`t_res`表中也有与之对应的记录,则会将这些记录一起返回,否则在查询结果中将包含`NULL`值。 ### 回答2: 这段代码是SQL中的一条查询语句,主要用于执行表t_ip和表t_res之间的左连接操作。 - 左连接(LEFT JOIN)是SQL中的一种关联查询方式,表示保留左表(t_ip)中的所有记录,并根据指定的条件,将符合条件的右表(t_res)的记录进行匹配。如果左表中的记录在右表中找不到匹配的记录,则右表相关字段值为NULL。 - AS是SQL中的关键词,用于为表或列指定别名。在这个查询中,t_ip表被指定别名为ips,t_res表被指定别名为res。 - ips.id表示t_ip表中的id字段。 - res._ip_id表示t_res表中的_ip_id字段。 综上所述,这段代码的含义是:将表t_ip的所有记录与表t_res中根据ips.id和res._ip_id匹配的记录进行左连接操作,结果为保留左表中的所有记录,并将匹配的右表记录合并在一起。若在右表中找不到匹配的记录,则右表相关字段值为NULL。 ### 回答3: "SQL中 t_ip AS ips LEFT JOIN t_res AS res ON ips.id=res._ip_id" 表示一条 SQL 查询语句,它使用了 LEFT JOIN(左连接)来连接两个数据表 t_ip 和 t_res。 t_ip AS ips 表示将表 t_ip 重命名为 ips,这样在查询中可以使用 ips 来代表该表。同样地,t_res AS res 表示将表 t_res 重命名为 res,以便在查询中使用 res 代表该表。 LEFT JOIN 意味着以左边的表(ips)为基准,连接右边的表(res)。换句话说,它会返回左表中的所有数据,同如果在右表中存在符合条件的数据,则将其连接起来。 ON ips.id=res._ip_id 指定了连接的条件,即将表 ips 的 id 列与表 res 的 _ip_id 列进行连接。这意味着,只有在这两列的值相等才会进行连接。 总结起来,这条 SQL 查询语句的含义是:使用左连接,将表 t_ip 和表 t_res 中符合条件的数据连接起来,并返回左表 t_ip 中的所有数据,同如果在右表 t_res 中存在符合条件的数据,则将其连接起来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值