【Microsoft SQL Server 2008 技术内幕:T-SQL语言基础】三、表表达式

sql2008 t-sql

[b][size=large]Sql Server四种表表达式[/size][/b]
[list]
[*]派生表:derived table. from子句中的嵌套子查询
[*]视图:view
[*]通用表表达式:CTE, common table expression
[*]内联表值函数:intline TVF, inline table-valued function
[/list]
[b][size=large]通用表表达式CTE[/size][/b]

[b]CTE (Sql2005中引入)[/b]
[list]
[*]使用WITH子句定义,WITH后跟CTE名称(别名)
[*]外部查询完成时,生命期结束
[*]由于WITH子句有不同意义,容易引入歧义,所以建议CTE语句中明确地使用分号
[*]因为没有物化的存在,通常对性能没有任何影响
[/list]
-- CTE, definition
with C1(orderyear, custid) as (
select year(orderdate), CustomerID
from SalesLT.SalesOrderHeader
),
C2 as (
select orderyear, count(DISTINCT custid) as numcusts
from C1
group by orderyear
)
select orderyear, numcusts
from C2
where numcusts > 30;


[b]CTE的多引用[/b]
[list]
[*]相对于派生表,因为CTE先于from子句定义,因此可以引用同一CTE的多个实例。
[*]避免了像派生表那样需要维护多个子查询的副本
[/list]
-- CTE, multi-reference
with YearlyCount as (
select YEAR(orderdate) as orderyear
, COUNT(distinct customerID) as numcusts
from SalesLT.SalesOrderHeader
group by YEAR(OrderDate)
)
select Cur.orderyear
, Cur.numcusts as CurNumCusts
, Prv.numcusts as PrvNumCusts
, Cur.numcusts - Prv.numcusts as Growth
from YearlyCount as Cur
left join YearlyCount as Prv
on Cur.orderyear = Prv.orderyear + 1

[b]CTE的递归[/b]
[list]
[*]基本语法同CTE的一般定义。WITH内定义的查询将作为定位成员(anchor member),它只会被调用一次,返回“第一个”前一个结果集
[*]WITH定义内部须再添加UNION ALL关键字和一个递归查询成员(recursive member)。递归成员被调用多次,直到递归结束
[*]递归成员通过引用CTE名称达到递归的目的
[*]两个查询成员必须保持列个数和数据类型的兼容性
[*]外部查询中对CTE名称的引用表示对该递归查询结果集的引用
[*]为避免递归出现死循环,Sql server设置了最大递归次数为100,超过100时会自动终止。
[*]通过在外部查询的最后指定“OPTION MAXRECURSION n”改变该限制(n=0时取消限制)
[/list]
-- CTE, Recursive
WITH CategoryCTE([ParentProductCategoryID], [ProductCategoryID], [Name]) AS (
-- anchor member, executed only in the beginning
SELECT [ParentProductCategoryID], [ProductCategoryID], [Name]
FROM SalesLT.ProductCategory
WHERE ParentProductCategoryID IS NULL
UNION ALL -- to union all recursive query results
-- recursive member
SELECT C.[ParentProductCategoryID], C.[ProductCategoryID], C.[Name]
FROM SalesLT.ProductCategory AS C
INNER JOIN CategoryCTE AS BC
ON BC.ProductCategoryID = C.ParentProductCategoryID
)
SELECT PC.[Name] AS [ParentProductCategoryName]
, CCTE.[Name] as [ProductCategoryName]
, CCTE.[ProductCategoryID]
FROM CategoryCTE AS CCTE
JOIN SalesLT.ProductCategory AS PC
ON PC.[ProductCategoryID] = CCTE.[ParentProductCategoryID]

[b][size=large]视图属性和选项[/size][/b]
[list]
[*][b]ENCRYPTION[/b]属性:对视图、存储过程、触发器,用户定义函数(UDF)的定义进行加密,从而用sp_helptext和OBJECT_DEFINITION无法获取元数据
[*][b]SCHEMABIDING[/b]属性:指定改属性后,视图所引用的对象无法被删除,被引用的列也不可删除或修改
[*][b]CHECK OPTION[/b]选项:检查以避免通过视图进行的数据修改与当前视图中设置的过滤条件相冲突。
[/list]
ALTER VIEW [SalesLT].[vEnProduct] 
WITH SCHEMABINDING, encryption -- view attributes
AS
SELECT p.[ProductID]
,p.[Name]
,pmx.[Culture]
,pd.[Description]
FROM [SalesLT].[Product] p
INNER JOIN [SalesLT].[ProductModelProductDescription] pmx
ON p.[ProductModelID] = pmx.[ProductModelID]
INNER JOIN [SalesLT].[ProductDescription] pd
ON pmx.[ProductDescriptionID] = pd.[ProductDescriptionID]
WHERE pmx.Culture = 'en' -- this view only contains products for 'en'
WITH CHECK OPTION;
GO

-- Error sample: conflict with CHECK OPTION

-- Can't be changed to other culture other than 'en'
update P
set P.Culture = 'zh'
from SalesLT.vEnProduct as P

-- You can't insert a record without 'en' Culture tagged

