临时表 、with函数

一、临时表

  临时表与实体表类似,只是在使用过程中,临时表是存储在系统数据库tempdb中。当我们不再使用临时表的时候,临时表会自动删除。临时表分为本地临时表和全局临时表。

1、临时表特点

  1)本地临时表就是用户在创建表的时候添加了"#“前缀的表,只有创建本地临时表的数据库连接有表的访问权限,其它连接不能访问该表
  2)全局临时表是用户在创建表的时候添加”##"前缀的表,其特点是所以数据库连接均可使用该全局临时表,当所有引用该临时表的数据库连接断开后自动删除。
  全局临时表相比本地临时表,命名上就需要注意了,与本地临时表不同的是,全局临时表名不能重复。

2、本地临时表

以Customers表为实例,表数据如下:
临时表 、with函数_第1张图片
新建临时表

SELECT * INTO #Customers FROM Customers

SELECT * FROM #Customers  #查询临时表#Customers的数据 与上表一致

如果我们再打开一个页面,同样查询#Customers表,得到的结果如下:
在这里插入图片描述
说明本地临时表不支持跨连接查询。只能在当前连接(或者当前查询页面)访问。

3、全局临时表

SELECT * INTO ##Customers FROM Customers 

SELECT * FROM ##Customers

执行完上面的查询语句后,我们关掉查询页面,再重新开一个页面查询##Customers中的内容不会报错

4、临时表用途

临时表的优化一般使用在子查询较多的情况下,也称为嵌套查询。

二、with函数

--复杂的查询可以通过with函数构建临时表
--如:计算城乡用户中年用电量小于等于20度
WITH FilteredData AS (
    SELECT TRADE_CODE,CONS_NO,COUNT(DISTINCT MM) OVER (PARTITION BY CONS_NO) AS CountMM,SUM(PQ) OVER(PARTITION BY CONS_NO) AS CountPQ
		FROM ZW_POWER_2018
	where BUILD_DATE < TO_DATE('2018-01', 'yyyy-mm'),
LatestThreeMonths AS (
    SELECT TRADE_CODE,CONS_NO
    FROM FilteredData
    WHERE CountPQ <=20 AND CountMM = 12
)
SELECT TRADE_CODE,COUNT(DISTINCT CONS_NO) AS NumberOfUsers
FROM LatestThreeMonths
GROUP BY TRADE_CODE

三、临时表和with函数区别

是否插入数据库:临时表的数据是需要插入到数据库的;with 函数只是把子查询的语句当作了一个表,但是真实的数据并没有插入到数据库,它的好处是增加了代码的可读性和进行维护。
运行效率:with函数其实跟直接用子查询效率上没有什么区别;而用临时表与永久表相似,数据是真是跑入到数据库里面去的,相当于第二次直接关联的是一个小表,查询效率大大提高。
应用场景:临时表适用于:有很多复杂的关联子表查询。with函数适用于:为了增加代码可读性,且没有很多复杂的关联子查询。

你可能感兴趣的:(数据库常用方法,oracle,数据库,mysql,sql)