CTE - 公用表表达式
CTE 代表公用表表达式。它是在 SQL Server 2005 中引入的。它是一个临时结果集,通常可能是复杂子查询的结果。与临时表不同,它的生命周期仅限于当前查询。它是使用 WITH 语句定义的。 CTE 提高了复杂查询和子查询的可读性和易于维护。始终以分号开头 CTE。
With CTE1(Address, Name, Age)--Column names for CTE, which are optional
AS
(
SELECT Addr.Address, Emp.Name, Emp.Age from Address Addr
INNER JOIN EMP Emp ON Emp.EID = Addr.EID
)
SELECT * FROM CTE1 --Using CTE
WHERE CTE1.Age > 50
ORDER BY CTE1.NAME
何时使用 CTE?
这用于存储复杂子查询的结果以供进一步使用。
这也用于创建递归查询。
临时表
在 SQL Server 中,临时表是在运行时创建的,您可以执行在普通表上可以执行的所有操作。这些表是在 Tempdb 数据库中创建的。根据范围和行为,临时表有两种类型,如下所示-
本地临时表
本地临时表仅适用于创建表的 SQL Server 会话或连接(意味着单个用户)。当创建表的会话关闭时,这些会自动删除。本地临时表名以单井号(“#”)开头。
CREATE TABLE #LocalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Shailendra','Noida');
GO
Select * from #LocalTemp
Local temp table 的范围存在于当前用户的当前会话中,即存在于当前查询窗口中。如果您将关闭当前查询窗口或打开一个新的查询窗口并尝试查找上面创建的临时表,则会出现错误。
全局温度表
全局临时表可用于所有 SQL Server 会话或连接(意味着所有用户)。这些可以由任何 SQL Server 连接用户创建,并在所有 SQL Server 连接关闭后自动删除。全局临时表名以双井号(“##”)开头。
CREATE TABLE ##GlobalTemp
(
UserID int,
Name varchar(50),
Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Shailendra','Noida');
GO
Select * from ##GlobalTemp
全局临时表对所有 SQL Server 连接可见,而本地临时表仅对当前 SQL Server 连接可见。
表变量
这就像一个变量,存在于特定批次的查询执行中。一旦它从批次中出来,它就会被丢弃。这也是在 Tempdb 数据库中创建的,但不是在内存中创建的。这也允许您在表变量声明时创建主键、标识而不是非聚集索引。
GO
DECLARE @TProduct TABLE
(
SNo INT IDENTITY(1,1),
ProductID INT,
Qty INT
)
--Insert data to Table variable @Product
INSERT INTO @TProduct(ProductID,Qty)
SELECT DISTINCT ProductID, Qty FROM ProductsSales ORDER BY ProductID ASC
--Select data
Select * from @TProduct
--Next batch
GO
Select * from @TProduct --gives error in next batch
注意
临时表是在 Tempdb 数据库中物理创建的。这些表充当普通表,也可以像普通表一样有约束、索引。
CTE 是一个命名的临时结果集,用于操作复杂的子查询数据。这存在于声明的范围内。这是在内存而不是 Tempdb 数据库中创建的。您不能在 CTE 上创建任何索引。
表变量就像一个变量,存在于特定批次的查询执行中。一旦它从批次中出来,它就会被丢弃。这也是在 Tempdb 数据库中创建的,但不是在内存中创建的。