1. 虚拟性:不存储数据,只存储定义(SQL 查询)。
2. 动态性:每次查询视图,都会执行其背后的 `SELECT` 语句,因此总能反映基表的最新数据。
3. 安全性:可以屏蔽敏感数据或复杂查询逻辑。
4. 简化性:将复杂的联表查询和过滤条件封装起来,提供一个简单的表结构供用户查询。
根据需求,需要为生产部门的领导创建一个视图,只显示该部门员工的工作号、姓名和性别。
假设:
`department` 表中,生产部门的 `d_name` 为 `'生产部'`。
需要从 `worker` 表中获取 `num`, `name`, `sex`。
需要通过 `d_id` 关联两张表,并且只筛选出部门名称为 `'生产部'` 的员工。
创建视图的 SQL 语句:
CREATE VIEW product_view AS SELECT w.num, w.name, w.sex FROM worker w INNER JOIN department d ON w.d_id = d.d_id WHERE d.d_name = '生产部';
说明:
`CREATE VIEW product_view AS`: 创建了一个名为 `product_view` 的视图。
后面的 `SELECT` 语句定义了视图的内容。它连接了 `worker` 和 `department` 表,并设置了过滤条件。
生产部门的领导现在只需执行一个简单的查询即可获得所需信息:
SELECT * FROM product_view;
而无需再编写复杂的 `JOIN` 和 `WHERE` 子句。
视图的常用操作
除了创建,您还可以对视图进行其他操作:
1. 使用视图查询:
查询视图中的所有数据
SELECT * FROM product_view;
对视图进行筛选和排序
SELECT * FROM product_view WHERE sex = ' 女' ORDER BY name;
2. 查看视图定义:
方法一
SHOW CREATE VIEW product_view;
方法二(视图本身也是一张‘表’,可以在 INFORMATION_SCHEMA 中查询)
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'product_view';
3. 修改视图:
使用 CREATE OR REPLACE 修改视图定义
CREATE OR REPLACE VIEW product_view AS SELECT w.num, w.name, w.sex, d.function -- 例如,新增一个“部门功能”字段 FROM worker w INNER JOIN department d ON w.d_id = d.d_id WHERE
4. 删除视图:
DROP VIEW IF EXISTS product_view;
关于“视图的更新”的重要补充
这是一个非常关键且容易混淆的点。虽然可以对视图进行 `INSERT`, `UPDATE`, `DELETE` 操作,但并非所有视图都是可更新的。
可更新视图必须满足一系列条件,主要包括:
视图中的行必须与基表中的行有一一对应的关系。
视图不能包含以下元素:
`DISTINCT`
`GROUP BY`
`HAVING`
`UNION` / `UNION ALL`
子查询(在SELECT列表中的子查询有时也不行)
聚合函数(如 `SUM()`, `COUNT()`)
连接(`JOIN`,但有例外情况,例如对单表建立的视图肯定是可更新的)
在例子中:
`product_view` 是基于多表连接 (`INNER JOIN`) 创建的,因此这个视图是不可更新的。如果尝试对 `product_view` 进行 `INSERT` 或 `UPDATE`,MySQL 将会报错。
可更新视图示例:
如果创建一个只基于 `worker` 表单个表的视图,它就是可更新的。
创建一个可更新的视图
CREATE VIEW simple_worker_view AS SELECT num, name, sex FROM worker;
以下操作是允许的
UPDATE simple_worker_view SET name = '张三丰’ WHERE num = 1001;
这个更新会直接作用到基表 `worker` 上
结论
视图是 MySQL 中一个强大的功能,主要用于:
1. 简化操作:隐藏复杂的 SQL 逻辑。
2. 数据安全:实现列级和行级的数据权限控制(如您的生产部门例子)。
3. 逻辑独立性:即使基表结构发生变化(如拆分表),也可以通过修改视图来屏蔽这些变化,保证上层应用的查询语句不变。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程