目录
- MySQL 连接(JOIN)概述
- JOIN 的基本语法
- INNER JOIN(内连接)
- LEFT JOIN(左连接)
- RIGHT JOIN(右连接)
- FULL JOIN(全连接)
- CROSS JOIN(交叉连接)
- SELF JOIN(自连接)
- USING 与 ON 的区别
- JOIN 连接的性能优化
- 参考资料
MySQL 连接(JOIN)概述
JOIN
用于在 两个或多个表 之间建立关联,并通过匹配相关字段来获取数据。
在 关系型数据库 设计中,数据通常存储在多个表中,JOIN
能够高效地查询这些表并组合数据。
JOIN 的基本语法
SELECT columns
FROM table1
JOIN table2
ON table1.column = table2.column;
关键点:
table1
和table2
是要连接的两个表。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 连接的性能优化
- 使用索引加速连接
CREATE INDEX idx_customer_id ON orders(customer_id);
📌 索引能大幅提升JOIN
查询性能! - 避免
SELECT *
,只查询必要字段SELECT o.id, c.name FROM orders o JOIN customers c ON o.customer_id = c.id;
- 优化
JOIN
顺序(优先连接小表,减少数据扫描量)EXPLAIN SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id;
📌EXPLAIN
可帮助分析查询计划,优化连接方式。 - 使用
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
优化或示例,请告诉我! 🚀
发表回复