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%')
2789632-bafa585cfa3c6c75.png

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


2789632-a73534085bda0914.png
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);
2789632-af8253a509636724.png
不太理解!!!!!!
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;
2789632-65561471c7fdcb9a.png
查询派生表全部信息

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

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

  一般来说,表表达式既不会对性能产生正面影响,也不会产生负面影响。
  注意:内联别名语法中的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;
2789632-d5f022388c079e2c.png
5.3 视图
5.4 内联表值函数
5.5 APPLY运算符
2789632-3b18269684ea9294.png
公众号.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值