sqlserver 高级查询(SQL Server2019数据库之简单子查询的具有方法)
sqlserver 高级查询
SQL Server2019数据库之简单子查询的具有方法子查询可以完成 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 组合起来作为一个子查询。
子查询是 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 语句,如下图所示:
聚合函数 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子查询内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- mybatissql解析(mybatis动态sql常用场景总结)
- sql数据库查询优化(数据库SQL语句优化总结收藏)
- mysql完整教程(MySql新手入门的基本操作汇总)
- 查询SQL SERVER中某个数据库的每个表的数据量和每行记录所占用空间
- mysqlset用法(mysql descDESCRIBE命令实例讲解)
- linq to sql 中Concat、Union、Intersect、Except
- sql server语法大全(SQL Server 全文搜索功能介绍)
- mysql索引应该注意的地方(关于MySQL索引知识的小妙招)
- sqlserver序列可以自定义(sql server 自定义分割月功能详解及实现代码)
- sql server清理日志(SQL Server 2008 清空删除日志文件瞬间缩小日志到几M)
- sql怎么写递归(sql server实现递归查询的方法示例)
- windowsmysql服务在哪里(解决windows service 2012阿里云服务器在搭建mysql时缺少msvcr100.dll文件的问题)
- mysql 分库分表步骤(MySQL读多写少设计方案 - 分库分表还能这么做?)
- sqlserver2012tcpip配置(Sql Server2012 使用IP地址登录服务器的配置图文教程)
- mysql权限收回(MySQL如何利用DCL管理用户和控制权限)
- mysql执行计划详细解读(详解MySQL的Seconds_Behind_Master)
- 我们现在吃的苹果是哪里来的 原来现代苹果引入中国仅有一百多年(我们现在吃的苹果是哪里来的)
- 买绿宝不能只挑黄绿色 菜农教你3招挑,个个皮薄肉脆,香甜爆汁(买绿宝不能只挑黄绿色)
- 大果肉搭配薄瓜皮, 绿宝 脆甜爽口,不愧是甜瓜中的 佼佼者(大果肉搭配薄瓜皮)
- 河南尉氏县因地制宜发展果蔬种植 水坡镇绿宝甜瓜变 金瓜(河南尉氏县因地制宜发展果蔬种植)
- 谢广坤,你这么欺负谢腾飞,良心不会痛吗(你这么欺负谢腾飞)
- 乡村爱情15 宋晓峰怀疑自己孩子,腾飞与姜奶奶亲子鉴定出结果(宋晓峰怀疑自己孩子)
热门推荐
- css继承属性有哪些(CSS特殊性、继承与层叠)
- php图片合成处理(PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例)
- dedecms标签怎么用(dedecms 添加字段后软件列表页无法调用软件大小问题的解决方法)
- dedecms中如何设置推荐文章(实现dedecms友情链接分栏目调用的方法图)
- laravel自定义使用方法(laravel 修改.htaccess文件 重定向public的解决方法)
- idea激活服务器(搭建本地的idea激活服务器的详细教程)
- laravel有哪些长期支持版本(Laravel中9个不经常用的小技巧汇总)
- sqlserver安装与使用教程(SQL Server 2017 Developer的下载、安装、配置及SSMS的下载安装配置图文教程详解)
- mysql数据表实例教程(mysql数据库入门第一步之创建表)
- numpy如何创建数组(NumPy 数组使用大全)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9