[b][size=large]内联表值函数(参数化视图)[/size][/b]
除了支持输入参数以外,其他方面与视图类似,下边是一个例子:
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ufnGetCustomerInformation]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[ufnGetCustomerInformation]
GO
CREATE FUNCTION [dbo].[ufnGetCustomerInformation]
(@CustomerID int) RETURNS TABLE
AS
RETURN (
SELECT
CustomerID,
FirstName,
LastName
FROM [SalesLT].[Customer]
WHERE [CustomerID] = @CustomerID


[b][size=large]APPLY运算符(APPLY opeator)[/size][/b]

[list]
[*]Sql2005引入的非标准运算符
[*]在FROM子句中使用
[*]包括CROSS APPLY和OUTER APPLY两种形式,概念上相似于INNER JOIN和OUTER JOIN。
[/list]
[b]基本原理如下:[/b]
[list]
[*]APPLY运算符以两个输入表为左右参数,其中右表(第二个表),可以是表表达式,通常是派生表或内联表值函数。
[*]CROSS APPLY:把右表应用到左表的每一行,再把结果集组合起来,输出统一的表结果。如果右表为空,则对应的左表行不会输出。
[*]OUTER APPLY:比CROSS APPLY多了一个逻辑处理步骤,标示出让右表为空的左表数据行,输出该行是,右表的列将置为NULL。
[*]出于封装的目的,推荐使用内联表值函数取代派生表作为右表
[/list]
-- Get the first 3 orders of each customer
select C.CustomerID
, A.SalesOrderID
, A.OrderDate
from SalesLT.Customer as C
outer apply (
select top(3) SalesOrderID, OrderDate
from SalesLT.SalesOrderHeader as O
where O.CustomerID = C.CustomerID
order by OrderDate desc, SalesOrderID desc
) as A
order by C.CustomerID
### 回答1: "Microsoft SQL Server 2008技术内幕: T-SQL查询源码" 是一本关于SQL Server 2008中T-SQL查询的技术书籍。该书深入探讨了SQL Server 2008的查询引擎和T-SQL语言的内部工作原理。 T-SQLSQL Server的编程语言,用于编写查询和操作数据库的指令。书中通过分析T-SQL查询的源代码,揭示了SQL Server 2008的查询引擎是如何解析和执行查询的。读者可以深入了解查询处理器的内部机制,包括查询优化、查询重写、查询执行计划等方面。 通过阅读这本书,读者可以学习到优化T-SQL查询的技巧和策略。了解查询优化器的工作原理可以帮助开发人员编写高效的查询,提高系统的性能和响应速度。此外,书中还介绍了T-SQL查询的执行计划,帮助读者理解查询的执行方式和流程。 除了T-SQL查询的源码解析外,这本书还涵盖了SQL Server 2008的其他关键技术。读者将了解到索引、数据访问方法、事务处理和并发控制等方面的知识。这将帮助开发人员合理设计数据库架构,提高系统的稳定性和可扩展性。 总之,"Microsoft SQL Server 2008技术内幕: T-SQL查询源码"是一本有关SQL Server 2008查询引擎和T-SQL语言的深度技术书籍。它提供了对查询处理器的全面理解,并帮助读者优化T-SQL查询、提高系统性能。同时,它还涵盖了SQL Server 2008的其他关键技术,提供了全面的数据库开发和管理指导。 ### 回答2: Microsoft SQL Server 2008是一款常用的关系型数据库管理系统,具有强大的数据存储和查询能力。T-SQLSQL Server的一种查询语言,通过编写T-SQL查询语句,可以对数据库中的数据进行查询、筛选和排序等操作。 T-SQL查询的源码指的是SQL Server内部实现这些查询的代码。通过查看T-SQL查询的源码,可以深入了解SQL Server的执行机制,帮助我们更好地优化查询性能和进行调试。 查询的源码包括了SQL Server的执行引擎、查询优化器和存储引擎等多个模块的代码。这些源码使用C++等编程语言编写,属于SQL Server的核心代码部分。通过分析源码,我们可以了解SQL Server是如何解析T-SQL查询语句、生成执行计划和执行查询的过程。同时,源码中还包含了一些关键算法和数据结构的实现细节,这对于我们理解SQL Server的内部机制非常有帮助。 然而,由于SQL Server的源码属于Microsoft的商业机密,一般用户无法直接获取到完整的源码。只有Microsoft的工程师和合作伙伴才能访问和修改源码。但是,Microsoft会通过提供一些加密的DLL文件和一些公开的接口,让用户能够使用和扩展SQL Server的功能。 总的来说,虽然我们无法直接查看SQL Server 2008的T-SQL查询源码,但是通过学习SQL Server的文档和使用工具,我们仍然能够深入了解SQL Server的内部机制,并优化我们的查询性能。 ### 回答3: Microsoft SQL Server 2008是一种关系型数据库管理系统,它为用户提供了一个强大的平台来存储、管理和检索数据。T-SQL(Transact-SQL)是SQL Server的查询语言,用于编写存储过程、触发器、视图和其他数据库对象的脚本。 要查询T-SQL源码,可以参考以下步骤: 1. 首先,确保已经安装了SQL Server Management Studio(SSMS),它是一个图形化界面的工具,用于与SQL Server进行交互。 2. 打开SSMS,并连接到SQL Server 2008数据库实例。 3. 在“对象资源管理器”中,展开“数据库”节点,找到包含要查询的T-SQL脚本的数据库。 4. 右键单击该数据库,选择“新建查询”或使用快捷键“Ctrl+N”创建一个新查询窗口。 5. 将要查询的T-SQL脚本复制并粘贴到查询窗口中。确保脚本是有效的,并且已经被正确地复制到查询窗口中。 6. 单击查询窗口工具栏上的“执行”按钮或使用快捷键“F5”来执行查询。 7. 执行查询后,将在结果窗口中显示查询的结果。结果包括与T-SQL脚本相关的数据,如行数、列名和结果集。 通过这些步骤,您可以轻松地查询T-SQL源码,并查看与之相关的数据。这是一种方便的方法,可以帮助开发人员和数据库管理员更好地理解和管理SQL Server 2008中的查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值