首页
技术小册
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的广阔世界中,子查询作为一种强大的工具,极大地丰富了SQL语句的表达能力。标量子查询,作为子查询的一种特殊形式,其返回结果是一个单一的值(如数字、字符串等),而非结果集或表。这种特性使得标量子查询在数据检索、条件判断、字段赋值等多种场景下发挥着不可替代的作用。本章将深入探讨标量子查询在SQL语句中的书写位置及其应用,帮助读者更好地理解和运用这一高级特性。 #### 一、引言 标量子查询的书写位置灵活多变,几乎可以出现在SQL语句的任何需要单一值作为输入或输出的地方。它们不仅简化了复杂的查询逻辑,还提高了SQL语句的可读性和可维护性。掌握标量子查询的正确书写位置,对于编写高效、清晰的SQL代码至关重要。 #### 二、在SELECT子句中使用标量子查询 **1. 直接作为字段值** 标量子查询最直接的应用之一就是在SELECT子句中作为字段值返回。这种用法允许我们在查询结果中直接包含通过计算或条件筛选得到的单一值。 ```sql SELECT employee_id, name, (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id) AS avg_salary FROM employees e; ``` 在这个例子中,我们为每位员工查询了其所在部门的平均薪资,并将这个平均薪资作为查询结果的一部分返回。 **2. 在字段表达式中使用** 标量子查询还可以嵌入到SELECT子句中的字段表达式中,用于执行更复杂的计算或逻辑判断。 ```sql SELECT employee_id, name, salary, (SELECT AVG(salary) FROM employees) AS avg_salary_overall, (salary - (SELECT AVG(salary) FROM employees)) AS salary_diff_from_avg FROM employees; ``` 这里,我们计算了每位员工的薪资与全公司平均薪资的差值。 #### 三、在WHERE子句中使用标量子查询 标量子查询在WHERE子句中的应用非常广泛,尤其是在需要基于子查询的结果进行条件筛选时。 **1. 过滤条件** ```sql SELECT employee_id, name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); ``` 此查询返回薪资高于公司平均薪资的所有员工。 **2. 关联子查询** 当子查询中需要引用外层查询的字段时,就形成了关联子查询。这在比较当前行与同一表或不同表中其他行的数据时特别有用。 ```sql SELECT employee_id, name, salary FROM employees e1 WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e2.department_id = e1.department_id); ``` 这里,我们找出了每个部门内薪资高于该部门平均薪资的员工。 #### 四、在HAVING子句中使用标量子查询 虽然HAVING子句主要用于对GROUP BY的结果进行条件筛选,但标量子查询在这里同样可以发挥作用,尤其是在需要基于聚合函数的计算结果进行额外条件判断时。 ```sql SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id HAVING AVG(salary) > (SELECT AVG(salary) FROM employees); ``` 此查询找出了平均薪资高于公司平均薪资的所有部门。 #### 五、在FROM子句中使用标量子查询(作为派生表) 虽然标量子查询本身不直接用在FROM子句中(因为FROM子句期望的是表或表的别名),但我们可以将标量子查询作为SELECT列表的一部分,包裹在子查询(通常称为派生表或内联视图)中,然后在FROM子句中引用这个派生表。 ```sql SELECT * FROM ( SELECT employee_id, name, (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id) AS dept_avg_salary FROM employees e ) AS dept_salary_info WHERE dept_avg_salary > 50000; ``` 在这个例子中,我们创建了一个包含员工信息和其部门平均薪资的派生表,然后基于这个派生表筛选出了部门平均薪资高于50000的员工。 #### 六、在INSERT、UPDATE、DELETE语句中使用标量子查询 **INSERT** 标量子查询可以在INSERT语句的VALUES部分使用,用于插入基于查询结果的单一值。 ```sql INSERT INTO summary_table (department_id, avg_salary) SELECT department_id, AVG(salary) FROM employees GROUP BY department_id; ``` 虽然这个例子本身不是直接使用标量子查询插入单一值,但它展示了如何通过子查询生成用于插入的数据。 **UPDATE** 在UPDATE语句中,标量子查询可以用来为表中的行设置新的值,这些值基于其他行的数据或计算结果。 ```sql UPDATE employees SET bonus = salary * 0.1 WHERE salary > (SELECT AVG(salary) FROM employees); ``` 这个例子为薪资高于公司平均薪资的员工设置了10%的奖金。 **DELETE** DELETE语句中的标量子查询主要用于指定哪些行应该被删除,但通常更常见于关联子查询的上下文中。 ```sql DELETE FROM employees WHERE employee_id NOT IN ( SELECT employee_id FROM projects WHERE project_status = 'Active' ); ``` 虽然这个例子使用了IN子句和子查询列表而非标量子查询,但它展示了如何通过子查询来决定哪些记录应该被删除。 #### 七、结论 标量子查询以其灵活性和强大的功能,在SQL语句的多个位置发挥着重要作用。无论是在SELECT子句中进行数据计算和展示,还是在WHERE、HAVING子句中作为条件筛选的依据,亦或是在INSERT、UPDATE、DELETE语句中用于数据的插入、更新和删除,标量子查询都是SQL编程中不可或缺的一部分。掌握标量子查询的正确书写位置和应用场景,对于提高SQL查询的效率和准确性至关重要。希望本章内容能够帮助读者更好地理解和运用标量子查询,从而编写出更加高效、优雅的SQL代码。
上一篇:
标量子查询
下一篇:
使用标量子查询时的注意事项
该分类下的相关小册推荐:
PostgreSQL入门教程
SQL基础教程(上)
高性能的Postgres SQL
SQL基础教程(下)