首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 数据更新
4-1 数据的插入(INSERT语句的使用方法)
什么是INSERT
INSERT语句的基本语法
列清单的省略
插入NULL
插入默认值
从其他表中复制数据
4-2 数据的删除(DELETE语句的使用方法)
DROP TABLE语句和DELETE语句
DELETE语句的基本语法
指定删除对象的DELETE语句(搜索型DELETE)
4-3 数据的更新(UPDATE语句的使用方法)
UPDATE语句的基本语法
指定条件的UPDATE语句(搜索型UPDATE)
使用NULL进行更新
多列更新
4-4 事务
什么是事务
创建事务
ACID特性
第5章 复杂查询
5-1 视图
视图和表
创建视图的方法
视图的限制① ——定义视图时不能使用ORDER BY子句
视图的限制② ——对视图进行更新
删除视图
5-2 子查询
子查询和视图
子查询的名称
标量子查询
标量子查询的书写位置
使用标量子查询时的注意事项
5-3 关联子查询
普通的子查询和关联子查询的区别
关联子查询也是用来对集合进行切分的
结合条件一定要写在子查询中
第6章 函数、谓词、CASE表达式
6-1 各种各样的函数
函数的种类
算术函数
字符串函数
日期函数
转换函数
6-2 谓词
什么是谓词
LIKE谓词——字符串的部分一致查询
BETWEEN谓词——范围查询
IS NULL、IS NOT NULL——判断是否为NULL
IN谓词——OR的简便用法
使用子查询作为IN谓词的参数
EXIST谓词
6-3 CASE表达式
什么是CASE表达式
CASE表达式的语法
CASE表达式的使用方法
第7章 集合运算
7-1 表的加减法
什么是集合运算
表的加法——UNION
集合运算的注意事项
包含重复行的集合运算——ALL选项
选取表中公共部分——INTERSECT
记录的减法——EXCEPT
7-2 联结(以列为单位对表进行联结)
什么是联结
内联结——INNER JOIN
外联结——OUTER JOIN
3张以上的表的联结
交叉联结——CROSS JOIN
联结的特定语法和过时语法
当前位置:
首页>>
技术小册>>
SQL基础教程(中)
小册名称:SQL基础教程(中)
### 章节标题:标量子查询 #### 引言 在SQL(Structured Query Language,结构化查询语言)的广阔天地中,子查询是构建复杂查询、实现数据间深层交互的重要工具。根据子查询返回结果的不同,它们可以大致分为标量子查询、列子查询、行子查询和表子查询。本章将深入探讨标量子查询(Scalar Subquery),它是这些类型中最基础也最常用的一种。标量子查询是指返回单一值(通常是数字、字符串等)的子查询,这个值可以在外部查询的SELECT列表、WHERE子句、HAVING子句或任何需要单一值的地方使用。掌握标量子查询,对于提升SQL查询的灵活性和效率至关重要。 #### 1. 标量子查询的基本概念 标量子查询最显著的特点是它仅返回一个值,这个值可以是数字、日期、字符串等。由于返回值的单一性,标量子查询在SQL语句中的位置相对灵活,常用于比较操作、赋值等场景。例如,在SELECT列表中,标量子查询可以用来计算每个员工薪资相对于公司平均薪资的倍数;在WHERE子句中,它可以用来筛选出满足特定条件的记录,如找出库存量低于平均库存量的产品。 #### 2. 使用场景示例 ##### 2.1 SELECT列表中的应用 **示例1:计算薪资倍数** 假设我们有一个员工表`employees`,包含字段`id`(员工ID)、`name`(姓名)和`salary`(薪资)。我们想要计算每位员工的薪资是公司平均薪资的多少倍。 ```sql SELECT name, salary, (salary / (SELECT AVG(salary) FROM employees)) AS salary_multiple FROM employees; ``` 在这个例子中,`(SELECT AVG(salary) FROM employees)`就是一个标量子查询,它计算了公司所有员工的平均薪资,然后在外层查询中用于计算每位员工的薪资倍数。 ##### 2.2 WHERE子句中的应用 **示例2:找出高于平均薪资的员工** 继续使用上述的`employees`表,如果我们想要找出薪资高于公司平均薪资的员工,可以这样做: ```sql SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 这里,标量子查询同样用于计算平均薪资,但这次是在WHERE子句中作为比较条件使用。 ##### 2.3 HAVING子句中的应用 虽然HAVING子句主要用于对聚合函数的结果进行过滤,但标量子查询同样可以在其中发挥作用,特别是在需要对分组后的数据进行更复杂的条件判断时。 **示例3:按部门分组,找出平均薪资高于公司平均薪资的部门** 假设`employees`表还包含`department_id`(部门ID)字段,以及一个部门表`departments`包含`id`和`name`字段。 ```sql SELECT d.name AS department_name, AVG(e.salary) AS average_salary FROM employees e JOIN departments d ON e.department_id = d.id GROUP BY d.id, d.name HAVING AVG(e.salary) > (SELECT AVG(salary) FROM employees); ``` 在这个例子中,标量子查询再次用于计算公司平均薪资,但这次是在HAVING子句中,作为分组后平均薪资的比较基准。 #### 3. 注意事项与优化 ##### 3.1 性能考虑 虽然标量子查询提供了极大的灵活性,但在某些情况下,如果不加注意,可能会导致查询性能下降。特别是当子查询在外部查询的每一行上都被执行时(即相关子查询),这种重复执行会显著增加数据库的负担。为了提高性能,可以考虑以下几种策略: - **使用临时表或表变量**:将子查询的结果存储到临时表或表变量中,然后在外部查询中引用这个临时结果集。 - **使用JOIN代替子查询**:在某些情况下,通过适当的JOIN操作可以重写查询,避免子查询的重复执行。 - **优化子查询**:确保子查询本身尽可能高效,比如通过索引优化查询条件。 ##### 3.2 嵌套限制 虽然SQL标准对子查询的嵌套深度没有明确限制,但过深的嵌套会使得查询难以理解和维护。因此,在编写包含子查询的SQL语句时,应尽量保持其简洁明了,避免不必要的嵌套。 ##### 3.3 清晰性与可读性 为了提高SQL代码的可读性,建议在复杂的子查询周围使用括号,并在需要时添加注释,解释子查询的目的和逻辑。 #### 4. 进阶应用 标量子查询还可以与其他SQL特性结合使用,以实现更复杂的查询逻辑。例如,在UPDATE语句中使用标量子查询来更新表中的记录;在INSERT语句中,通过标量子查询计算插入值;以及在复杂的CTE(公用表表达式)或WITH子句中,作为构建复杂查询结构的一部分。 #### 结语 标量子查询是SQL中不可或缺的一部分,它以其简洁而强大的特性,在数据处理和查询优化中发挥着重要作用。通过本章的学习,读者应该能够掌握标量子查询的基本概念、使用场景、注意事项以及优化方法,为编写高效、可读的SQL查询打下坚实的基础。未来,无论是在数据分析、数据报表生成还是任何需要SQL技能的场景中,标量子查询都将是你的得力助手。
上一篇:
子查询的名称
下一篇:
标量子查询的书写位置
该分类下的相关小册推荐:
高性能的Postgres SQL
SQL基础教程(上)
SQL基础教程(下)
PostgreSQL入门教程