数据库--视图

一.视图

1.视图定义

        数据库视图(Database View)是一种数据库对象,是数据库系统中的一种逻辑构造,它基于一个或多个实际数据库表,通过预先定义的SQL查询语句生成的一个虚拟表。视图并不实际存储数据,而是根据查询定义动态生成数据,视图可以是一个数据表的一部分,也可以是多个基表的联合,它存储了要执行检索的查询语句的定义,以便在引用该视图时使用,所以视图中的数据是实时反映其基表数据的变化。

2.视图的作用

1. 数据抽象与简化:
   视图允许用户和应用程序看到的是经过筛选、整理后的数据子集,而不是整个数据库的原始复杂结构。例如,可以创建一个视图只包含特定列、特定记录或者经过聚合运算(如SUM、COUNT等)后的数据,使得用户无需了解底层数据表的具体细节,只需关注与业务相关的部分。

2. 安全性控制:
   视图可用于实现细粒度的安全控制。通过只向用户授权访问某个视图而非底层表,可以隐藏敏感信息(比如不显示某些列),也可以限制用户只能访问满足特定条件的数据(例如,每个用户只能看到他们自己负责区域的销售数据)。

3. 数据集成与联合:
   当数据库中有多个表需要关联查询时,可以创建视图来集成这些表的数据,形成一种“虚拟”的一体化表。这对于频繁使用的复杂查询尤其有用,简化了后续查询的操作,并且减少了重复编写复杂SQL的需要。

4. 逻辑数据独立性:
   当底层数据库表结构发生改变时,如果视图设计得当,可以通过修改视图的定义来适应这种变化,而无需更改所有引用该视图的客户端应用代码,从而提高了系统的可维护性和灵活性。

5. 提高查询性能优化:
   在某些特定场景下,视图可以帮助优化查询性能。例如,通过索引视图或预先计算一些复杂的查询结果并存放在视图中,可以使后续的简单查询更快完成。当然,视图并不是总能带来性能提升,是否能够优化还需要结合具体的查询情况和数据库管理系统特性来判断。

6. 临时数据定制:
   视图可以根据时间点或特定条件动态展示数据,例如创建一个只显示最新一周数据的视图,或者根据用户角色展示不同维度的数据汇总。

7. 历史数据记录:
   在某些情况下,视图可以用来保存某一时间点的数据库状态,即所谓的“快照”视图,这对于数据审计、回溯分析等场景非常有价值。

3.视图相关sql语句

3.1创建视图

3.1.1创建视图(Create View
CREATE VIEW view_name AS

SELECT column1, column2, ...

FROM table1

[LEFT|RIGHT|INNER] JOIN table2 ON condition

[LEFT|RIGHT|INNER] JOIN table3 ON condition

WHERE some_condition

GROUP BY column1, column2, ...

HAVING another_condition

ORDER BY column1 ASC|DESC, column2 ASC|DESC, 

这里的`view_name`是你想要创建的视图的名称,`column1, column2, ...`是从原始表中选取的列,你可以加入任意数量的表联接(JOIN)、WHERE条件、GROUP BY分组、HAVING条件和ORDER BY排序。

创建视图实例:

CREATE OR REPLACE VIEW customer_orders AS
SELECT c.customer_id, c.first_name, c.last_name, o.order_id, o.order_date
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;

在这段代码中,我们创建了一个名为customer_orders的视图,它组合了customers表和orders表的数据,展示了每个客户及其订单ID和订单日期。

3.1.2修改视图(Alter View

修改视图通常有两种情况,一种是修改视图的定义,另一种是重命名视图。注意,并非所有的数据库系统都支持直接修改视图的定义,有些数据库要求先删除现有视图,再重新创建。修改视图定义如下:

ALTER VIEW view_name AS

SELECT column1, column2, ...

-- 新的查询语句

FROM table1

.

修改视图实例:

        这里修改了customer_orders视图,添加了一个新的列total_amount,它是从orders表中获取的。Oracle中的CREATE OR REPLACE VIEW语句通常用于修改视图定义,它会删除(如果存在)并重新创建同名视图。如果不支持直接修改视图定义,那么确实需要先删除视图,再重新创建。

3.1.3重命名视图
ALTER VIEW old_view_name RENAME TO new_view_name;

        在实际操作中,根据所使用的具体数据库管理系统(如MySQLSQL ServerOraclePostgreSQL等)的文档来确定确切的语法和功能支持。对于不支持直接修改视图定义的数据库,通常需要先删除旧视图,然后再按照新的定义创建新视图。

重命名视图实例:

RENAME customer_orders TO customer_order_summary;

        在这段代码中,我们将customer_orders视图重命名为customer_order_summary,根据实际数据库表结构和需求调整上述SQL语句中的表名和列名。在实际操作时,一定要确保视图定义正确无误,并且拥有相应的权限来进行视图的创建、修改或重命名操作。

3.2删除视图

在Oracle数据库中,删除视图的操作可以通过`DROP VIEW`语句来实现。以下是删除视图的各种情况及其相应的SQL实例代码:

3.2.1删除单个视图:
DROP VIEW view_name;

删除视图示例:

 DROP VIEW customer_orders;

   这将删除名为`customer_orders`的视图。

3.2.2删除多个视图


 要删除多个视图,需要依次对每个视图执行`DROP VIEW`语句,Oracle本身不支持一次性删除多个视图。但是,你可以编写循环或脚本来批量删除。   示例(批量删除的伪代码):
 

   BEGIN
     FOR i IN (SELECT view_name FROM user_views WHERE view_name IN ('view1', 'view2', 'view3'))
     LOOP
       EXECUTE IMMEDIATE 'DROP VIEW ' || i.view_name;
     END LOOP;
   END;

   -- 或者对于已知视图名列表
   EXECUTE IMMEDIATE 'DROP VIEW view1';
   EXECUTE IMMEDIATE 'DROP VIEW view2';
   EXECUTE IMMEDIATE 'DROP VIEW view3';
3.2.3.删除视图并忽略依赖(如果有权限)


   Oracle数据库默认不允许删除正在被其他对象依赖的视图,除非你有足够权限(如`DROP ANY VIEW`)并且明确指定了CASCADE CONSTRAINTS选项(但这并不适用于视图,因为视图没有约束)。
 

   -- 注意:Oracle中DROP VIEW本身不会涉及CASCADE CONSTRAINTS,因为视图不包含约束
   -- 若存在其他依赖于视图的对象,需要手动解除这些依赖,或具有特殊权限

   实际上,如果视图被其他对象(如函数、触发器、存储过程等)引用,需要先删除或修改那些依赖的对象,然后再删除视图。

3.2.4删除视图并保留原视图的所有权限(Oracle 12c及以上版本)


   在Oracle 12c及以上版本中,新增了`CONTINUE NOMATCH`选项,可以用于保留原视图的权限以便重新创建时恢复。

  -- Oracle 12c+
   DROP VIEW view_name CONTINUE NOMATCH;

   然而,删除视图并不会自动保留其权限,需在删除后再重新创建视图时使用`CREATE OR REPLACE VIEW`配合`AUTHID DEFINER`或显式授予相同的权限。在执行删除操作前,请确保你具有足够的权限,并考虑视图删除对其他依赖对象的影响。同时,删除视图不会影响源表中的数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值