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 相关文章推荐
2021-4-3课程——SQL Server查询【2】
Apr 05 SQL Server
在 SQL 语句中处理 NULL 值的方法
Jun 07 SQL Server
解决sql server 数据库,sa用户被锁定的问题
Jun 11 SQL Server
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
Jun 30 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
SQLServer中exists和except用法介绍
Dec 04 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server携程核心系统无感迁移到MySQL实战
Jun 01 SQL Server
一次SQL查询优化原理分析(900W+数据从17s到300ms)
Jun 10 SQL Server
详解SQL报错盲注
Jul 23 SQL Server
SQL Server中交叉联接的用法详解
SqlServer 垂直分表(减少程序改动)
Apr 16 #SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
SQLServer2008提示评估期已过解决方案
SQLServer2019 数据库的基本使用之图形化界面操作的实现
SQLServer2019 数据库环境搭建与使用的实现
SQLServer 日期函数大全(小结)
Apr 08 #SQL Server
You might like
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
基于element-ui的rules中正则表达式
2018/09/04 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
Python中基本的日期时间处理的学习教程
2015/10/16 Python
Python 的描述符 descriptor详解
2016/02/27 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
2017/08/15 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
英文版银行求职信
2013/10/09 职场文书
中国梦主题教育活动总结
2014/05/05 职场文书
护士实习求职信
2014/06/22 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
信息技术国培研修日志
2015/11/13 职场文书
Python基础之hashlib模块详解
2021/05/06 Python