数据库中表和视图的关系
🧩 一、基本概念
1️⃣ 表(Table)
表是数据库中 真实存储数据的结构。
每个表都有固定的字段(列)和数据行(记录)。
📦 就像一个 Excel 表格,每个单元格都存有实际数据。
例如:
CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50), department VARCHAR(30), salary DECIMAL(10,2) );
这个 employee
表中真正保存了员工数据。
2️⃣ 视图(View)
视图是数据库中的一种 虚拟表(virtual table),
它 不存储实际数据,而是基于一个或多个表的 查询结果。
📖 通俗理解:视图就像“表的窗口”或“SQL 查询的结果快照”。
例如:
CREATE VIEW high_salary_emp AS SELECT name, department, salary FROM employee WHERE salary > 10000;
视图 high_salary_emp
只是保存了这条 SQL 的定义。
每次查询它时,数据库都会重新执行这条 SQL,从 employee
表中取数据。
🔗 二、表与视图的关系
对比项 | 表(Table) | 视图(View) |
---|---|---|
数据存储 | ✅ 实际存储数据 | ❌ 不存储数据(只存SQL定义) |
创建来源 | 直接定义结构 | 基于一个或多个表的查询 |
更新操作 | 可以直接插入/更新/删除数据 | 一般只读(部分可更新视图除外) |
性能 | 查询效率高 | 依赖底层表性能 |
维护 | 数据结构固定 | 可以灵活抽象和封装复杂查询 |
应用场景 | 存储业务数据 | 权限控制、数据抽象、统一查询接口 |
🧠 三、它们之间的逻辑关系图
┌──────────────────┐ │ 数据库表 │ │ employee, dept │ └──────────────────┘ │ ▼ ┌──────────────────┐ │ 视图 │ │ high_salary_emp │ ← 由 employee 派生 └──────────────────┘
✅ 表 → 存数据
✅ 视图 → 取数据时的一种“过滤 / 聚合 / 联合”逻辑层
💡 四、应用举例
📍 示例 1:隐藏敏感字段
比如你不想让普通用户看到员工工资:
CREATE VIEW v_emp_basic AS SELECT id, name, department FROM employee;
普通用户只查 v_emp_basic
,不会接触到真实的 salary
数据。
📍 示例 2:简化复杂查询
比如多表联合查询可以封装成视图:
CREATE VIEW v_emp_dept AS SELECT e.name, d.dept_name FROM employee e JOIN department d ON e.department_id = d.id;
以后直接 SELECT * FROM v_emp_dept;
就行,不用每次写 JOIN。
📍 示例 3:权限控制
DBA 给普通用户只授予
SELECT
某个视图的权限;不允许其访问底层真实表,提升安全性。
🧭 五、小结
特性 | 表 | 视图 |
---|---|---|
是否存数据 | ✅ 是 | ❌ 否 |
定义方式 | CREATE TABLE | CREATE VIEW AS SELECT ... |
是否可以修改数据 | ✅ 是 | ⚠️ 视情况 |
用途 | 存储真实业务数据 | 提供虚拟查询层、隐藏复杂逻辑 |
关系 | 视图依赖表 | 表是视图的数据来源 |
👉 一句话总结:
表是真实的数据仓库,
视图是从表中“取出部分或加工后”展示的数据窗口。