inner join、left join、right join

1.内连接(inner join/join)

select * from A join B on A.id = B.id

结果–>返回两个表中符合on子句的记录
如果不带连接子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;
从数学集合的角度上看,内连接是两个表的交集
在这里插入图片描述曾遇到过这样的一道面试题:
A表有200条数据,B表有200条数据,查询语句如下:

select * from A join B on 1=1

请问查询后结果有多少条数据?
结果:20000条
由于on子句1=1始终满足,结果返回A表和B表的笛卡尔积(即返回数据的条数位A表和B表数据条数的乘积)
2.外连接(左外连接–>left join;右外连接–>right join)
[1]左外连接–>left join

select * from A left join B on A.id = B.id

结果–>返回左表A所有记录,即使**右表B没有对应匹配(没有对应匹配则为null)**的记录
从数学集合的角度上看,左外连接是A表的范围
在这里插入图片描述
[2]右外连接–>right join

select * from A right join B on A.id= B.id

结果–>返回右表B所有记录,即使**左表A没有对应匹配(没有对应匹配则为null)**的记录
从数学集合的角度上看,右外连接是B表的范围
在这里插入图片描述
3.案例(数据来源于领扣1945. 俱乐部年度比赛得分排名 I)
现有两个表:rankings 表(排名表)和categories 表(项目类别表),rankings 表记录了某俱乐部年度比赛的排名及得分信息,包括项目 id (category_id),年份 (year),排名 (rank) 以及分数 (score);categories 表记录了项目的名称 (name)。
两张表的表结构如下:
在这里插入图片描述
两张表的数据如下:
在这里插入图片描述
[1]内连接
1)不带有on子句的内连接

select * from rankings r 
join categories c ;

返回的结果为:
在这里插入图片描述
此时查询结果为两张表的笛卡尔积,即返回结果的的行数为两张表行数的乘积。
2)带有on子句的内连接

select *
from 
        rankings r 
join 
        categories c 
on r.category_id = c.id ;

返回的结果为:
在这里插入图片描述
此时返回结果为两个表中符合on子句的记录,相当于等值连接
[2]左外连接–>left join

select *
from 
        rankings r 
left join 
        categories c 
on r.category_id = c.id ;

返回的结果为:
在这里插入图片描述
此时返回结果为rankings中所有记录,categories表中不符合on子句的记录补充为null值
[3]右外连接–>right join

select *
from 
        rankings r 
right join 
        categories c 
on r.category_id = c.id ;

返回的结果为:
在这里插入图片描述
此时返回结果为categories中所有记录,rankings表中不符合on子句的记录补充为null值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值