视图与临时表

今天上午闲来无事,突然想写写视图与临时表的作用,如下:

视图:

视图的定义:从一个或多个表(或视图)导出的表。

视图与表的不同之处:视图是一个虚表,即视图所对应的数据不进行实际存储,数据库只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。

上面小段其实已经讲出了视图的本质特征。

视图主要用于系统的安全、查询和效率,在安全方面,举个例子:例如,你只想让用户看到某一表的某几个字段,有些字段想不让用户看见,这是用视图解决会很好,当然在select时也可以实现。第在查询方面,对于比较复杂的查询,可以大大减少频繁编写sql语句的烦恼。同时,在效率上,数据分布在多台服务器上,视图一定会带来效率上的好处。

 

临时表:

临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。
    临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employees,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##employees 全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该表,则 SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。
  临时表主要用来提高效率。

 

二者区别:
空间分配:物理空间的分配不一样,视图不分配空间,   临时表会分配空间
虚实:视图是一条预编译的SQL语句,并不保存实际数据,而临时表是保存在tempdb中的实际的表。即视图是一个快照,是一个虚表,而临时表是客观存在的表类型对象。它们的结构一个是表、一个快照。可以把视图想象成联合表的快捷方式。

 

 

 

 

在SQL中,`WITH`语句用于创建公共表表达式(Common Table Expression,CTE),它可以被看作是一个临时的结果集,仅在当前查询的上下文中有效。CTE提供了一种清晰且结构化的方式来组织复杂的SQL查询,尤其适用于需要在主查询中多次引用的中间结果。 CTE的基本语法如下: ```sql WITH temp_table AS ( -- 查询语句生成临时结果集 SELECT column1, column2, ... FROM some_table WHERE some_condition ) -- 主查询使用临时结果集 SELECT * FROM temp_table WHERE other_conditions; ``` `WITH`语句允许创建一个或多个这样的临时结果集,每个CTE都可以在后续的查询中像普通表一样被引用。这种机制不仅提高了查询的可读性,还简化了复杂查询的调试维护过程[^1]。 传统的临时表相比,CTE有几个显著的不同点: 1. **作用域**:CTE的作用域仅限于定义它的查询语句,而传统临时表可以在多个查询中被访问,直到它们被显式删除。 2. **性能**:对于某些数据库系统而言,CTE可能会被优化为内联查询,这意味着它们可能不会实际创建临时存储。而显式的临时表则通常会创建物理存储,这可能会影响性能[^3]。 3. **递归查询**:CTE支持递归查询,这对于处理层次结构数据非常有用。传统临时表不直接支持递归查询,但可以通过其他方式实现[^1]。 下面是一个具体的例子,展示如何使用`WITH`来创建一个CTE,该CTE计算每个用户的订单总数: ```sql WITH user_order_count AS ( SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id ) SELECT u.name, uoc.order_count FROM users u JOIN user_order_count uoc ON u.user_id = uoc.user_id; ``` 在这个例子中,`user_order_count`是一个CTE,它从`orders`表中计算出每个用户的订单数量。然后,这个CTE被用来`users`表进行连接,以获取每个用户的名称及其订单数量[^4]。 当需要创建一个可以在多个查询中重复使用的临时表时,可以使用`CREATE TEMPORARY TABLE`语句。然而,如果只是需要在一个查询中使用中间结果,则推荐使用`WITH`子句,因为它不需要显式地创建删除表对象[^2]。 例如,如果要创建一个临时表来保存特定条件下的订单信息,可以这样做: ```sql CREATE TEMPORARY TABLE temp_orders AS SELECT * FROM orders WHERE create_time >= '2025-01-01'; ``` 之后,可以像操作普通表一样对`temp_orders`进行查询操作,并且可以在多个查询中重用这个临时表,直到会话结束或者显式地删除该表[^4]。 综上所述,`WITH`语句提供了一种简洁的方式来创建临时结果集,适用于单一查询中的中间结果处理。相比之下,传统临时表更适合那些需要跨多个查询持久存在的场景。选择哪种方法取决于具体的应用需求数据库系统的特性。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值