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

相关推荐
禾小西4 小时前
06丨Redis 数据同步:主从库如何实现数据一致?
数据库·redis·php
前端 贾公子4 小时前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
薛晓刚5 小时前
PGA 超限的一次应急处置:扩容、清游标、杀会话
数据库
CJi0NG5 小时前
【自用】MySQL-事务
数据库·mysql
我不会插花弄玉5 小时前
4.string类型【由浅入深-redis】
数据库·redis·缓存
PHP实战开发录5 小时前
MySQL数字排序为什么乱
数据库·mysql·php
不停喝水7 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
leisoo80977 小时前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
Aric_Jones7 小时前
pgsql内置publication/subscription功能,实现数据同步
数据库