Erdmates Logo
Erdmates
返回博客
SQLJOIN数据库查询

SQL JOIN完全掌握:INNER、LEFT、RIGHT、FULL OUTER JOIN实战指南

通过实际示例清晰理解INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL OUTER JOIN的区别,同时探讨ERD关系与JOIN的对应关系。

2026年3月10日8 分钟阅读

什么是SQL JOIN?

关系型数据库将数据分散存储在多个表中。JOIN是通过特定条件(通常是外键与主键的关系)将这些分散的表连接起来,形成单一结果集的SQL运算。

ERD中用关系线表示的表间关系,在实际查询中就是通过JOIN来实现的。理解了ERD,自然就能写出JOIN查询。

示例表

CREATE TABLE users (
  id    INT PRIMARY KEY,
  name  VARCHAR(100)
);

CREATE TABLE orders (
  id      INT PRIMARY KEY,
  user_id INT REFERENCES users(id),
  amount  DECIMAL(10,2)
);

INSERT INTO users VALUES (1,'Alice'), (2,'Bob'), (3,'Carol');
INSERT INTO orders VALUES (1,1,50.00),(2,1,30.00),(3,2,80.00),(4,NULL,20.00);
-- 订单4的user_id为NULL,Carol没有订单

INNER JOIN:交集

只返回两个表中都存在的行。使用最频繁的JOIN类型。

SELECT u.name, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
nameamount
Alice50.00
Alice30.00
Bob80.00

Carol因无订单被排除。订单4(user_id=NULL)也被排除。

LEFT JOIN:保留左表全部行

返回左表(users)的所有行,右表(orders)无匹配时用NULL填充。

SELECT u.name, o.amount
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
nameamount
Alice50.00
Alice30.00
Bob80.00
CarolNULL

Carol以NULL包含在结果中。适用于查找**"从未下单的用户"**等场景。

SELECT u.name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.id IS NULL;

RIGHT JOIN:保留右表全部行

LEFT JOIN的相反操作,返回右表的所有行。

SELECT u.name, o.amount
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
nameamount
Alice50.00
Alice30.00
Bob80.00
NULL20.00

订单4被包含,用户名为NULL。实务中通常用LEFT JOIN替代。

FULL OUTER JOIN:并集

返回两个表的所有行,无匹配的一侧用NULL填充。

SELF JOIN:自连接

同一个表引用两次,适用于员工-上级等层级结构数据。

SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

ERD关系与JOIN的对应

ERD的关系线直接转换为JOIN的ON条件:

  • 1:N关系(users → orders):JOIN orders ON users.id = orders.user_id
  • N:M关系(students ↔ courses via enrollments):通过中间表进行两次JOIN
  • FK允许NULL:考虑使用LEFT JOIN

总结

JOIN是关系型数据库的核心功能。通过ERD可视化表关系后,直觉上就能判断应该使用哪种JOIN以及如何编写ON条件。在Erdmates中设计表结构,并利用AI自然语言查询功能自动生成复杂的JOIN查询。

立即使用Erdmates开始

使用AI驱动的ERD编辑器开始数据库设计。免费使用。

免费试用演示免费开始

相关文章

bigint、UUID v4 还是 UUID v7?主键选择指南(含 PostgreSQL 18 的 uuidv7())

比较 bigint、UUID v4 和 UUID v7 主键的优缺点,介绍 PostgreSQL 18 内置的 uuidv7() 带来的变化,以及不同场景下的选择方法。

被AI代理读取的数据库:MCP时代的模式设计原则

AI代理通过MCP直接连接数据库的情况越来越多。本文整理如何设计名称、注释和约束,让代理不会误解模式,以及如何安全地划分权限。

PostgreSQL 19预览:影响模式设计与运维的变化(基于Beta 4)

以官方发布说明(Beta 4)为准,整理即将正式发布的PostgreSQL 19的变更中直接影响表设计、迁移和运维的内容。同时介绍在Beta阶段被撤回的功能,以及升级前需要确认的行为变化。

Erdmates Logo
Erdmates

使用自然语言设计数据库,通过AI驱动的ERD编辑器与团队实时协作。

服务

  • 功能介绍
  • 价格方案
  • 演示
  • SQL 转 ERD

资源

  • 博客
  • 帮助
  • 联系我们

法律声明

  • 服务条款
  • 隐私政策
  • 第三方提供
公司名称: Produx|代表人: 최정회
地址: 강원특별자치도 원주시 솔우물2길 4-1 (무실동)
电子邮件: master@erdmates.com
隐私保护负责人: 최정회|托管服务提供商: Amazon Web Services

© 2026 Produx. 版权所有。