Microsoft SQL SERVER 2008技术内幕 T-

作者: 张中华 | 来源:发表于2017-04-27 16:01 被阅读84次

    入门心法:要练此功,先废其功。(先忘记已学的其他语言,用T-SQL来思考。)
    所需代码:https://github.com/956159241/Microsoft-SQL-Server-2008-T-SQL-Fundamentals

    目录

    第四章 子查询


    第四章 子查询

    4.1 独立子查询

    4.1.1 独立标量子查询
    --返回表中订单ID最大的订单信息
    DECLARE @maxid AS INT = (SELECT MAX(orderid)
                            FROM Sales.Orders);
    SELECT orderid,orderdate,empid,custid
    FROM Sales.Orders
    WHERE orderid =  @maxid;
    

    除了借助变量的方法以外,还可以用嵌入子查询的方法。为此,要把查询中对变量的应用替换为一个标量子查询,由这个子查询来返回最大的订单ID。

    --把查询中对变量的应用替换为一个标量子查询
    SELECT orderid,orderdate,empid,custid
    FROM Sales.Orders
    WHERE orderid = (SELECT MAX(orderid)
                            FROM Sales.Orders);
    

    当使用嵌套写法的时候,对于有效的标量查询,它的返回值不能超多一个

    SELECT orderid
    FROM Sales.Orders
    WHERE empid =
        (SELECT E.empid
        FROM HR.Employees AS E
        WHERE E.lastname LIKE N'D%')
    

    其实,很容易明白的,empid= 这个表达式既然用等于了,怎么可以同时等于两个值呢,如果把 = 换成in应该是可以的。


    4.1.2 独立多值子查询

    如上,使用in这个谓词。

    select n 
    from XXX
    where n between  A
                  and           B
    and  n   not in     C;
    

    4.2 相关子查询

    --相关子查询
    SELECT custid,orderid,orderdate,empid
    FROM Sales.Orders AS O1
    WHERE orderid = 
        (SELECT MAX(O2.orderid)
        FROM Sales.Orders AS O2
        WHERE O2.custid = O1.custid);
    

    不太理解!!!!!!

    4.2.1 EXISTS 谓词
    SELECT custid,orderid,orderdate,empid
    FROM Sales.Orders AS O1
    WHERE orderid = 
        (SELECT MAX(O2.orderid)
        FROM Sales.Orders AS O2
        WHERE O2.custid = O1.custid);
    

    注意:与T-SQL中的大多数谓词不同,EXISTS谓词使用的二值逻辑,而不是三值逻辑。

    4.3 高级子查询

    第五章 表表达式

    5.1 派生表

    派生表(也称为表子查询)是在外部查询的FROM子句中定义的。派生表的存在范围为定义它的外部查询,只要外部查询一结束,派生表也就不存在了。

    SELECT *
    FROM (SELECT custid,companyname,country
        FROM Sales.Customers
        WHERE country = N'USA') AS USACusts;
    
    查询派生表全部信息

    要有效地定义任何类型的表表达式,查询语句必须满足三个要求:

    • 不保证有一定的顺序
    • 所有的列必须有名称
    • 所有的列名必须是唯一的

      一般来说,表表达式既不会对性能产生正面影响,也不会产生负面影响。
      注意:内联别名语法中的AS关键字是可选的;不过,我发现使用AS能用于提高代码的可读性,所以推荐使用它。

    5.2 公用表表达式(CTE)

      公用表表达式(CTE,Common table expression)是个派生表很相似的另一种表达式的表表达式,而且具有一些重要的优势。
      一旦外部查询完成,CTE的生命周期也就结束了。

    WITH USACusts AS
    (
        SELECT custid,companyname,country
        FROM Sales.Customers
        WHERE country = N'USA'
    )
    SELECT * FROM USACusts;
    

    5.3 视图

    5.4 内联表值函数

    5.5 APPLY运算符

    相关文章

      网友评论

        本文标题:Microsoft SQL SERVER 2008技术内幕 T-

        本文链接:https://www.haomeiwen.com/subject/bbmuzttx.html