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

相关推荐
瀚高PG实验室9 小时前
Oracle或DM(达梦)时间戳之间的差值SQL迁移到瀚高数据库
数据库·sql·oracle·瀚高数据库
货拉拉技术9 小时前
货拉拉RAG优化实践:从原始数据到高质量知识库
数据库·算法
张较瘦_10 小时前
数据库|数据库设计范式:用“宠物管理系统“讲透1nf 2nf 3nf的关键逻辑
数据库·开发
源来猿往10 小时前
并发之锁介绍
数据库
路边草随风10 小时前
starrocks compaction 进度问题定位
大数据·sql
曹牧10 小时前
Oracle:“列不能外部关联到子查询”
数据库·sql
档案宝档案管理10 小时前
核心功能揭秘——档案管理系统如何破解档案管理难题?
大数据·数据库·安全·档案·档案管理
Databend10 小时前
如何打造AI时代的数据基石 | Databend Meetup 上海站回顾
数据库
wudl556610 小时前
向量数据库--FAISS
数据库·faiss
冲的运维日常10 小时前
Redis:查看RDB文件内容
数据库·redis·缓存