数据库--视图

打印 上一主题 下一主题

主题 965|帖子 965|积分 2897

一.视图

1.视图界说

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

2.视图的作用

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

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

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

4. 逻辑数据独立性:
   当底层数据库表布局发生改变时,如果视图设计得当,可以通过修改视图的界说来顺应这种变革,而无需更改所有引用该视图的客户端应用代码,从而进步了系统的可维护性和灵活性。

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

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

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

3.视图相关sql语句

3.1创建视图

3.1.1创建视图(Create View

  1. CREATE VIEW view_name AS
  2. SELECT column1, column2, ...
  3. FROM table1
  4. [LEFT|RIGHT|INNER] JOIN table2 ON condition
  5. [LEFT|RIGHT|INNER] JOIN table3 ON condition
  6. WHERE some_condition
  7. GROUP BY column1, column2, ...
  8. HAVING another_condition
  9. ORDER BY column1 ASC|DESC, column2 ASC|DESC, 
复制代码
这里的`view_name`是你想要创建的视图的名称,`column1, column2, ...`是从原始表中选取的列,你可以加入任意数目的表联接(JOIN)、WHERE条件、GROUP BY分组、HAVING条件和ORDER BY排序。

创建视图实例:

  1. CREATE OR REPLACE VIEW customer_orders AS
  2. SELECT c.customer_id, c.first_name, c.last_name, o.order_id, o.order_date
  3. FROM customers c
  4. JOIN orders o ON c.customer_id = o.customer_id;
复制代码
在这段代码中,我们创建了一个名为customer_orders的视图,它组合了customers表和orders表的数据,展示了每个客户及其订单ID和订单日期。

3.1.2修改视图(Alter View)

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

  1. ALTER VIEW view_name AS
  2. SELECT column1, column2, ...
  3. -- 新的查询语句
  4. FROM table1
  5. .
复制代码
修改视图实例:

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

  1. ALTER VIEW old_view_name RENAME TO new_view_name;
复制代码
        在实际操纵中,根据所利用的详细数据库管理系统(如MySQL、SQL Server、Oracle、PostgreSQL等)的文档来确定确切的语法和功能支持。对于不支持直接修改视图界说的数据库,通常需要先删除旧视图,然后再按照新的界说创建新视图。

重定名视图实例:

  1. RENAME customer_orders TO customer_order_summary;
复制代码
        在这段代码中,我们将customer_orders视图重定名为customer_order_summary,根据实际数据库表布局和需求调整上述SQL语句中的表名和列名。在实际操纵时,肯定要确保视图界说正确无误,并且拥有相应的权限来进行视图的创建、修改或重定名操纵。
3.2删除视图

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

  1. DROP VIEW view_name;
复制代码
删除视图示例:
  1.  DROP VIEW customer_orders;
复制代码
   这将删除名为`customer_orders`的视图。
3.2.2删除多个视图


 要删除多个视图,需要依次对每个视图执行`DROP VIEW`语句,Oracle自己不支持一次性删除多个视图。但是,你可以编写循环或脚本来批量删除。   示例(批量删除的伪代码):
 
  1.    BEGIN
  2.      FOR i IN (SELECT view_name FROM user_views WHERE view_name IN ('view1', 'view2', 'view3'))
  3.      LOOP
  4.        EXECUTE IMMEDIATE 'DROP VIEW ' || i.view_name;
  5.      END LOOP;
  6.    END;
  7.    -- 或者对于已知视图名列表
  8.    EXECUTE IMMEDIATE 'DROP VIEW view1';
  9.    EXECUTE IMMEDIATE 'DROP VIEW view2';
  10.    EXECUTE IMMEDIATE 'DROP VIEW view3';
复制代码
3.2.3.删除视图并忽略依靠(如果有权限)


   Oracle数据库默认不答应删除正在被其他对象依靠的视图,除非你有足够权限(如`DROP ANY VIEW`)并且明确指定了CASCADE CONSTRAINTS选项(但这并不适用于视图,由于视图没有束缚)。
 
  1.    -- 注意:Oracle中DROP VIEW本身不会涉及CASCADE CONSTRAINTS,因为视图不包含约束
  2.    -- 若存在其他依赖于视图的对象,需要手动解除这些依赖,或具有特殊权限
复制代码
   实际上,如果视图被其他对象(如函数、触发器、存储过程等)引用,需要先删除或修改那些依靠的对象,然后再删除视图。
3.2.4删除视图并保存原视图的所有权限(Oracle 12c及以上版本)


   在Oracle 12c及以上版本中,新增了`CONTINUE NOMATCH`选项,可以用于保存原视图的权限以便重新创建时恢复。
  1.  -- Oracle 12c+
  2.    DROP VIEW view_name CONTINUE NOMATCH;
复制代码
   然而,删除视图并不会自动保存其权限,需在删除后再重新创建视图时利用`CREATE OR REPLACE VIEW`配合`AUTHID DEFINER`或显式授予雷同的权限。在执行删除操纵前,请确保你具有足够的权限,并考虑视图删除对其他依靠对象的影响。同时,删除视图不会影响源表中的数据。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表