SQL Server2019数据库之简单子查询的具有方法

作者:Amo Xiang 时间:2024-01-21 23:27:31 

子查询可以完成 SQL 查询中比较复杂的情况,本章主要介绍一些子查询的简单用法。

一、简单子查询

1、简单子查询

子查询是 SELECT 语句内的另外一条 SELECT 语句。通常,语句内可以出现表达式的地方都可以使用子查询。另外,子查询可以从任何表中提取数据,只要对该表有适当的访问权限即可。因此,通过在一个查询内或者在另一个子查询内嵌套子查询,可以从两个或多个表中组合信息而不必编写复杂的整个组合表,然后再过滤掉多余的或不相关的联合行的JOIN语句。

子查询的语法与普通的 SELECT 查询的语法相同,子查询可以包含联合、WHERE 子句、HAVING 子句和 GROUP BY子句。

1.1 子查询的语法

子查询的语法如下:


(SELECT [ALL | DISTINCT]<select item list>
FROM <table list>
[WHERE<search condition>]
[GROUP BY <group item list>
[HAVING <group by search condition>]])

语法规则:

  • 子查询的 SELECT 查询必须使用圆括号括起来。

  • 不能包括 COMPUTE 或 FOR BROWSE 子句。

  • 如果同时指定 TOP 子句,则可能只包括 ORDER BY 子句。

  • 子查询最多可以嵌套 32 层。

  • 任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。

  • 如果某个表只出现在子查询中而不出现在外部查询中,那么该表中的列就无法包含在输出中。

1.2 子查询常用的语法格式

(1) 第一种语法格式


WHERE 查询表达式 [NOT] IN(子查询)

(2) 第二种语法格式


WHERE 查询表达式 比较运算符 [ANY|ALL](子查询)

(3) 第三种语法格式


WHERE [NOT] EXISTS(子查询)

1.3 子查询与其他 SELECT语句之间的区别

子查询除了必须在括号中出现以外,与其他 SELECT 语句之间还有以下几点不同。

  • SELECT 语句只能使用那些来自 FROM 子句中的表中的列,子查询不仅可以使用在该子查询的 FROM 子句中的表,而且还可以使用子查询的 FROM 子句中表的任何列。

  • SELECT 语句中的子查询必须返回单一数据列。另外,根据其在查询中的使用方法(如将子查询结果用作包括子查询的 SELECT 子句中的一个数据项),包括子查询的查询可能要求子查询返回单个值(而不是来自单列的多个值)。

  • 子查询不能有 ORDER BY 子句(因为用户看不到返回多个数据值的子查询的结果表,所以对隐藏的中间结果表排序就没有什么意义)。

  • 子查询必须由一个 SELECT 语句组成,也就是不能将多个 SQL 语句用 UNION 组合起来作为一个子查询。

2、SELECT 列表中的子查询

子查询是 SELECT 查询内的返回一个值的表达式,就像返回值中的单个列一样。但是,在一个表达式中,子查询必须只返回一条记录,这样的子查询被称为标量子查询(scalar subquery),也必须被封闭在圆括号内。

【例1】根据图书的作者,获取不同作者编写的图书中价格最高的信息。SQL 语句如下:


SELECT tb_book_author,tb_author_department,
(SELECT MAX(book_price) FROM tb_book
WHERE tb_book_author.tb_book_author = tb_book.tb_book_author) AS 价格
FROM tb_book_author;

查询结果如下图所示:

SQL Server2019数据库之简单子查询的具有方法

3、比较子查询

在 WHERE 子句中可以使用单行比较运算符来比较某个表达式与子查询的结果,可以使用的比较运算符包括:=、>、>=、<、<=、<>(或!=)等。这些比较运算符都可以连接一个子查询,且在使用 ALL 或者 ANY 修饰的比较运算符连接子查询时,必须保证子查询所返回的结果集合中只有单行数据,否则将引起查询错误。

