连接(inner join),左连接(left join),右连接(right join)之间的不同之处(附录:SQL的三种连接方式:内连接、外连接、交叉连接。)

概念(定义)

​Left join:即左连接,是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分,不能匹配上的用null填充左连接全称为左外连接,是外连接的一种。

​Right join:即右连接,是以右表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将右表所有的查询信息列出,而左表只列出ON后条件与右表满足的部分,不能匹配上的用null填充。右连接全称为右外连接,是外连接的一种。​

​Inner join:即内连接,同时将两表作为参考对象根据ON后给出的两表的条件将两表连接起来。结果则是两表同时满足ON后的条件的部分才会列出

集合思维理解:

我们有两个表:A和B,那么就分别将其当做一个集合

​那么我们的左右外连接和内连接就相当于变成了这样↓ ↓ ↓

A Left join B -> A (根据返回需求 需连接上B中与A等条件的部分)

 

A Right join B -> B (根据返回需求 需连接上A中与B等条件的部分)

 

A Inner join B -> A∩B​ (根据返回需求 需连接上A与B等条件的部分)

 

 

补充:

SQL的连接分为三种:内连接、外连接、交叉连接。

先给出两张表:

一、内连接:

    内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。


1、等值连接
     概念:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。

例子:

select  * 

from T_student s,T_class c 

where s.classId = c.classId

等价于

select  * 

 from T_student s inner join T_class c on s.classId = c.classId

2、不等连接
   概念:在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<)

select * from T_student s inner join T_class c on s.classId <> c.classId

二、外连接
    外连接分为左连接(LEFT JOIN)或左外连接(LEFT OUTER JOIN)、右连接(RIGHT JOIN)或右外连接(RIGHT OUTER JOIN)、全连接(FULL JOIN)或全外连接(FULL OUTER JOIN)。我们就简单的叫:左连接、右连接和全连接。

1、左连接:
    概念:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

例如:

select  * from T_student s left join T_class c on s.classId = c.classId

检索结果:

总结:左连接显示左表全部行,和右表与左表相同行。

2、右连接:
   概念:恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

例如:

     select * from  T_student s right join T_class c on s.classId = c.classId
检索结果:

总结:右连接恰与左连接相反,显示右表全部行,和左表与右表相同行。

3、全连接

  概念:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值。

     select * from  T_student s full join T_class c on s.classId = c.classId

 

总结:返回左表和右表中的所有行


三、交叉连接(CROSS JOIN):也称迪卡尔积
概念:不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如:T_student和T_class,返回4*4=16条记录),如果带where,返回或显示的是匹配的行数。
1、不带where:
   select *from T_student cross join T_class    //cross join 可以省略不写
  等于  select *from T_student, T_class
   

总结:笛卡尔积,左表和右表组合。
2、有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择。
select * from T_student s cross join T_class c where s.classId = c.classId   
   (注:cross join后加条件只能用where,不能用on)  
      查询结果跟等值连接的查询结果是一样。

 

posted @   李若盛开  阅读(340)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示