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值