zoukankan      html  css  js  c++  java
  • 《SQL Server 2012 T-SQL基础》读书笔记

    Chapter 4 Subqueries

    子查询分为:独立子查询(Self-Contained Subqueries)和相关子查询(Correlated Subqueries),独立子查询可以单独拿出来执行,相关子查询可以理解为对外部查询的每一行都执行一遍内部子查询。

    EXISTS谓词接受一个子查询,如果子查询能返回任何行,则返回TRUE,否则返回FALSE(注意到了吗?是two-valued logic)。EXISTS后面用SELECT * 没关系,会被优化掉的。

    返回前一个或者后一个值的解决方法(思想是用“小于当前值的最大值”表示前一个):
    注意以下查询结果中的orderid和prevorderid

    SELECT orderid, orderdate, empid, custid,
      (SELECT MAX(O2.orderid)
       FROM Sales.Orders AS O2
       WHERE O2.orderid < O1.orderid) AS prevorderid
    FROM Sales.Orders AS O1;
    

    结果:

    SQL Server 2012提供了LAG 和LEAD的窗口函数可以达到类似功能。

    利用同样的思想,也可以解决连续聚合(连续聚合是一种对累计数据(通常是按照时间顺序)执行的聚合)。例如:返回累计到当前年份的总订货量,举例如下:

    SELECT orderyear, qty,
      (SELECT SUM(O2.qty)
       FROM Sales.OrderTotalsByYear AS O2
       WHERE O2.orderyear <= O1.orderyear) AS runqty
    FROM Sales.OrderTotalsByYear AS O1
    ORDER BY orderyear;
    

    结果:

    同样,SQL Server 2012提供了聚合功能的窗口函数。

    如果你写了个子查询:

    SELECT custid, companyname
    FROM Sales.Customers
    WHERE custid NOT IN(SELECT O.custid
                        FROM Sales.Orders AS O);
    

    如果子查询查出来的结果集里面至少有一个NULL的话,那么这个整个查询的结果就是空集。最佳实践是对于IN谓词,在子查询的结果最好不要返回NULL,或者说在子查询里用WHERE O.custid IS NOT NULL来显式过滤掉NULL的行,或者说使用EXIST代替IN:

    SELECT custid, companyname
    FROM Sales.Customers AS C
    WHERE NOT EXISTS
      (SELECT *
       FROM Sales.Orders AS O
       WHERE O.custid = C.custid);
    

    在子查询中,如果在子查询的表中找不到子SELECT的列名,就从外部表里找,所以很可能导致错误,比如Orders表里面其实没有shipper_id这个列,只有shipperid:

    SELECT shipper_id, companyname
    FROM Sales.MyShippers
    WHERE shipper_id IN
      (SELECT shipper_id
       FROM Sales.Orders
       WHERE custid = 43);
    

    这样的话,子查询其实变成了相关子查询,子查询中的shipper_id其实是外部表中的列,导致外部表中的每一行都会被返回。
    所以最佳实践是在子查询中为列名加上来源表的别名作为前缀。

  • 相关阅读:
    【OpenJudge 2.5-1792】这绝壁是一道玄学题!【DFS】
    【BZOJ1034】省队选手不务正业打泡泡堂(我也不知道是啥算法)
    文件操作的常用方法和使用
    数据类型所有方法和使用整理之------字典
    数据类型所有方法和使用整理之------列表
    用类的内置方法实现类型检查
    类的内置方法及描述符
    用python实现MRO算法
    RHEL6.5 DHCP服务器搭建
    Python之禅 吾心笃定
  • 原文地址:https://www.cnblogs.com/raytheweak/p/7141106.html
Copyright © 2011-2022 走看看