干货!梳理 inner | left | right join

157 阅读2分钟

用户表 Persons

idname
1张三
2李四
3王五

订单表 Orders

idorder_idp_idorder_status
11101待付款
21113待发货
31121待收货
41132待评价
51143已完成

注: order_status 订单状态一般用阿拉伯数字或英文字母标识,这里先用中文代替

inner join

截屏2022-04-03下午4.12.26.png

定义

inner join(内连接), 只返回两个表中联结字段相等的行。

语法

// 在表中存在至少一个匹配时返回行

select column_name
from table1
inner join table2
on table1.column_name = table2.column_name;

// 或

select column_name
from table1
join table2
on table1.column_name = table2.column_name;

注: inner join 与 join 是相同的

实例

查询用户的订单号以及订单状态

select p.name, o.order_id, o.order_status
from Persons p
inner join Orders o
on p.id = o.p_id
order by p.name

结果如下:

截屏2022-04-03下午4.41.42.png

left join

截屏2022-04-03下午4.47.17.png

定义

left join(左连接), 返回包括左表中的所有记录和右表中联结字段相等的记录, 如果右表中没有匹配,则结果为 NULL。

语法

// 以左表为基准

select column_name
from table1
left join table2
on table1.column_name = table2.column_name;

// 或

select column_name
from table1
left outer join table2
on table1.column_name = table2.column_name;

注: left join 与 left outer join 是相同的

如若订单表中没有王五的订单, 那么left join 查询出来的结果是:

select p.name, o.order_id, o.order_status
from Persons p
left join Orders o
on p.id = o.p_id
order by p.name

截屏2022-04-03下午5.23.43.png

right join

截屏2022-04-03下午5.27.02.png

定义

right join(右连接), 返回包括右表中的所有记录和左表中联结字段相等的记录, 如果左表中没有匹配,则结果为 NULL。

语法

// 以左表为基准

select column_name
from table1
right join table2
on table1.column_name = table2.column_name;

// 或

select column_name
from table1
right outer join table2
on table1.column_name = table2.column_name;

注: right join 与 right outer join 是相同的

如若订单表中没有王五的这个人,但又有王五的订单, 那么right join 查询出来的结果是:

select p.name, o.order_id, o.order_status
from Persons p
right join Orders o
on p.id = o.p_id

截屏2022-04-03下午5.36.57.png

总结

  • inner join(等值连接): 只返回两个表中联结字段相等的行
  • left join(左连接): 返回包括左表中的所有记录和右表中联结字段相等的行
  • right join(右连接): 返回包括右表中的所有记录和左表中联结字段相等的行