彻底搞懂inner join,left join,right join

1.inner  join 

A inner join B where 条件, 对于A表中的每一行都会去B表的所有行去查找,去匹配,符合条件的就将这两行连接起来

下面用一个例子来帮助实际理解这句话:

创建下面两个表,customers表orders表

 输入以下sql语句:

select customers.id,customers.name,orders.amount,orders.date
from customers inner join orders
on customers.id=orders.id

此时你就站在customers的角度,对于customers表中的每一行的id(比如说是x),都会去另一张表order表中查询所有行,看有没有哪一行的id等于x,如果有id相等的行,就将customers里这行和order里的这一行连接起来

具体来说:对于customer表中id=2的这一行,遍历order表中每一行,发现有一行(也就是第三行)id也等于2,于是按照sql语句中的描述,将customer表中的id,name两列和order表中的amount和date两列进行拼接,得到:

 而对于customer表中id=3的这一行,遍历order表中每一行,发现有两行(也就是第一行,第二行)id也等于3,于是按照sql语句中的描述,将customer表中的id,name两列和order表中的amount和date两列进行拼接,得到:

 最终查询结果:

 2.left  join

A left join B   where  条件

和inner  join一样,对于A表中的每一行,都会去和B表中的每一行进行比较,符合条件的就将表A中的行和表B的行进行连接

另外,表A中的每一行都会被保存(即使在B表中没有与其匹配的行,表A的这一行也要保存下来)

举个例子:左边是student表学生表,右边是grade表成绩表

 执行sql语句:

SELECT student.student_id,student.name,student.age,grade.score,grade.course_name
FROM  student LEFT JOIN grade
ON student.student_id=grade.student_id

站在学生表student表的角度,对于这个表中的每一行去成绩表中查找,是否有student.student_id=grade.student_id的行

显然对于student表中的student_id=1这一行,可以在grade表中匹配到两行,得到:

而student表中的student_id=2这一行,在grade表中没有与之匹配的行,但是由于是左连接,所以student表的所有行都需要保存,于是最终结果还要加上一行:

 最后的结果是:

 

力扣183  从不订购的客户

 订单表中显示只有1号和3号客户下过订单,所以显然customers表中的2号和4号员工从来不订购

Select Customers.Name as Customers  /* 给最后选出来的列起个别名,否则就叫Name*/
From Customers Left Join Orders 
on Customers.Id=Orders.CustomerId

将customers客户表和orders订单表进行左连接,对于customers客户表中的每一行都会去orders订单表中进行查找匹配·     

   

所以选出Orders.CustomerId Is Null的行就行了,最后的sql语句:

Select Customers.Name as Customers  /* 给最后选出来的列起个别名,否则就叫Name*/
From Customers Left Join Orders 
on Customers.Id=Orders.CustomerId
where Orders.CustomerId Is Null;/*这里where Orders.Id Is Null也是可以的*/

3.右连接

右连接和左连接刚好相反

左连接是保留左表中所有行

右连接是保留右表中所有行

左连接可以改写成右连接,右连接可以改写成左连接,无非交换一下两个表的顺序即可

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值