【MySQL】MySQL 进阶之旅 · 第一篇 JOIN、子查询与嵌套查询
本篇文章将介绍 MySQL 中的高级查询操作,包括 JOIN(连接查询)、子查询 和 嵌套查询,帮助你掌握多表数据联合查询及更复杂的查询需求。
目录
- JOIN 基础回顾
- 内连接(INNER JOIN)与外连接(LEFT JOIN/RIGHT JOIN)
- 子查询(Subquery)
- 嵌套查询(Nested Query)
- 优化查询性能的小技巧
- 小结
JOIN 基础回顾
在进行多表查询时,最常用的方式是 JOIN。JOIN 用来将两个或多个表的数据通过特定的条件连接起来。
常见的 JOIN 类型:
- INNER JOIN:返回两个表中匹配的数据行。
- LEFT JOIN / RIGHT JOIN:分别返回左表或右表中的所有数据,未匹配的数据会显示
NULL
。 - FULL JOIN:返回两个表的所有数据,未匹配的数据会显示
NULL
。在 MySQL 中,可以通过UNION
来模拟。
示例:使用 JOIN 查询订单和客户数据
SELECT orders.id, customers.name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.id;
上面的 SQL 语句通过 INNER JOIN
联接了 orders
表和 customers
表,查询了所有有订单的客户的姓名和订单 ID。
内连接(INNER JOIN)与外连接(LEFT JOIN / RIGHT JOIN)
1. 内连接(INNER JOIN)
INNER JOIN
返回的是 两个表中匹配的记录。如果两表之间的某一行没有匹配的记录,那么它不会出现在结果中。
语法
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
示例:查询所有客户和他们的订单
SELECT customers.name, orders.id
FROM customers
INNER JOIN orders
ON customers.id = orders.customer_id;
2. 外连接(LEFT JOIN 和 RIGHT JOIN)
LEFT JOIN
返回左表的所有记录和匹配的右表记录。如果右表没有匹配的记录,返回 NULL
。
RIGHT JOIN
则返回右表的所有记录和匹配的左表记录。如果左表没有匹配的记录,返回 NULL
。
语法
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
示例:查询所有客户及其订单(包括没有订单的客户)
SELECT customers.name, orders.id
FROM customers
LEFT JOIN orders
ON customers.id = orders.customer_id;
示例:查询所有订单及其客户(包括没有客户的订单)
SELECT orders.id, customers.name
FROM orders
RIGHT JOIN customers
ON orders.customer_id = customers.id;
子查询(Subquery)
子查询 是指在一个查询中嵌套的另一个查询。子查询可以出现在 SELECT
、FROM
、WHERE
等子句中,通常用于复杂的查询。
子查询的分类:
- 标量子查询:返回单个值。
- 多行子查询:返回多行结果。
- 多列子查询:返回多列结果。
1. 标量子查询
标量子查询返回一个单独的值,可以用于 SELECT
、WHERE
等地方。
示例:查询订单总额大于某个值的客户姓名
SELECT name
FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE total > 1000);
2. 多行子查询
多行子查询返回多个值,通常与 IN
或 EXISTS
一起使用。
示例:查询订单总额大于 1000 的客户信息
SELECT * FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE total > 1000);
3. 关联子查询
关联子查询是指子查询依赖于外部查询中的某些列。
示例:查询每个客户的订单总额
SELECT name, (SELECT SUM(total) FROM orders WHERE customer_id = customers.id) AS total_amount
FROM customers;
嵌套查询(Nested Query)
嵌套查询指的是在一个查询的 WHERE 或 FROM 子句中使用另一个查询。
语法
SELECT columns
FROM (SELECT columns FROM table WHERE condition) AS alias;
示例:嵌套查询查询订单和客户信息
SELECT * FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE total > 1000);
示例:查询订单中客户的详细信息(通过嵌套查询)
SELECT * FROM customers
WHERE id = (SELECT customer_id FROM orders WHERE id = 1);
优化查询性能的小技巧
- 避免在
WHERE
子句中使用计算:如WHERE YEAR(date) = 2020
,最好使用WHERE date >= '2020-01-01' AND date <= '2020-12-31'
。 - 尽量避免在子查询中使用
SELECT *
:在子查询中使用具体的列名比使用SELECT *
更高效。 - 合理使用索引:对
JOIN
操作中的连接条件列创建索引,可以提高查询性能。 - 使用
EXPLAIN
分析查询执行计划:在执行查询前使用EXPLAIN
查看查询的执行计划,发现潜在的性能瓶颈。
示例:使用 EXPLAIN 分析查询性能
EXPLAIN SELECT * FROM orders INNER JOIN customers ON orders.customer_id = customers.id;
通过 EXPLAIN
可以查看查询的执行计划,找出是否存在全表扫描等低效操作。
小结
在本篇文章中,我们介绍了 MySQL 中的 JOIN、子查询 和 嵌套查询,这些是处理复杂查询时不可或缺的工具。掌握这些查询技巧,将帮助你更高效地从数据库中提取和处理多表数据。
📘 下一篇,我们将学习 MySQL 聚合函数与分组查询,深入探讨如何使用聚合函数统计数据并进行分组分析。