理解T-SQL:高级查询

1. 子查询

  子查询是嵌套在其它查询中常规的SQL查询,当需要一个Select语句作为数据部分的基础或另一个查询中的条件的要素时,就是创建子查询
  子查询经常满足下列几种需求:
   a. 把一个查询分解成一系列的逻辑步骤
   b. 提供一个列表作为where子句和[IN|EXSITS|ANY|ALL]的目标对象
   c. 提供由父查询中每一条记录驱动的查找
  值得注意的是:大部分子查询可以用联结来表示,在可以使用联结替代子查询的地方 ,联结通常是更可取的选择。

● 嵌套子查询[nested subquery]
   嵌套子查询只朝一个方向进行--要么返回一个用于外部查询的值,要么返回一个与IN运算符一起使用的值的列表。
   用"="运算符时,返回一个值的查询(从一行返回一列), 用"in"运算符时,返回一个列表.
   语法:  Select <Columns> from <Table> where <OneColumn>=(Select <OneColumn> from <OtherTable> where <只返回一行的条件>)
            Select <Columns> from <Table> where <OneColumn> IN (Select <OneColumn> from <OtherTable> where <条件>)
   举例1: 使用单值Select语句的嵌套查询
      假设有两张表:Orders , OrderDetails.
       Orders表中有以下字段:[OrderID],[EmployeeID],[OrderDate],[shippedDate]..
       OrderDetails表中有以下字段: [OrderID],[ProductID],[UnitPrice]..
       现在需要找到OrderDetails表中最早日期的那些订单详细情况.按照一般情况,可以这样做:
          declare @firstDatetime  smallDatetime;
          select @firstDatetime=min(OrderDate) from Orders;   --@fistDatetime是返回的一个值.
          select * from Orders join OrderDetails on Orders.OrderID=OrderDetails.OrderID where OrderDate=@firstDatetime;
      但是,有了查询子句,以上三句话可以合并成一句SQL语句实现:
          select * from Orders join OrderDetails on Orders.OrderID=OrderDetails.OrderID where OrderDate=(select min(OrderDate) from Orders);
   举例2: 使用返回多个值的子查询的嵌套查询
       假设有两张表:Employees , Contact
       Employees包括了以下字段:[EmployeeID],[ConactID], [LogInID],[Title] 用来表示雇员的信息
       Contact包括了以下[ConactID],[FirstName],[LastName]表示人员信息
       假设想得到所有职位为Network Manager的人员的名称,除了可以用联结表示外,也可以用子查询:
        select * from HumanResources.Employee E join Person.Contact C on E.ContactID = C.ContactID where E.Title in (select Title from HumanResources.Employee where Title='Network Manager') 
        当然,以上只是演示技巧,实际的实现用联结来完成比较好:
        select * from HumanResources.Employee E join Person.Contact C on E.ContactID = C.ContactID where E.Title='Network Manager'
      除了使用IN,还匹配符合的记录,还可以使用NOT IN来排除符合的记录:
         select * from HumanResources.Employee E join Person.Contact C on E.ContactID = C.ContactID where E.Title NOT IN (select Title from HumanResources.Employee where Title='Network Manager')

 

● ANY,SOME,ALL运算符
    IN和=运算符都是完全匹配记录的,假设想要做的是不是完全匹配,就可以使用ANY,SOME,ALL运算符
    ANY和SOME功能等同,允许在子查询创建的列表上使用范围更广的其它运算符,如>=,<=,<>,!…
    以>为例,>SOME(<列表项>),意味值大于值中的任何一个,即大于一个最小值,因此>SOME(1,2,3)意味着大于1,如果与=使用,则与IN运算符功能相同
    如果是>ALL(1,2,3),则意味着大于其中的所有值,即大于最大值.

 

