Microsoft SQL SERVER 2008技术内幕 T-SQL语言基础(中)(学习笔记)

入门心法:要练此功,先废其功。(先忘记已学的其他语言,用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%')
Microsoft SQL SERVER 2008技术内幕 T-SQL语言基础(中)(学习笔记)

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


Microsoft SQL SERVER 2008技术内幕 T-SQL语言基础(中)(学习笔记)
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);
Microsoft SQL SERVER 2008技术内幕 T-SQL语言基础(中)(学习笔记)

不太理解!!!!!!

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;
Microsoft SQL SERVER 2008技术内幕 T-SQL语言基础(中)(学习笔记)
查询派生表全部信息

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

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

  一般来说,表表达式既不会对性能产生正面影响,也不会产生负面影响。
  注意:内联别名语法中的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;
Microsoft SQL SERVER 2008技术内幕 T-SQL语言基础(中)(学习笔记)

5.3 视图

5.4 内联表值函数

5.5 APPLY运算符

Microsoft SQL SERVER 2008技术内幕 T-SQL语言基础(中)(学习笔记)
公众号.png