MySQL 中常见的 JOIN 类型

在 MySQL 中,JOIN 操作用于根据某些条件将两个或多个表中的行组合在一起。MySQL 支持多种类型的 JOIN,每种类型都有其特定的用途和行为。以下是 MySQL 中常见的 JOIN 类型及其描述:

1. 内连接(INNER JOIN)

描述
  • 内连接 是最常用的 JOIN 类型。
  • 它返回两个表中满足连接条件的所有行。
示例
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

2. 左外连接(LEFT OUTER JOIN 或 LEFT JOIN)

描述
  • 左外连接 返回左表中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则结果集中对应的列包含 NULL
  • 如果省略 OUTER 关键字,效果相同。
示例
SELECT orders.order_id, customers.customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;

3. 右外连接(RIGHT OUTER JOIN 或 RIGHT JOIN)

描述
  • 右外连接 返回右表中的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则结果集中对应的列包含 NULL
  • 如果省略 OUTER 关键字,效果相同。
示例
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;

4. 全外连接(FULL OUTER JOIN)

描述
  • 全外连接 返回两个表中的所有行,只要它们在另一个表中有匹配的行或者没有匹配的行。
  • MySQL 不直接支持 FULL OUTER JOIN,但可以通过结合 LEFT JOINRIGHT JOIN 来实现类似的效果。
示例(模拟全外连接)
SELECT orders.order_id, customers.customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id

UNION

SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id
WHERE orders.order_id IS NULL;

5. 自连接(Self JOIN)

描述
  • 自连接 是指一个表与自身进行连接。
  • 常用于查询层次结构数据,如员工与其上级的关系。
示例
SELECT e1.employee_name AS Employee, e2.employee_name AS Manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.employee_id;

6. 交叉连接(CROSS JOIN)

描述
  • 交叉连接 会生成两个表的笛卡尔积,即每个表中的每一行都与另一个表中的每一行组合。
  • 结果集的行数等于两个表行数的乘积。
示例
SELECT orders.order_id, customers.customer_name
FROM orders
CROSS JOIN customers;

7. 自然连接(NATURAL JOIN)

描述
  • 自然连接 是一种特殊的 JOIN,它自动基于两个表中同名的列进行连接。
  • 注意:使用时要小心,因为可能会意外地基于不正确的列进行连接。
示例
SELECT orders.order_id, customers.customer_name
FROM orders
NATURAL JOIN customers;

8. 使用 USING 子句

描述
  • 当两个表有相同的列名时,可以使用 USING 子句来简化 JOIN 语句。
  • USING 子句指定用于连接的列,并避免重复列出这些列。
示例
SELECT orders.order_id, customers.customer_name
FROM orders
JOIN customers USING (customer_id);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值