在数据库中,JOIN 用于连接多个表并返回符合条件的数据。主要有以下几种 JOIN 方式:
1. INNER JOIN(内连接)
- 作用: 只返回两个表中匹配的记录。
- 示例: 连接
users
表和orders
表,获取有订单的用户信息。
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
结果: 仅包含 users
和 orders
表中 user_id 相同 的行。
2. LEFT JOIN(左连接)
- 作用: 返回 左表的所有数据,右表匹配的记录(如果没有匹配,则右表数据为 NULL)。
- 示例: 获取所有用户,即使他们没有订单。
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
- 结果:
- 如果用户有订单,则显示订单信息。
- 如果用户没有订单,
orders
列的值为 NULL。
3. RIGHT JOIN(右连接)
- 作用: 返回 右表的所有数据,左表匹配的记录(如果没有匹配,则左表数据为 NULL)。
- 示例: 获取所有订单,即使它们没有关联用户。
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
- 结果:
- 如果订单有用户,返回正常数据。
- 如果订单没有匹配的用户,
users
列的值为 NULL。
4. FULL JOIN(全连接)
- 作用: 返回 左表和右表所有记录,如果没有匹配,则缺失一方的数据填充
NULL
(MySQL 不支持 FULL JOIN)。 - 示例(PostgreSQL 支持):
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
FULL JOIN orders ON users.id = orders.user_id;
- 结果:
- 有匹配的记录 → 正常显示。
- 无匹配的记录 → 另一表的列填充
NULL
。
5. CROSS JOIN(交叉连接)
- 作用: 返回 两个表的笛卡尔积(所有可能的组合)。
- 示例: 获取所有用户与所有订单的组合。
SELECT users.id, users.name, orders.id AS order_id, orders.amount
FROM users
CROSS JOIN orders;
结果:
users
表有 5 行,orders
表有 3 行,则返回5 × 3 = 15
条记录。
6. SELF JOIN(自连接)
- 作用: 让表自己连接自己,通常用于处理层级结构(如员工与经理)。
- 示例: 查询员工及其经理信息(
employees
表中manager_id
指向id
)。
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
结果: 显示每个员工及其上级。
7. NATURAL JOIN(自然连接)
- 作用: 自动匹配 两个表中相同名称的列 进行连接(不推荐,容易出错)。
- 示例:
SELECT * FROM users NATURAL JOIN orders;
结果: users
和 orders
自动 以相同列名的字段连接(如 id
、user_id
)。