SQL面试题:公共表达式、临时表、表变量之间有什么区别?

0
已邀请:
1

gogodiy - 天善智能数据库专家、Tableau爱好者 2015-12-11 回答

表变量:
表变量必须显示定义,不能使用SELECT * INTO 表变量或INSERT INTO 表变量 SELECT的方式创建
表变量的作用域(或者说生命周期)在当前批处理语句中,一旦执行完毕,被自动清除。
表变量存储在内存中,不支持非聚集索引,使用约束、默认值、计算列的时候不能引用自定义函数,没有锁的机制,事务也只针对表变量更新数据,因此生成的日志很小。
当用户访问表变量的时候,不会产生日志。
表变量本身虽然是一个变量,但不能赋值给另一个变量。
不能使用TRUNCATE命令。
表变量的统计信息是不可信的。
从MSSQL2008R2开始,表变量可以作为存储过程的参数。
表变量可以存在于内存和磁盘。
表变量使用当前数据库的排序规则。
动态SQL需要使用表变量的话,必须在动态SQL中定义。
 
临时表:
分为局部临时表(使用#开头)和全局临时表(使用##开头)。
局部临时表生命周期为当前会话,一旦会话结束会自动删除。
全局临时表生命周期为所有连接会话,但是当创建它的会话结束后,也会被自动删除。
临时表的名称不能超过116个字符,因为系统会自动在后面添加标识码。
临时表具有表的一般属性,但是不能分区,不能设置外键,临时表的列数据类型,必须是TempDB中存在的数据类型,换句话说,临时表不能使用自定义数据类型。(自定义数据类型是数据库级别,而临时表只存在于TempDB数据库)
临时表可以使用CREATE、SELECT * INTO、INSERT INTO SELECT的方式创建。
临时表上的统计是相对可信的。
临时表可以存在于内存和磁盘。
临时表使用TempDB数据库的排序规则。
可以先创建临时表,然后在动态SQL中使用。
 
公共表达式(CTE):
CTE只是一个执行结果集,结果集,结果集(重要的话说三遍)。
CTE存在于外部查询中,它对同一批处理中的其他语句不可见。
CTE不能被嵌套,也就是CTE里面不能再定义新的CTE。
同一批语句中可以创建多个CTE,后面的CTE可以引用前面的CTE。
可以在一次查询中多次引用同一个CTE。
对CTE中记录的删除、修改同样可以作用到CTE对应的数据表。
CTE可以递归使用。
 
 

要回复问题请先登录注册