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.  逻辑独立性:即使基表结构发生变化(如拆分表),也可以通过修改视图来屏蔽这些变化,保证上层应用的查询语句不变。

点赞(1)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)