目录

  1. MySQL 连接(JOIN)概述
  2. JOIN 的基本语法
  3. INNER JOIN(内连接)
  4. LEFT JOIN(左连接)
  5. RIGHT JOIN(右连接)
  6. FULL JOIN(全连接)
  7. CROSS JOIN(交叉连接)
  8. SELF JOIN(自连接)
  9. USING 与 ON 的区别
  10. JOIN 连接的性能优化
  11. 参考资料

MySQL 连接(JOIN)概述

JOIN 用于在 两个或多个表 之间建立关联,并通过匹配相关字段来获取数据。
关系型数据库 设计中,数据通常存储在多个表中,JOIN 能够高效地查询这些表并组合数据。


JOIN 的基本语法

SELECT columns
FROM table1
JOIN table2
ON table1.column = table2.column;

关键点:

  • table1table2 是要连接的两个表。
  • ON 指定 连接条件,即两个表中如何匹配数据。

INNER JOIN(内连接)

作用:只返回两个表中匹配的数据,不匹配的数据不会被返回。

示例:查询订单及其对应的客户信息

SELECT orders.id, customers.name, orders.amount
FROM orders
INNER JOIN customers ON orders.customer_id = customers.id;

结果示例:

+----+----------+--------+
| id | name     | amount |
+----+----------+--------+
|  1 | Alice    |  500   |
|  2 | Bob      |  300   |
+----+----------+--------+

📌 未匹配的行(如没有订单的客户)不会出现在结果中


LEFT JOIN(左连接)

作用:返回左表的所有数据,并匹配右表的数据;如果右表没有匹配的记录,则填充 NULL

示例:查询所有客户及其订单

SELECT customers.id, customers.name, orders.amount
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id;

结果示例:

+----+----------+--------+
| id | name     | amount |
+----+----------+--------+
|  1 | Alice    |  500   |
|  2 | Bob      |  300   |
|  3 | Charlie  | NULL   |  -- Charlie 没有订单
+----+----------+--------+

📌 Charlie 没有订单,但仍然出现在结果中(右表的 NULL 代替缺失值)


RIGHT JOIN(右连接)

作用:返回右表的所有数据,并匹配左表的数据;如果左表没有匹配的记录,则填充 NULL

示例:查询所有订单及其客户(即使客户信息缺失)

SELECT orders.id, customers.name, orders.amount
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.id;

结果与 LEFT JOIN 类似,但 会优先保留 orders 表的所有数据


FULL JOIN(全连接)

作用:返回左右表所有数据,如果某一边没有匹配,则填充 NULL

📌 MySQL 不支持 FULL JOIN,但可以用 LEFT JOIN + UNION + RIGHT JOIN 模拟:

SELECT customers.id, customers.name, orders.amount
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
UNION
SELECT customers.id, customers.name, orders.amount
FROM customers
RIGHT JOIN orders ON customers.id = orders.customer_id;


CROSS JOIN(交叉连接)

作用笛卡尔积,即每一行都会与另一表的所有行组合

示例:查询所有可能的产品和订单组合

SELECT products.name, orders.id
FROM products
CROSS JOIN orders;

📌 慎用 CROSS JOIN,可能导致数据量剧增!


SELF JOIN(自连接)

作用:将表自身作为两个表进行连接,常用于层级结构(如员工与经理)

示例:查询每个员工及其经理

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

结果示例:

+----------+---------+
| employee | manager |
+----------+---------+
| Alice    | Bob     |
| Bob      | NULL    |  -- Bob 没有上级
+----------+---------+

📌 e1 代表员工,e2 代表经理(同一张表的不同别名)


USING 与 ON 的区别

关键字作用
ON用于指定连接条件,适用于不同列名
USING适用于两个表列名相同时,简化 ON 语法

示例:使用 ON

SELECT * FROM orders
INNER JOIN customers ON orders.customer_id = customers.id;

示例:使用 USING

SELECT * FROM orders
INNER JOIN customers USING (customer_id);

📌 USING(column_name) 只能用于相同列名的情况


JOIN 连接的性能优化

  1. 使用索引加速连接 CREATE INDEX idx_customer_id ON orders(customer_id); 📌 索引能大幅提升 JOIN 查询性能!
  2. 避免 SELECT *,只查询必要字段 SELECT o.id, c.name FROM orders o JOIN customers c ON o.customer_id = c.id;
  3. 优化 JOIN 顺序(优先连接小表,减少数据扫描量) EXPLAIN SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id; 📌 EXPLAIN 可帮助分析查询计划,优化连接方式。
  4. 使用 JOIN 代替子查询
    ❌ 子查询(低效) SELECT name FROM customers WHERE id IN (SELECT customer_id FROM orders); ✅ JOIN(更高效) SELECT DISTINCT customers.name FROM customers INNER JOIN orders ON customers.id = orders.customer_id;

参考资料


如果你需要更深入的 JOIN 优化或示例,请告诉我! 🚀