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

相关推荐
l1t2 小时前
DeepSeek辅助编写转换DuckDB json格式执行计划到PostgreSQL格式的Python程序
数据库·python·postgresql·json·执行计划
TDengine (老段)2 小时前
TDengine 字符串函数 LIKE_IN_SET 用户手册
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
友善啊,朋友2 小时前
Qt:判断一个sql语句是否是select语句
sql·qt
q***82912 小时前
【玩转全栈】----Django模板语法、请求与响应
数据库·python·django
q***31892 小时前
数据库操作与数据管理——Rust 与 SQLite 的集成
数据库·rust·sqlite
元亓亓亓3 小时前
考研408--操作系统--day4--进程同步&互斥&信息量机制
java·数据库·考研·操作系统·408
武子康3 小时前
Java-169 Neo4j CQL 实战速查:字符串/聚合/关系与多跳查询
java·开发语言·数据库·python·sql·nosql·neo4j
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ3 小时前
MyBatis Plus中执行原生SQL语句方法
python·sql·mybatis
现在,此刻4 小时前
高可用与高性能数据库配置实践分析(pgSql && clickhouse)
数据库·clickhouse