用户表 Persons
| id | name |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
订单表 Orders
| id | order_id | p_id | order_status |
|---|---|---|---|
| 1 | 110 | 1 | 待付款 |
| 2 | 111 | 3 | 待发货 |
| 3 | 112 | 1 | 待收货 |
| 4 | 113 | 2 | 待评价 |
| 5 | 114 | 3 | 已完成 |
注: order_status 订单状态一般用阿拉伯数字或英文字母标识,这里先用中文代替
inner join
定义
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
结果如下:
left join
定义
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
right join
定义
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
总结
- inner join(等值连接): 只返回两个表中联结字段相等的行
- left join(左连接): 返回包括左表中的所有记录和右表中联结字段相等的行
- right join(右连接): 返回包括右表中的所有记录和左表中联结字段相等的行