入门心法:要练此功,先废其功。(先忘记已学的其他语言,用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;
网友评论