首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
9.1 基本查询语句
9.2 单表查询
9.2.1 查询所有字段
9.2.2 查询指定字段
9.2.3 查询指定数据
9.2.4 带关键字IN的查询
9.2.5 带关键字BETWEEN AND的范围查询
9.2.6 带LIKE的字符匹配查询
9.2.7 用IS NULL关键字查询空值
9.2.8 带AND的多条件查询
9.2.9 带OR的多条件查询
9.2.10 用DISTINCT关键字去除结果中的重复行
9.2.11 用ORDER BY关键字对查询结果进行排序
9.2.12 用GROUP BY关键字分组查询
9.2.13 用LIMIT限制查询结果的数量
9.3 聚合函数查询
9.3.1 COUNT()统计函数
9.3.2 SUM()求和函数
9.3.3 AVG()平均数函数
9.3.4 MAX()最大值函数
9.3.5 MIN()最小值函数
9.4 连接查询
9.4.1 内连接查询
9.4.2 外连接查询
9.4.3 复合条件连接查询
9.5 子查询
9.5.1 带IN关键字的子查询
9.5.2 带比较运算符的子查询
9.5.3 带EXISTS关键字的子查询
9.5.4 带ANY关键字的子查询
9.5.5 带ALL关键字的子查询
9.6 合并查询结果
9.7 定义表和字段的别名
9.7.1 为表取别名
9.7.2 为字段取别名
9.8 使用正则表达式查询
9.8.1 匹配指定字符中的任意一个
9.8.2 使用“*”和“ ”来匹配多个字符
9.8.3 匹配以指定的字符开头和结束的记录
10.1 MySQL函数
10.2 数学函数
10.2.1 ABS(x)绝对值函数
10.2.2 FLOOR(x)向下取整函数
10.2.3 RAND()随机数函数
10.2.4 PI()圆周率函数
10.2.5 TRUNCATE(x,y)截断函数
10.2.6 ROUND(x)近似值函数和ROUND(x,y)四舍五入函数
10.2.7 SQRT(x)平方函数
10.3 字符串函数
10.3.1 INSERT(s1,x,len,s2)替换函数
10.3.2 UPPER(s)函数和UCASE(s)字母大写函数
10.3.3 LEFT(s,n)取左函数
10.3.4 RTRIM(s)去空格函数
10.3.5 SUBSTRING(s,n,len)截取函数
10.3.6 REVERSE(s)反转函数
10.3.7 FIELD(s,s1,s2,…,sn)位置函数
10.3.8 LOCATE(s1,s)、POSITION(s1 IN s)和INSTR(s,s1)3个位置函数
10.4 日期和时间函数
10.4.1 CURDATE()和CURRENT_DATE()当前日期函数
10.4.2 CURTIME()和CURRENT_TIME()当前时间函数
10.4.3 NOW()当前日期和时间函数
10.4.4 DATEDIFF(d1,d2)间隔天数函数
10.4.5 ADDDATE(d,n)日期计算函数
10.4.6 ADDDATE(d,INTERVAL expr type)日期时间计算函数
10.4.7 SUBDATE(d,n)日期计算函数
10.5 条件判断函数
10.6 系统信息函数
10.6.1 获取MySQL版本号、连接数和数据库名的函数
10.6.2 获取用户名的函数
10.6.3 获取字符串的字符集和排序方式的函数
10.7.1 格式化函数FORMAT(x,n)
10.7.2 改变字符集的函数
10.7.3 改变字段数据类型的函数
当前位置:
首页>>
技术小册>>
MySQL从入门到精通(三)
小册名称:MySQL从入门到精通(三)
### 9.5 子查询 在MySQL中,子查询(Subquery)是一种嵌套在其他查询(称为外部查询或主查询)中的SQL查询。它们允许你在一个查询中嵌入另一个查询,从而执行更复杂的数据库操作,如从查询结果中选取数据作为条件、计算字段值或作为插入、更新、删除操作的目标等。子查询极大地增强了SQL的灵活性和功能。本章将深入探讨子查询的概念、类型、使用场景以及最佳实践。 #### 9.5.1 子查询的基本概念 子查询通常出现在SELECT、INSERT、UPDATE、DELETE语句的WHERE子句或FROM子句中,以及SELECT语句的SELECT列表中。它们可以是标量子查询(返回单个值)、行子查询(返回单行多列)、列子查询(返回多行单列)或表子查询(返回多行多列,在FROM子句中作为临时表使用)。 #### 9.5.2 子查询的类型 1. **标量子查询**: 标量子查询返回单个值(通常是数字、字符串或日期等),通常用于比较操作。例如,查询薪资高于公司平均水平的员工: ```sql SELECT employee_id, name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 2. **行子查询**: 行子查询返回单行多列的结果集,通常与IN、EXISTS或比较操作符(如=、<>)一起使用。例如,查找与特定员工(如ID为101)相同部门且薪资更高的员工: ```sql SELECT employee_id, name, salary, department_id FROM employees e1 WHERE (department_id, salary) > ( SELECT department_id, salary FROM employees e2 WHERE e2.employee_id = 101 ); ``` 注意:直接比较行(如上例)在某些数据库系统中可能不被支持,通常需要使用其他逻辑来实现相同功能。 3. **列子查询**: 列子查询返回多行单列的结果集,常用于IN或ANY/ALL操作符中。例如,查询库存量小于任何一种产品平均库存量的产品: ```sql SELECT product_id, product_name, stock_quantity FROM products WHERE stock_quantity < ANY ( SELECT AVG(stock_quantity) FROM products GROUP BY category_id ); ``` 4. **表子查询**: 表子查询返回多行多列的结果集,在FROM子句中作为临时表使用。这允许你进行复杂的连接和聚合操作。例如,查询没有订单的客户: ```sql SELECT c.customer_id, c.name FROM customers c LEFT JOIN ( SELECT customer_id FROM orders ) o ON c.customer_id = o.customer_id WHERE o.customer_id IS NULL; ``` #### 9.5.3 子查询的使用场景 1. **数据筛选**: 利用子查询在WHERE子句中进行数据筛选,如前面薪资高于平均水平的例子。 2. **计算字段**: 子查询还可以用于SELECT列表中,作为计算字段的一部分。例如,计算员工薪资相对于部门平均薪资的百分比。 3. **数据插入**: 在INSERT语句中使用子查询,可以从一个表中选取数据并插入到另一个表中。 4. **数据更新**: 在UPDATE语句中,子查询可以用来确定哪些行需要更新以及更新为哪些值。 5. **数据删除**: 在DELETE语句中,子查询可以指定哪些行应该被删除,特别是在需要基于复杂条件删除行时。 6. **存在性检查**: 使用EXISTS操作符与子查询结合,可以检查子查询是否返回至少一行数据,常用于优化查询性能。 #### 9.5.4 子查询的性能优化 虽然子查询提供了强大的灵活性,但它们也可能导致查询性能下降,尤其是当子查询在大型数据集上执行时。以下是一些优化子查询性能的建议: 1. **避免在SELECT列表、ORDER BY或GROUP BY子句中使用子查询**:这些位置的子查询可能会被多次执行,影响性能。 2. **使用JOIN代替子查询**:当可能时,使用JOIN替代子查询可以提高性能,因为JOIN可以更有效地利用索引和查询优化器。 3. **使用EXISTS代替IN**:在检查存在性时,EXISTS通常比IN更高效,因为EXISTS在找到第一个匹配项时就会停止搜索。 4. **确保子查询被正确索引**:如果子查询涉及大量数据,确保相关列被索引可以显著提高性能。 5. **限制子查询的结果集大小**:尽量通过WHERE子句限制子查询的结果集大小,以减少处理时间和内存消耗。 6. **分析执行计划**:使用EXPLAIN或类似工具分析子查询的执行计划,查找潜在的性能瓶颈。 #### 9.5.5 示例总结 通过本章的学习,我们了解了子查询的基本概念、类型、使用场景以及性能优化技巧。子查询是SQL中一项强大的功能,允许我们以灵活的方式构建复杂的查询。然而,它们也可能对性能产生负面影响,因此在实际应用中需要根据具体情况权衡利弊,选择最优的解决方案。无论是数据筛选、计算字段、数据插入、更新还是删除,子查询都能提供有力的支持,帮助我们更高效地管理和操作数据库数据。
上一篇:
9.4.3 复合条件连接查询
下一篇:
9.5.1 带IN关键字的子查询
该分类下的相关小册推荐:
MySQL从入门到精通(二)
MySQL8.0入门与实践
MySQL从入门到精通(四)
MySQL 实战 45 讲
MySQL从入门到精通(五)
细说MySQL(零基础到高级应用)
MySQL必会核心问题
MySQL从入门到精通(一)
SQL零基础到熟练应用(增删改查)