什么是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;
| name | amount |
|---|---|
| Alice | 50.00 |
| Alice | 30.00 |
| Bob | 80.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;
| name | amount |
|---|---|
| Alice | 50.00 |
| Alice | 30.00 |
| Bob | 80.00 |
| Carol | NULL |
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;
| name | amount |
|---|---|
| Alice | 50.00 |
| Alice | 30.00 |
| Bob | 80.00 |
| NULL | 20.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查询。