博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server 子查询解析
阅读量:6694 次
发布时间:2019-06-25

本文共 1873 字,大约阅读时间需要 6 分钟。

SQL支持在查询语句中编写查询,或者嵌套其他查询。最外层查询的结果集会返回给调用者,称为外部查询。内部查询的结果是供外部查询使用的,也称为子查询。内部查询可以取代基于常量或变量的表达式,并在运行时进行计算。与在表达式中使用常量不同的是,子查询的结果可能是变化的,因为被查询的表可能会发生变化。通过使用子查询,可以避免在查询解决方案中把操作分成多个步骤,并在变量中保存中间查询结果的需要。

子查询可以分成独立子查询和相关子查询两类。独立子查询不依赖于它所属的外部查询,而相关子查询则须依赖于它所属的外部查询。子查询可以返回一个单独的值、多个值或整个表结果。

 

一.独立子查询

每个子查询都有所属于的外部查询。 独立子查询是独立于其外部查询的子查询。

•   独立标量子查询

标量子查询是返回单个值的子查询, 而不管它是不是独立子查询。 标量子查询可以出现在外部查询中期望使用单个值的任何地方(WHERE、 SELECT, 等等)。 假设现在要查询数据库中的Orders表, 返回这个表中订单ID最大的订单信息。

 

DECLARE @maxid AS INT= (SELECT MAX(orderid) FROM Sales.Orders);SELECT orderid, orderdate, empid, custid FROM sales.orders WHERE orderid = @maxid

 

除了借助变量的方法以外,还可以用嵌入子查询的方法。

SELECT orderid, orderdate, empid, custid FROM sales.orders WHERE orderid = (SELECT MAX(orderid) FROM Sales.Orders);

•   独立多值子查询

多值子查询是在一个列中返回多个值的子查询, 而不管子查询是不是独立的。一些谓词(例如IN谓词)可以处理多值子查询。 IN谓词的格式可以是:

 

<标量表达式> IN(

 

假设现在要写一个查询语句, 返回由美国客户下的所有订单。 这个语句对 Orders 表进行查询, 返回订单的客户ID在由美国客户的客户 ID组成的集合之内。 最后一部分查询就可以用一个独立的多值子查询来实现 。

SELECT custid, orderid, orderdate, empid FROM Sales.Orders WHERE custid IN  (SELECT c.custid    FROM Sales.Customers AS C     WHERE C.country = N'USA');

 

二.相关子查询

相关子查询是指引用了外部查询中出现的表的列的子查询。这就意味着子查询要依赖于外部查询,不能独立地调用它。在逻辑上,子查询会为每个外部行单独计算一次。例如,下面查询会为每个客户返回其订单ID最大的订单:

 

SELECT custid, orderid, orderdate, empidFROM Sales.Orders AS O1 WHERE orderid =   (SELECT MAX(O2.orderid)   FROM sales.orders AS O2   WHERE O2.custid = O1.custid

 

•   EXISTS谓词

EXISTS谓词输入是一个子查询,如果子查询能够返回任何行,该谓词返回TRUE,否则返回FALSE。

 

SELECT custid, companyname FROM Sales.Customers AS CWHERE country= N'Spain'  AND EXISTS    (SELECT * FROM Sales.Orders AS O    WHERE O.custid = C.custid);

 

 

三.后记

一般情况下,既可以用子查询,又可以用联接来解决的问题。 根据经验来看,没有什么可靠的经验法则可以断定子查询一定就比联接更好。 在一些情况下,数据库引擎对这两种查询的解释是一样的;而在另一些情况下,对二者的解释则是不同的。基于客观条件,可以先用直观的形式写出能解决问题的查询语句;如果对它运行的性能不满意,再尝试重构查询。这样的查询重构可以包括用联接取代子查询, 或者用子查询取代联接。

 

 

好了,本篇文章就介绍到这儿,欢迎大家留言交流;喜欢或有帮助到您的话,点个赞或推荐支持一下!

 

转载于:https://www.cnblogs.com/johnvwan/p/9496493.html

你可能感兴趣的文章
JS异步那些事 二 (分布式事件)
查看>>
技术团队代码管理和部署
查看>>
Swift 项目主管和大家聊了聊 Swift 5,ABI 稳定性最受关注
查看>>
mybatis 插件 flying-清明 发布
查看>>
Java实现excel导入导出学习笔记2 - 利用xml技术设置导入模板,设置excel样式
查看>>
NG-ZORRO-MOBILE 0.11.5 发布,基于 Angular 7 的 UI 组件
查看>>
The Little JavaScript Closures
查看>>
春节快乐!10 场 AI 学术公开课伴你过新年
查看>>
CodeHub#1 回顾 | 敏捷开发与动态更新在支付宝 App 内的实践 ...
查看>>
阿里云图数据库GDB公测,高度连接数据查询效率提升10倍 ...
查看>>
Mysql存储之ORM框架SQLAlchemy
查看>>
45个值得收藏的 CSS 形状
查看>>
Aop说明
查看>>
国外 服务器,阿里云海外服务器-海外节点云服务器全线2折起挺好
查看>>
高仙机器人秦宝星:2019年,服务机器人量产之年
查看>>
企业应用混合云网络解决方案
查看>>
spring boot2 整合(一)Mybatis (特别完整!)
查看>>
如何购买阿里云服务器(ECS)
查看>>
设计模式简介
查看>>
书籍:python网络编程 Python Network Programming - 2019
查看>>