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


Posted in SQL Server onApril 27, 2021

子查询可以完成 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 语句中不要嵌套太多子查询,否则会降低系统效率,影响代码的可读性。

到此这篇关于SQL Server2019数据库之简单子查询的具有方法的文章就介绍到这了,更多相关SQL Server2019子查询内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
SQL Server 数据库实验课第五周——常用查询条件
Apr 05 SQL Server
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
SQL SERVER中常用日期函数的具体使用
Apr 08 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
使用SQL实现车流量的计算的示例代码
Feb 28 SQL Server
SQL Server Agent 服务无法启动
Apr 20 SQL Server
SQL Server中锁的用法
May 20 SQL Server
SQL Server中的逻辑函数介绍
May 25 SQL Server
详解SQL报错盲注
Jul 23 SQL Server
SqlServer常用函数及时间处理小结
May 08 SQL Server
SQL Server中交叉联接的用法详解
SqlServer 垂直分表(减少程序改动)
Apr 16 #SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
SQLServer2008提示评估期已过解决方案
SQLServer2019 数据库的基本使用之图形化界面操作的实现
SQLServer2019 数据库环境搭建与使用的实现
SQLServer 日期函数大全(小结)
Apr 08 #SQL Server
You might like
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
lnmp安装多版本PHP共存的方法详解
2018/08/02 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
js活用事件触发对象动作
2008/08/10 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
node简单实现一个更改头像功能的示例
2017/12/29 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
2018/08/08 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
python验证身份证信息实例代码
2019/05/06 Python
python 中如何获取列表的索引
2019/07/02 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
美国中小型企业领先的办公家具供应商:Office Designs
2016/11/26 全球购物
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
前台接待岗位职责
2013/12/03 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
银行求职信模板
2015/03/20 职场文书
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL