数据库中暂时表,表变量和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 #tmpTable
FROM Orders O JOIN Employees E ON O.EmployeeID=E.EmployeeID
WHERE 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_NAME
AS
(
SELECT E.EmployeeID,E.FirstName,E.LastName,O.OrderID,O.CustomerID,O.OrderDate
FROM Orders O JOIN Employees E ON O.EmployeeID=E.EmployeeID
WHERE E.EmployeeID=1
)
SELECT * FROM CTE_NAME
CTE最强大之处在于递归查询,如要细致研究能够參考微软的文章.
数据库中暂时表,表变量和CTE使用优势极其差别的更多相关文章
- SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FR ...
- 怎样用SQL语句查询一个数据库中的所有表?
怎样用SQL语句查询一个数据库中的所有表? --读取库中的所有表名 select name from sysobjects where xtype='u'--读取指定表的所有列名select nam ...
- [转]SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FR ...
- SQLSERVER | 查询数据库中所有的表的名字 | 查询数据库中的所有数据库名
SQLSERVER 1.查询某个数据库中所有的表名: SELECT Name FROM SysObjects Where XType='U' ORDER BY Name 2.查询数据库中的所有数据库 ...
- sql 2000以及2005以上获取数据库中所有的表(不包括系统表)
---------------------------------------------------------------------------- --sql 2005以上数据库 --- 获取数 ...
- 对SharePoint 2007数据库中一些数据表的使用
转:http://blog.csdn.net/ma_jiang/article/details/6553392 在工作中接触了一些SharePoint的数据库中的一些表.在此做个总结. 一位高手告诉我 ...
- SQL数据库中把一个表中的数据复制到另一个表中
1.如果是整个表复制表达如下: insert into table1 select * from table2 2.如果是有选择性的复制数据表达如下: insert into table1(colu ...
- Oracle中查询当前数据库中的所有表空间和对应的数据文件语句命令
Oracle中查询当前数据库中的所有表空间和对应的数据文件语句命令 ------------------------------------------------------------------ ...
- sql通过某个字段名找到数据库中对应的表
sql通过某个字段名找到数据库中对应的表 SELECT sb.name FROM syscolumns s JOIN sysobjects sb ON s.id=sb.id WHERE s.name= ...
随机推荐
- 【基础篇】DatePickerDialog日期控件的基本使用(一)
项目步骤: 1.首先在Main.xml布局文件中添加一个Button标签,用来点击显示日期控件,Main.xml内容如下: <RelativeLayout xmlns:android=" ...
- javafx Cursor
public class EffectTest extends Application { ObservableList cursors = FXCollections.observableArray ...
- buffer--cache 详解
- Linux 内建命令和系统命令
shell内建命令是指bash(或其它版本)工具集中的命令.一般都会有一个与之同名的系统命令,比如bash中的echo命令与/bin/echo是两个不同的命令,尽管他们行为大体相仿.当在bash中键入 ...
- [Javascript] Identify the most important words in a document using tf-idf in Natural
Tf-idf, or term frequency-inverse document frequency, is a statistic that indicates how important a ...
- 结构体类型重声明导致的bug一个
bug前提条件 当模块比較多.头文件较多,某个结构体类型会在当前模块中又一次声明进而引用其成员,而不直接包括其它模块的头文件. 这种优点是不引入不须要的类型声明到此模块.头文件包括的交叉:坏处是,添加 ...
- js34
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- Angular:内置指令
[ngIf]表达式结果为真,显示元素:表达式结果为假,移除元素. <div *ngIf="a > b"></div> [ngSwitch]对表达式进行 ...
- layui中select的注意
假如不在select 标签里面加上过滤lay-filter 那么你就算怎么绑定事件都是没有任何效果 页面上代码 js文件:
- 读书笔记-Java设计模式
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Java的封装性很好,拿访问控制符来讲,没有权限的类或方法是不能访问的.如public,都可访问:p ...