• 《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其实是外部表中的列,导致外部表中的每一行都会被返回。
    所以最佳实践是在子查询中为列名加上来源表的别名作为前缀。

  • 相关阅读:
    vue项目中兼容ie8以上浏览器的配置
    vue项目中event bus的简单使用
    js中的正则表达式小结1
    sourceTree跳过注册
    日期时间格式化
    阿里矢量图标库的使用
    mySql 常用命令
    php 常用的系统函数
    php mySql常用的函数
    php 关于php创建 json文件 和 对文件增删改查 示例
  • 原文地址:https://www.cnblogs.com/raytheweak/p/7141106.html
Copyright © 2020-2023  润新知