数据库中暂时表,表变量和CTE使用优势极其差别


1

在写SQL时常常会用到暂时表,表变量和CTE,这三者在使用时各有优势:

1. 暂时表:分为局部暂时表和全局暂时表.

1.1局部暂时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接可见,链接断开则暂时表就自己主动被释放,也能够手动drop table #tmptable

在使用不同的链接同一时候创建同样的暂时表时,互不影响,系统在tempdb中会自己主动附加以特定的session为标识的名字来区分. 经常在SP中使用,把须要操作的数据或者共同的数据取出放在暂时表中,兴许能够进行其它的操作(SELECT,UPDATE,DELETE,DROP等).

能够像创建永久表一样创建暂时表:

CREATE TABLE #tmpTable(ID INT,NAME VARCHAR(10),COMPANY VARCHAR(50))

SELECT * FROM #tmpTable JOIN ...

DROP TABLE #tmpTable

也能够使用INTO创建暂时表,如查询EmployeeID=1的全部订单,放在暂时表中,以备兴许的处理.

SELECT E.EmployeeID,E.FirstName,E.LastName,O.OrderID,O.CustomerID,O.OrderDate INTO #tmpTableFROM Orders O JOIN Employees E ON O.EmployeeID=E.EmployeeIDWHERE E.EmployeeID=1

1.2全局暂时表,创建时以##开头. 在tempdb中存储,对全部的session都可见.

CREATE TABLE ##tmpTable2(ID INT,NAME VARCHAR(20),COMPANY VARCHAR(50))SELECT * FROM ##tmpTable2 JOIN ...

DROP TABLE ##tmpTable2

2.表变量:在内存中存储,比暂时表运行速度快. 在SP或者function越过有效scope之后会自己主动释放,不用显式的写drop.表变量仅仅可用在DML的操作中,会有比較多的限制.

--直接声明表变量DECLARE @varTable TABLE(ID INT,NAME VARCHAR(20),COMPANY VARCHAR(50))

--先创建表类型CREATE TYPE [dbo].[T_TEMP] AS TABLE(ID INT,NAME VARCHAR(20),COMPANY VARCHAR(50))

--在声明表变量DECLARE @varTable T_TEMP

3.CTE(Common Table Expressions)通用表表达:是一个能够由定义语句引用的暂时命名的结果集,在它们的简单形式中,可将 CTE 视为类似于非持续性类型视图的派生表.仅仅须定义 CTE 一次,就可以在查询中多次引用.

WITH CTE_NAMEAS(SELECT E.EmployeeID,E.FirstName,E.LastName,O.OrderID,O.CustomerID,O.OrderDate FROM Orders O JOIN Employees E ON O.EmployeeID=E.EmployeeIDWHERE E.EmployeeID=1)SELECT * FROM CTE_NAME

CTE最强大之处在于递归查询,如要细致研究能够參考微软的文章.

时间: 2024-11-18 05:22:23

数据库中暂时表,表变量和CTE使用优势极其差别的相关文章

数据库中临时表,表变量和CTE使用优势极其区别

1 在写SQL时经常会用到临时表,表变量和CTE,这三者在使用时各有优势: 1. 临时表:分为局部临时表和全局临时表. 1.1局部临时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接可见,链接断开则临时表就自动被释放,也可以手动drop table #tmptable 在使用不同的链接同时创建相同的临时表时,互不影响,系统在tempdb中会自动附加以特定的session为标识的名字来区分. 常常在SP中使用,把需要操作的数据或者共同的数据取出放在临时表中,后续可以进行其他的操作

如何将一个数据库中的一个表复制到另一个数据库中的表中

如何将一个数据库中的一个表复制到另一个数据库中的表中 2013-09-11 17:13匿名 | 浏览 13763 次 如何将一个数据库中的一个表复制到另一个数据库中的表中两个表的列名不同.有知道的么?SQL语句直接导过去.! 2013-09-12 20:26网友采纳 热心网友 如果另一个库中没有同名的表select * into b数据库.dbo.a表 from a数据库.dbo.a表 where 条件 如果是追加到另一个表中inert into b数据库.dbo.a表select * from

sqlserver删除数据库中所有的表

sqlserver删除数据库中所有的表 ------------------------------------------------------------------------------------------- 打开Sql server management studio并新建一个查询,在打开的XXX.SQL文件中输入: exec sp_MSforeachtable @command1='Delete from ?' exec sp_MSforeachtable @command1

mysql5.7基础 查看一个数据库中的所有表

镇场文:       学儒家经世致用,行佛家普度众生,修道家全生保真,悟易理象数通变.以科技光耀善法,成就一良心博客.______________________________________________________________________________________________________ Operating System:UbuntuKylin 16.04 LTS 64bitmysql: Ver 14.14 Distrib 5.7.17, for Linux (

SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称

1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FROM SysObjects Where XType='U' ORDER BY Name 3.查询表结构信息: 1 SELECT (case when a.colorder=1 then d.name else null end) 表名, 2 a.colorder 字段序号,a.name 字段名, 3

C#获取Access数据库中的所有表名和列名

//C#获取Access数据库中的所有表名和列名    string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=E:\report20100819\report20100819.mdb";    OleDbConnection Conn = new OleDbConnection(ConnectionString);    Conn.Open(); DataTable

SQL 中怎么查询数据库中具有的表、存储过程、试图数目、总触发器数、作业数

用户表:select count(*) 总表数 from sysobjects where xtype='u' 刚才那个是用户表,下面这个是系统表加用户表: select count(*) 总表数 from sysobject s where xtype in('u','s') 总视图数:select count(*) 总视图数 from sysobjects where xtype='v' 总存储过程数:select count(*) 总存储过程数 from sysobjects where

统计Sql Server数据库中的每张表的记录数

统计Sql Server数据库中的每张表的记录数 USE JYDB                   -- JYDB为你所在的数据库 GO select b.[name] '表名',max(a.rowcnt) '记录数'   from sysindexes a   join sys.objects b on b.object_id=a.id   where b.type='U'   group by b.[name]

批量删除指定数据库中的指定表

-- ---------------------------------------------------------------------------------------------------------- -- -- 1.查询:得到批量删除指定数据库中的指定表: -- 2.执行:将得到的结果复制下来,再重新执行: -- SELECT CONCAT( 'drop table ', table_name, '; ' ) FROM information_schema. TABLES W