2.相关子查询

    相关子查询是那些能够变不可能为可能的事物之一,此外,它经常能把几行代码变成一行,并且常常带来性能提升.相关子查询需要有别于常规的彻底不同的思维方式.
    相关子查询与嵌套子查询不同之处在于:嵌套子查询中,内部查询处理一次,信息被传出用于外部查询.外部的查询也只执行一次. 而相关子查询中,信息是双向进行的.内部查询根据外部查询提供的信息执行,反之亦然.
    相关子查询执行的三个步骤:
       a. 外部查询得到一条记录并传入到内部查询
       b. 内部查询基于传入的值执行
       c. 内部查询从其结果中把值传回到外部查询
  举例: 现有一张Orders表,有以下字段:

OrderID     CustomerID    OrderDate                              Freight
----------- ----------     -----------------------          ---------------------
10248       VINET      1996-07-04 00:00:00.000             32.38
10249       TOMSP      1996-07-05 00:00:00.000           11.61
10250       HANAR      1996-07-08 00:00:00.000           65.83
10251       VICTE      1996-07-08 00:00:00.000            41.34
10252       SUPRD      1996-07-09 00:00:00.000           51.30
10253       HANAR      1996-07-10 00:00:00.000           58.17
10254       CHOPS      1996-07-11 00:00:00.000           22.98
10255       RICSU      1996-07-12 00:00:00.000            148.33
10256       WELLI      1996-07-15 00:00:00.000            13.97
10257       HILAA      1996-07-16 00:00:00.000            81.91
10258       ERNSH      1996-07-17 00:00:00.000           140.51
10259       CENTC      1996-07-18 00:00:00.000           3.25
...
    字段分别表示订单号/客户ID/订购日期/运费
    现在我想要知道每个顾客最早一次订单的OrderID信息.
    如果按照我们的想法,找出所有记录中最早订单是这样子的语句:
          select min(orderDate) from Orders;  -->是所有订单中最早的订单日期,是一个值
    然后,找出每个顾客的最早订单信息:
          select customerID,min(orderDate) from Orders group by customerID;  --以上,Group by语句不能少.是按组进行归纳,得出每个顾客最早的订单日期
    但是,想知道每个顾客最早订单日期的订单号,就没有办法了.使用以下语句是不行的:
          select OrderID,customerID,min(orderDate) from Orders group by customerID; --OrderID不能被customerID进行归纳分组
    所以,解决办法可以使用一个临时表(#MinORderDates),然后分为两个SQL语句,如下:
          select customerID,min(OrderDate) as OrderDate into #MinOrderDates from Orders group by customerID;
         select O.OrderID,O.customerID,O.OrderDate from Orders O join #MinOrderDates M on O.customerID = M.customerID and O.OrderDate=M.OrderDate
     那么,是用相关子查询该怎么解决呢?
        select o1.customerID,o1.OrderID,o1.OrderDate from Orders o1 where o1.orderDate=(select min(o2.orderDate) from Orders o2 where o2.customerID=o1.customerID)
     注意以上语句,子查询中where子句会引用外部查询的表字段.所以,指定别名是必需的.

 

3. SELECT列表子查询

   子查询也能用来在选择结果中提供一种不同类型的答案,这些情形通常出现在要找寻的信息与查询中的其它数据全然不同的时候,(例如,想要在一个字段上进行聚集,却不希望因此而影响返回的其它字段)
   还是像上一节的查询一样,不过这次需要获得customer的LastName,而不是customerID
    select c.LastName  (select MIN(OrderDate) from Orders o where o.customerID=c.customerID) as “OrderDate” from Customers c

转载于:https://www.cnblogs.com/30ErLi/archive/2010/09/17/1829273.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java hdms_字段为clob类型,无法插入数据

public String getHdmsStr() throws SQLException, IOException {if(this.hdms!null){Reader is hdms.getCharacterStream();BufferedReader br new BufferedReader(is);String s br.readLine();StringBuffer sb new StringBuffer();while (s ! null) {// 执行循环将字符串…

谈谈低代码趋势和开发人员的未来

最近的低代码平台很火&#xff0c;不光是大厂在扎堆研发&#xff0c;也有很多创业企业在做&#xff0c;大量的资金投入到这个领域&#xff0c;虽然在软件行业&#xff0c;一直是有这个梦想&#xff08;就是让所有人都可以编程&#xff09;&#xff0c;但忽如一夜春风来&#xf…

java跨库调用存储_存储库仅在第二个调用数据时发送回ViewModel

问题&#xff1a;My Fragment仅在第二次调用时获取数据(例如&#xff0c;当我旋转屏幕时) .在我看来&#xff0c;这些代码行是repo类中的问题&#xff1a;public class UserRepository {private Webservice webservice;// ...public LiveData getUser(int userId) {// This isn…

数据告诉你,抖音是如何在半年之内逆袭的

从春节至今&#xff0c;音乐短视频社区“抖音”在苹果应用商店免费排行榜上连续多天霸榜。凭借多元的音乐风格、酷炫的视觉编辑功能、个性化的分发机制以及良好的社区氛围&#xff0c;抖音在上线不久后便受到了年轻用户的追捧。在这一年半的时间里&#xff0c;抖音到底成长到了…

你是哪种职场性格?

俗话说&#xff0c;性格决定一切。虽然有些言过其实&#xff0c;但在如今的职场上&#xff0c;个人的“职场性格”因素的确非常重要&#xff0c;它决定着你的职场表现&#xff0c;影响着上司对你的看法&#xff0c;左右着你的职业发展。因此&#xff0c;了解自己的“职场性格”…

非名校出身的我,是如何拿到Facebook、谷歌、微软、亚马逊和Twitter的Offer的?

非名校出身&#xff0c;也没有知名科技公司的工作经验&#xff0c;他竟同时拿到了美国5家顶尖科技公司的Offer。他究竟是如何做到的&#xff1f;这篇文章是专门为那些即将开始找工作的人写的。很多正在找工作的人可能会担心因为自己不是毕业于常青藤名校而无法在顶尖科技公司找…

GitLab 服务器的迁移以及注意点

Git 已经是代码托管工具中的主流了&#xff0c;如果是自己搭建私有的 Git 服务器我们一般会使用 GitLab &#xff0c;在《在CentOS7中安装GitLab》 一文中有介绍怎样在 CentOS7 中安装 GitLab 。文本主要介绍怎样迁移 GtiLab 。环境CentOS&#xff1a;7.4GitLab&#xff1a;10.…

java 根据客户端重定向_JavaWeb【1.4HttpServletResponse类、重定向】

HttpServletResponse类、重定向Tomcat服务器每次接收到一个请求都会和HttpServletRequest类一样创建一个HttpServletResponse对象&#xff0c;用来设置给客户端回传的响应信息1.以流的形式向客户端传输数据public class Web06 extends HttpServlet {Overrideprotected void doG…

RHEL5下DNS配置详解3

view 是bind中的另外的一个技巧他在有防火墙的环境中非常有用。View允许你呈现出不同的配置文件给不同的客户&#xff0c;当你的服务器既要给内网的用户又要给外网的用户提供查询服务时使用view将是非常方便的。下其实访问控制列表就是一个有名字的地址匹配列表。它的语法格式为…

百叶窗效果显示图片源码(c#)

2019独角兽企业重金招聘Python工程师标准>>> 显示图片&#xff1a; this.pictureBox.Image Image.FromFile("image.jpg", false); 百叶窗有两种显示效果&#xff0c;一种是垂直百叶窗&#xff0c;另一种是水平百叶窗。 实现百叶窗显示图像有两种方式&…

16个顶级思维模型

思维模型会给你提供一种视角或思维框架&#xff0c;从而决定你观察事物和看待世界的视角。顶级的思维模型能提高你成功的可能性&#xff0c;并帮你避免失败。打造多元思维模型想法来自查理芒格&#xff0c;而查理芒格是沃伦巴菲特的得力助手。Farnam Street曾这样描述思维模型&…

使用BeetleX网关对Web应用进行灰度发布

灰度发布可以更有效地保障服务运作的可靠性&#xff0c;即能让服务得以更新的同时也不影响业务动作。BeetleX网关支持全动态化实时配置&#xff0c;对应用进行灰度发布可以说是非常便利。灰度发布在BeetleX网关中涉及到以下:添加新应用服务&#xff0c;测试路由配置&#xff0c…

SqlException (0x80131904): 将截断字符串或二进制数据。

今天在调试对SQL库的添加时出现了这样的错误&#xff1a; Error! [8152]System.Data.SqlClient.SqlException: 将截断字符串或二进制数据。语句已终止。 at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Sand.WebForm2.Page_Load(Object sender, EventArgs e) in \\…

17道因为太难而被禁用的Google面试题

即使是最成功的公司&#xff0c;它的招聘过程有时也会很不靠谱&#xff0c;经常会出一些奇怪的看似没有答案的面试问题&#xff0c;但标准答案却让应聘者还没来得及接近「起跑线」就被「退赛」了。Google 曾经就是这样的公司&#xff0c;招聘人员会出一些难为应聘者的高质量问题…

在 .NET Core 中构建 REST API

翻译自 Camilo Reyes 2020年8月26日的文章 《Build a REST API in .NET Core》 [1]REST API 可以使用简单的动词&#xff08;如 POST、PUT、PATCH 等&#xff09;将大型解决方案背后的复杂性隐藏起来。在本文中&#xff0c;Camilo Reyes 解释了如何在 .NET Core 中创建 REST AP…

java疯狂讲义内存分配_java疯狂讲义学习:面向对象(上)

5.7.2编写java程序时&#xff0c;引用变量只能调用它编译时类型的方法&#xff0c;不能调用它运行时类型的方法。理解&#xff1a;引用变量只能调用引用变量类型中的方法&#xff0c;不能调用引用变量实际指向对象中“额外”的方法。import static java.lang.System.out;/*** a…

一个检查SPN的小工具

如果大家配过kerberos的话会发现&#xff0c;AD本身并没有一个可以检查SPN的工具&#xff0c;而SPN一旦配重复的话会出现奇怪的错误&#xff0c;所以我就写了这么一个简单的工具。 截图 使用时候&#xff0c;输入你要查询的AD的名称或者IP&#xff0c;然后输入一个该域的用户信…

NLog-ASP.NET Core 5入门

1、创建一个新的ASP.NET Core项目在Visual Studio 2019中。需要版本16.82、手动或使用NuGet在csproj中添加依赖项安装最新版本&#xff1a;NLog.Web.AspNetCore 4.9如有可能&#xff0c;更新NLog软件包在csproj中&#xff1a;<ItemGroup><PackageReference Include&qu…

如果把整个因特网都印出来 你认为会怎么样

2019独角兽企业重金招聘Python工程师标准>>> 如果把整个因特网都印出来的话... 将会用掉 4500 万个墨盒&#xff0c;总计五十万公升的墨水。如果把这些墨水换成燃油&#xff0c;足够让747连飞 18,000 英里&#xff08;28,800 公里&#xff09;&#xff0c;从纽约不降…

用java求直角三角形的面积_JAVA 已知三角形的三个边判断 是否为直角三角形,如果是求面积!...

匿名用户1级2009-03-21 回答你是要java的还是jsp的&#xff1f;给你个jsp的把。。。java的和jsp的差不多。。。主要还是那个求面积的公式(1) (2) (3) (4) (5) 请输入三角形的三个边的长度&#xff0c;输入的数字用逗号分割&#xff1a;(6) (7) (8) (9) (10) (11) (12) String a…