sql中left join和inner join的区别

join时mysql数据库中非常关键的连表查询手段,包括left join和inner join。

这里尝试说明left join和inner join的区别,并通过具体场景示例。

sql代码和例子,参考自网络资料。

1 left join

left join返回左表的所有记录,即使右表中没有匹配的记录。

如果右表中没有匹配,则结果为NULL。

在左连接中,左表的所有行都会显示,左连接适用于需要保留左表所有数据的情况。

2 inner join

inner join只返回两个表中匹配的记录,不包括不匹配的记录。

在内连接中,只有符合条件的行会显示,内连接适用于只关心匹配数据的情况。

3 场景示例

以下是示例场景,有 5 个客户,但只有 4 笔订单。赵六和钱七还没下过订单。

客户表(customers):

复制代码
customer_id | name
1           | 张三
2           | 李四
3           | 王五
4           | 赵六
5           | 钱七  ← 还没下过订单!

订单表(orders):

复制代码
order_id | customer_id | amount
101      | 1           | 250.00
102      | 2           | 180.00
103      | 1           | 420.00
104      | 3           | 95.00

3.1 left join查询

查询所有客户的信息以及其订单量,包括实际没有下单的客户。

sql示例如下

复制代码
SELECT 
    c.customer_id,
    [c.name](http://c.name),
    COUNT(o.order_id) as order_count
FROM customers c
LEFT JOIN orders o
    ON c.customer_id = o.customer_id
GROUP BY c.customer_id, [c.name](http://c.name);

查询结果如下所示,赵六和钱七还没下过订单,但也被统计在内。

复制代码
customer_id | name  | order_count
1           | 张三  | 2
2           | 李四  | 1
3           | 王五  | 1
4           | 赵六  | 0  ← 没有下订单
5           | 钱七  | 0  ← 没有下订单

3.2 inner join查询

查询所有客户及其订单数量,要求必须要有实际订单。

sql示例如下

复制代码
SELECT 
    c.customer_id,
    [c.name](http://c.name),
    COUNT(o.order_id) as order_count
FROM customers c
INNER JOIN orders o
    ON c.customer_id = o.customer_id
GROUP BY c.customer_id, [c.name](http://c.name);

查询结果,只显示 3 个客户,而不是 5 个,因为赵六和钱七还没下过订单。

复制代码
customer_id | name  | order_count
1           | 张三  | 2
2           | 李四  | 1
3           | 王五  | 1

reference


SQL JOIN详解:LEFT JOIN vs INNER JOIN避免数据丢失(附实战案例)

https://zhuanlan.zhihu.com/p/1967303095915638900

相关推荐
我不是疯子是傻子1 分钟前
Qt CAN通信周期发送抖动?实测定时器精度校准与时间戳补偿方案
开发语言·数据库·qt
这个DBA有点耶36 分钟前
数据库迁移怎么做到“零翻车“:金仓 KDMS/KDTS/KFS 工具链实测
数据库·架构·dba
名字还没想好☜2 小时前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js
迷迭香yy2 小时前
行业板块轮动因子实战从板块资金到因子建模的本地化Python全流程
数据库·人工智能·python
SelectDB3 小时前
抖音集团 实时数据仓库:Apache Doris / SelectDB 的技术能力与实践
数据库
SelectDB3 小时前
网易 日志与时序数据分析:Apache Doris / SelectDB 的技术能力与实践
数据库
weixin_539446783 小时前
Navicat Premium 17报缺少ODBC驱动
数据库
哦虎!4 小时前
【数据库】事务
java·数据库·mysql
倔强的石头_4 小时前
时序数据库的难题不只在写入速度
数据库
IT古董6 小时前
【WMS学习笔记系列】01-需求分析
大数据·数据库