【例2】应用比较运算符 >,查询商品信息表 goods 中 cat_id 的值大于品牌表 brand 中品牌名称为 蓝月亮 的商品信息。SQL 语句如下:


SELECT cat_id, goods_name
FROM goods
WHERE cat_id>(SELECT cat_id FROM brand WHERE name='蓝月亮');

查询结果如下图所示:

SQL Server2019数据库之简单子查询的具有方法

由于子查询只能返回一个值,因此,如果子查询的结果不是返回单个值,那么系统就会发出错误信息。


SELECT cat_id, goods_name
FROM goods
WHERE cat_id>(SELECT * FROM brand WHERE name='蓝月亮');

执行该 SQL 语句,如下图所示:

SQL Server2019数据库之简单子查询的具有方法

子查询中不能包含 ORDER BY 子句,看下面的 SQL 语句:


SELECT cat_id, goods_name
FROM goods
WHERE cat_id>(SELECT cat_id FROM brand WHERE name='蓝月亮' ORDER BY cat_id);

执行该 SQL 语句,如下图所示:

SQL Server2019数据库之简单子查询的具有方法

4、子查询中使用聚合函数

聚合函数 SUM()、COUNT()、MAX()、MIN() 和 AVG() 都返回单个值。在子查询中应用聚合函数,并将该函数返回的结果应用到 WHERE 子句的查询条件中。

【例3】应用聚合函数 AVG(求 emp 员工表中员工的平均工资,并将结果作为 WHERE 子句的查询条件,通过 SQL 语句获取工资大于平均工资的员工信息。SQL 语句如下:


SELECT ename, sal, job
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp);

查询结果如下图所示:

SQL Server2019数据库之简单子查询的具有方法

小结:本章讲解了子查询的简单用法。子查询是 SELECT 语句内的另外一条 SELECT 语句,也被称为 SQL 查询的嵌套。在实际开发中,一条 SQL 语句中不要嵌套太多子查询,否则会降低系统效率,影响代码的可读性。

来源:https://blog.csdn.net/xw1680/article/details/116108496

标签:SQL,Server2019,子查询
0
投稿

猜你喜欢

  • Python paramiko模块使用解析(实现ssh)

    2021-02-03 10:29:26
  • 利用python爬取软考试题之ip自动代理

    2023-01-30 01:17:28
  • Internet Explorer 8 Beta2 功能预览

    2008-07-29 13:20:00
  • 如何利用SysOjects来获知数据库的信息?

    2010-01-01 15:43:00
  • asp fso创建与删除文件与文件夹

    2008-12-31 16:07:00
  • MySQL学习之基础操作总结

    2024-01-12 14:42:34
  • Python监听键盘和鼠标事件的示例代码

    2022-06-14 07:05:23
  • 浅谈php自定义错误日志

    2023-11-14 10:59:40
  • 09七夕节各大搜索引擎LOGO欣赏

    2009-08-27 15:34:00
  • Python创建对称矩阵的方法示例【基于numpy模块】

    2021-01-03 07:35:59
  • python 文本单词提取和词频统计的实例

    2022-10-25 04:53:03
  • 简单的水果风暴的算法过程

    2009-12-13 15:49:00
  • 通过Python pyecharts输出保存图片代码实例

    2021-09-14 22:26:11
  • Python Type Hints 学习之从入门到实践

    2022-10-05 15:53:54
  • 使用beaker让Facebook的Bottle框架支持session功能

    2023-07-01 02:35:35
  • 深入了解Python中的变量

    2022-03-15 06:31:24
  • python排序方法实例分析

    2023-04-07 12:52:05
  • Python函数式编程中itertools模块详解

    2022-08-28 20:16:53
  • Python协程实践分享

    2023-09-01 05:50:51
  • python生成器的使用方法

    2021-12-03 22:40:49
  • asp之家 网络编程 m.aspxhome.com