]])
语法规则:
子查询的 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;
查询结果如下图所示:

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='蓝月亮');
查询结果如下图所示:

由于子查询只能返回一个值,因此,如果子查询的结果不是返回单个值,那么系统就会发出错误信息。
SELECT cat_id, goods_name
FROM goods
WHERE cat_id>(SELECT * FROM brand WHERE name='蓝月亮');
执行该 SQL 语句,如下图所示:

子查询中不能包含 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 语句,如下图所示:

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);
查询结果如下图所示:

小结:本章讲解了子查询的简单用法。子查询是 SELECT 语句内的另外一条 SELECT 语句,也被称为 SQL 查询的嵌套。在实际开发中,一条 SQL 语句中不要嵌套太多子查询,否则会降低系统效率,影响代码的可读性。
到此这篇关于SQL Server2019数据库之简单子查询的具有方法的文章就介绍到这了,更多相关SQL Server2019子查询内容请搜索每日运维以前的文章或继续浏览下面的相关文章希望大家以后多多支持每日运维!
相关推荐
ASP.NET调用Oracle存储过程的实现方法 在ASP.NET中,调用Oracle存储过程是非常常见的操作。这种方式不仅可以提高系统的性能,还可以增强系统的安全性。本文将介绍如何在ASP.NET中调用Oracle存储过程。 1.准备工作 在使用ASP.NET调用Oracle存储过程前,需要先引用Oracle.DataAccess类库。该类库在Oracle官网上提供了下载,下载地址为:https
工商银行计划迁移MySQL数据库 工商银行是中国五大银行之一,也是全球最大的银行之一。最近,工商银行宣布了计划迁移其数据库系统,从Oracle数据库迁移到MySQL数据库。 MySQL数据库的优势 MySQL是一种开源数据库,具有高性能、可扩展性和可靠性等众多优点。而Oracle数据库则价格昂贵,所以工商银行选择迁移到MySQL数据库是出于成本考虑,同时也能够满足其业务需求。 迁移的挑战 尽管My
MySQL时间戳的作用及实际应用案例分析 时间戳(Timestamp)在MySQL数据库中是一种非常重要且常用的数据类型,用于存储日期和时间信息。它能够记录数据的创建时间、修改时间等关键信息,对于数据的追踪、分析和管理都具有重要意义。本文将介绍MySQL时间戳的作用,并通过实际应用案例分析其具体用法,同时提供代码示例以便读者更好地理解。 一、MySQL时间戳的作用 记录数据的创建时间和修改时间:使
这篇文章主要介绍了怎么使用PHP实现数据库负载均衡扩容的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用PHP实现数据库负载均衡扩容文章都会有所收获,下面我们一起来看看吧。 准备环境 在进行数据库负载均衡扩容之前,需要先确保自己拥有足够的服务器数量和硬件配置。建议将负载均衡器和数据库服务器分开,以避免单点故障的发生。为了实现扩容,需要对服务器进行网络设定和硬件配置
InnoDB页 InnoDB是一个将数据存储到磁盘上的存储引擎,所以就算我们关闭、重启服务器,数据还是存在的。而在真正处理数据的时候是在内存中进行的,所以需要把磁盘中的内容加载到内存中。 我们知道读写磁盘是很慢的。当我们想从表里获取数据的时候,InnoDB会一条一条的从磁盘中读出来吗?不会的!因为那样太慢了。它采取的方式是:将数据划分为若干页,以页做为磁盘和内存交互的基本单位。InnoDB中页的大
回到顶部