视图与表的区别

oracle中,视图不含有任何数据。表含有数据。尽管可以创建含有数据的“物化视图”,但是它们是真是的表,而不是视图。视图的功能在于:它可以限制或者修改用户查看数据的方式,而底层本身没有受到影响。  
数据库中的**视图(View)****(Table)**是两种核心对象,它们在存储方式、数据来源、使用场景等方面存在本质区别。以下是详细对比: --- ### **1. 定义本质** | **特性** | **(Table)** | **视图(View)** | |----------------|-----------------------------------------|------------------------------------------| | **本质** | 实际存储数据的物理对象,占用存储空间。 | 虚拟,基于SQL查询的逻辑对象,不存储数据。 | | **数据来源** | 直接存储原始数据(如用户输入、导入数据)。 | 通过查询(`SELECT`)动态生成,数据来自一个或多个。 | --- ### **2. 存储性能** - ****: - 数据以物理文件形式存储在磁盘上(如MySQL的`.ibd`文件、PostgreSQL的`heap`)。 - 操作(如`INSERT`/`UPDATE`/`DELETE`)直接修改磁盘数据,性能较高但需考虑锁并发。 - **视图**: - 不存储数据,仅存储查询定义(如`CREATE VIEW v_user AS SELECT * FROM users WHERE status=1`)。 - 每次查询视图时,数据库会执行其定义的SQL语句,可能影响性能(尤其是复杂视图)。 --- ### **3. 数据修改能力** - ****: - 支持完整的`DML`操作(`INSERT`、`UPDATE`、`DELETE`)。 - 示例: ```sql INSERT INTO users (name, age) VALUES ('Alice', 25); ``` - **视图**: - **可更新视图的条件**: 1. 视图必须基于单个(不能是多连接)。 2. 不能包含聚合函数(如`SUM`、`AVG`)、`DISTINCT`、`GROUP BY`等。 3. 不能包含子查询(部分数据库支持简单子查询)。 - 示例(可更新视图): ```sql CREATE VIEW v_active_users AS SELECT id, name FROM users WHERE status=1; UPDATE v_active_users SET name = 'Bob' WHERE id = 1; -- 实际修改users ``` - **不可更新视图**:若视图定义复杂(如含聚合函数),则只能用于查询。 --- ### **4. 使用场景** - ****: - 存储原始数据,是数据库的基础结构。 - 适合需要频繁修改、事务处理的场景(如订单、用户)。 - **视图**: - **简化复杂查询**:封装多连接、条件过滤等逻辑,对外提供统一接口。 ```sql -- 复杂查询封装为视图 CREATE VIEW v_order_summary AS SELECT o.order_id, u.name, p.product_name, o.quantity FROM orders o JOIN users u ON o.user_id = u.id JOIN products p ON o.product_id = p.id; ``` - **数据安全**:限制用户只能访问特定列(如隐藏薪资字段)。 ```sql CREATE VIEW v_public_users AS SELECT id, name, email FROM users; ``` - **权限控制**:通过视图授权,避免直接暴露结构。 - **兼容性**:为旧系统提供结构兼容的接口。 --- ### **5. 索引优化** - ****: - 可创建索引(如B-Tree、Hash)加速查询。 - 索引直接作用于物理数据,影响写入性能。 - **视图**: - **物化视图(Materialized View)**:部分数据库(如Oracle、PostgreSQL)支持将视图结果持久化,并可创建索引。 ```sql -- PostgreSQL示例 CREATE MATERIALIZED VIEW mv_sales_daily AS SELECT date, SUM(amount) AS total FROM sales GROUP BY date; CREATE INDEX idx_mv_sales_date ON mv_sales_daily (date); ``` - 普通视图无索引,查询性能依赖底层的索引。 --- ### **6. 依赖性维护** - ****: - 独立存在,删除不会影响其他对象(除非被视图或外键引用)。 - **视图**: - **依赖性**:若视图依赖的被修改(如列名变更),视图可能失效(需`REFRESH`或重建)。 - **维护成本**:复杂视图可能增加数据库解析执行计划的负担。 --- ### **7. 示例对比** #### **场景**:查询活跃用户及其订单总数 - **直接查询(操作)**: ```sql SELECT u.id, u.name, COUNT(o.order_id) AS order_count FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE u.status = 1 GROUP BY u.id, u.name; ``` - **使用视图**: ```sql -- 创建视图 CREATE VIEW v_active_user_orders AS SELECT u.id, u.name, COUNT(o.order_id) AS order_count FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE u.status = 1 GROUP BY u.id, u.name; -- 查询视图(简化调用) SELECT * FROM v_active_user_orders WHERE order_count > 5; ``` --- ### **关键总结** | **维度** | **** | **视图** | |----------------|---------------------------------|-----------------------------------| | **存储** | 物理存储数据 | 逻辑存储查询定义 | | **修改** | 支持完整`DML` | 仅简单视图支持部分`DML` | | **性能** | 高(直接访问数据) | 低(需动态执行查询) | | **用途** | 存储原始数据 | 简化查询、安全控制、兼容性 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值