【MySQL 】MySQL 入门之旅 · 第十篇:子查询与嵌套查询
本篇文章将介绍 MySQL 中的 子查询(Subquery) 与 嵌套查询(Nested Query),帮助你编写更灵活的查询语句,处理复杂的数据需求。
目录
- 子查询简介
- 子查询的基本语法
- 子查询的类型
- 嵌套查询示例
- 子查询使用注意事项
- 子查询常用示例对照表
- 小结
子查询简介
子查询是指 在一个查询语句中嵌套另一个查询语句,子查询可以出现在 SELECT
、FROM
或 WHERE
子句中,用于返回数据供外层查询使用。
子查询的基本语法
SELECT column1, column2
FROM table_name
WHERE column3 IN (SELECT column3FROM table_name2WHERE condition
);
- 外层查询:主查询,使用子查询的结果进行过滤或计算
- 内层查询:子查询,先执行并返回结果给外层查询
子查询的类型
-
单行子查询
- 子查询返回单个值,可用于
=
、>
、<
等比较运算符
SELECT name FROM users WHERE age = (SELECT MAX(age) FROM users);
- 子查询返回单个值,可用于
-
多行子查询
- 子查询返回多行数据,可用于
IN
或NOT IN
SELECT name FROM users WHERE city IN (SELECT city FROM users WHERE age > 25);
- 子查询返回多行数据,可用于
-
多列子查询
- 子查询返回多列,可用于
IN
与行匹配
SELECT name, age FROM users WHERE (city, age) IN (SELECT city, ageFROM usersWHERE age > 25 );
- 子查询返回多列,可用于
嵌套查询示例
1. SELECT 中嵌套查询
SELECT name, age
FROM users
WHERE age > (SELECT AVG(age) FROM users);
查询年龄大于平均年龄的用户。
2. FROM 中嵌套查询
SELECT city, COUNT(*) AS user_count
FROM (SELECT cityFROM usersWHERE age > 25
) AS sub
GROUP BY city;
先筛选年龄大于 25 的用户,再按城市分组统计数量。
3. WHERE 中嵌套查询
SELECT name
FROM users
WHERE city = (SELECT city FROM users WHERE name = '张三');
查询与 张三
同城市的所有用户。
子查询使用注意事项
- 子查询效率可能低于 JOIN,复杂查询可考虑使用 JOIN 替代
- 子查询应尽量返回较少行,以提升性能
- 对于多行子查询,必须使用
IN
或EXISTS
避免错误
子查询常用示例对照表
场景 | SQL 示例 | 说明 |
---|---|---|
单行子查询 | SELECT name FROM users WHERE age = (SELECT MAX(age) FROM users); | 查询年龄最大用户 |
多行子查询 | SELECT name FROM users WHERE city IN (SELECT city FROM users WHERE age>25); | 查询符合条件的用户 |
FROM 嵌套 | SELECT city, COUNT(*) FROM (SELECT city FROM users WHERE age>25) AS sub GROUP BY city; | 子查询作为临时表 |
WHERE 嵌套 | SELECT name FROM users WHERE city = (SELECT city FROM users WHERE name='张三'); | 查询同城市用户 |
小结
本篇文章介绍了 MySQL 中 子查询与嵌套查询 的基本用法,包括单行、多行、多列子查询,以及在 SELECT
、FROM
、WHERE
中的使用方式。掌握子查询后,你可以编写更加灵活和复杂的查询语句。
📘 下一篇,我们将学习 MySQL 表连接(JOIN)基础,带你掌握多表联合查询的方法。