RDBMS技术之视图

举报
tea_year 发表于 2023/12/29 21:14:52 2023/12/29
【摘要】 第8章​ 视图本章学习目标​ 理解视图​ 熟练掌握视图操作视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。例如,在现实生活中,某个销售公司的采购人员,只需关注其业务相关的数据,可以根据这一实际情况,专门为采购人员创建一个视图,方便其日后进行查询操作。8.1​ 什么是视图视图是一种虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图在数...

第8章​ 视图

本章学习目标

​ 理解视图

​ 熟练掌握视图操作

视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。例如,在现实生活中,某个销售公司的采购人员,只需关注其业务相关的数据,可以根据这一实际情况,专门为采购人员创建一个视图,方便其日后进行查询操作。

8.1​ 什么是视图

视图是一种虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图在数据库中并不以存储的数据值集形式存在,它的数据来自定义视图查询时所引用的表,并且在引用视图时动态生成。

对视图引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其他视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

视图的定义是基于基本表的,与直接操作基本表相比,视图有以下四个优点。

​ 简化用户操作:视图机制使用户可以将注意力集中在所关心的数据上。如果数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,而且可以简化用户的数据查询操作。例如,定义了若干张表连接的视图,这样就对用户隐藏了表与表之间的连接操作。换句话说,用户只是对一个虚表进行简单查询操作,而无需了解该表的来历。

​ 使用户能以多种角度看待同一数据:视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。

​ 为重构数据库提供了一定程度的逻辑独立性:数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。

​ 对机密数据提供安全保护:有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,普通用户不能看到机密数据,这样视图机制就自动提供了对机密数据的安全保护功能。例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的管理员查询和修改本院系的学生视图。

8.2​ 视图操作

上节内容详细阐述了视图的基本概念,接下来将讲解视图的操作,包括创建视图、查看视图、修改视图、更新视图和删除视图。

8.2.1​ 数据准备

在讲解视图前,首先创建两张数据表并插入数据,用于后面的例题演示,分别为员工表emp和员工详细信息表emp_detail,首先来了解一下表结构,员工表emp的表结构如表8.1所示。

表8.1​ emp表

字段

字段类型

说明

id

int

员工编号

name

char(30)

员工姓名

sex

char(2)

员工性别

age

int

员工年龄

department

char(10)

所在部门

salary

int

员工工资

home

char(30)

员工户籍

marry

char(2)

是否结婚

hobby

char(30)

兴趣爱好

表8.1中列出了员工表的字段、字段类型和说明,接着创建员工表,SQL语句如下所示。

mysql> CREATE TABLE emp(

-> ID INT PRIMARY KEY AUTO_INCREMENT,

-> NAME CHAR(30) NOT NULL,

-> SEX CHAR(2) NOT NULL,

-> AGE INT NOT NULL,

-> DEPARTMENT CHAR(10) NOT NULL,

-> SALARY INT NOT NULL,

-> HOME CHAR(30),

-> MARRY CHAR(2) NOT NULL DEFAULT '否',

-> HOBBY CHAR(30)

-> );

Query OK, 0 rows affected (0.14 sec)

员工表创建完成后,向表中插入数据,SQL语句如下所示。

mysql> INSERT INTO emp

-> (ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY)

-> VALUES

-> (NULL,'孙一','女',20,'人事部','4000','广东','否','网球'),

-> (NULL,'钱二','女',21,'人事部','9000','北京','否','网球'),

-> (NULL,'张三','男',22,'研发部','8000','上海','否','音乐'),

-> (NULL,'李四','女',23,'研发部','9000','重庆','否','无'),

-> (NULL,'王五','女',24,'研发部','9000','四川','是','足球'),

-> (NULL,'赵六','男',25,'销售部','6000','福建','否','游戏'),

-> (NULL,'田七','女',26,'销售部','5000','山西','否','篮球');

Query OK, 7 rows affected (0.08 sec)

Records: 7 Duplicates: 0 Warnings: 0

以上执行结果证明数据插入完成,可以查看表中数据,SQL语句如下所示。

mysql> SELECT * FROM emp;

+----+------+-----+-----+------------+--------+------+-------+-------+

| ID | NAME | SEX | AGE | DEPARTMENT | SALARY | HOME | MARRY | HOBBY |

+----+------+-----+-----+------------+--------+------+-------+-------+

| 1 | 孙一 | 女 | 20 | 人事部 | 4000 | 广东 | 否 | 网球 |

| 2 | 钱二 | 女 | 21 | 人事部 | 9000 | 北京 | 否 | 网球 |

| 3 | 张三 | 男 | 22 | 研发部 | 8000 | 上海 | 否 | 音乐 |

| 4 | 李四 | 女 | 23 | 研发部 | 9000 | 重庆 | 否 | 无 |

| 5 | 王五 | 女 | 24 | 研发部 | 9000 | 四川 | 是 | 足球 |

| 6 | 赵六 | 男 | 25 | 销售部 | 6000 | 福建 | 否 | 游戏 |

| 7 | 田七 | 女 | 26 | 销售部 | 5000 | 山西 | 否 | 篮球 |

+----+------+-----+-----+------------+--------+------+-------+-------+

7 rows in set (0.00 sec)

接着创建员工详细信息表emp_detail,表结构如表8.2所示。

表8.2​ emp_detail表

字段

字段类型

说明

id

int

员工编号

pos

char(10)

员工岗位

experence

char(10)

工作经历

表8.2中列出了员工详细信息表的字段、字段类型和说明,接着创建员工详细信息表,SQL语句如下所示。

mysql> create TABLE emp_detail(

-> ID INT PRIMARY KEY,

-> POS CHAR(10) NOT NULL,

-> EXPERENCE CHAR(10) NOT NULL,

-> CONSTRAINT `FK_ID` FOREIGN KEY(ID) REFERENCES emp(ID)

-> );

Query OK, 0 rows affected (0.11 sec)

员工详细信息表创建完成后,表中插入数据,SQL语句如下所示。

mysql> INSERT INTO emp_detail(ID,POS,EXPERENCE)

-> VALUES

-> (1,'人事管理','工作二年'),

-> (2,'人事招聘','工作二年'),

-> (3,'初级工程师','工作一年'),

-> (4,'中级工程师','工作二年'),

-> (5,'高级工程师','工作三年'),

-> (6,'销售代表','工作二年'),

-> (7,'销售员','工作一年');

Query OK, 7 rows affected (0.07 sec)

Records: 7 Duplicates: 0 Warnings: 0

以上执行结果证明数据插入完成,可以查看表中数据,SQL语句如下所示。

mysql> SELECT * FROM emp_detail;

+----+------------+-----------+

| ID | POS | EXPERENCE |

+----+------------+-----------+

| 1 | 人事管理 | 工作二年 |

| 2 | 人事招聘 | 工作二年 |

| 3 | 初级工程师 | 工作一年 |

| 4 | 中级工程师 | 工作二年 |

| 5 | 高级工程师 | 工作三年 |

| 6 | 销售代表 | 工作二年 |

| 7 | 销售员 | 工作一年 |

+----+------------+-----------+

7 rows in set (0.00 sec)

至此,两张表创建完成,本章后面的演示例题会用到这两张表。

8.2.2​ 创建视图

在创建视图时,当前用户必须具有创建视图的权限。此时登录的是root用户,查询该用户是否具有创建视图的权限,SQL语句如下所示。

mysql> select Create_view_priv from mysql.user WHERE User='root';

+------------------+

| Create_view_priv |

+------------------+

| Y |

| Y |

+------------------+

2 rows in set (0.00 sec)

以上执行结果可看出,当前用户具有创建视图的权限,可以进行创建视图的操作,视图可以建立在一张表上,也可以建立在多张表上,MySQL中创建视图的语法格式如下所示。

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

VIEW [db_name.]view_name [(column_list)]

AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION];

以上语法格式中,创建视图的语句由多条子句构成,接下来对语法格式中的每个部分进行详细解析,具体如下。

​ CREATE:表示创建视图的关键字。

​ OR REPLACE:如果给定了此子句,表示该语句能够替换已有视图。

​ ALGORITHM:为可选参数,表示视图选择的算法。

​ UNDEFINED:表示MySQL将自动选择使用的算法。

​ MERGE:表示将使用视图的语句与视图含义合并起来,使视图定义的某一部分取代语句的对应部分。

​ TEMPTABLE:表示将视图的结果存入临时表,然后使用临时表执行语句。

​ view_name:表示要创建的视图名称。

​ column_list:为可选参数,表示属性清单,指定了视图中各个属性名,默认情况下,与SELECT语句中查询的属性相同。

​ AS:表示指定视图要执行的操作。

​ select_statement:表示从某个表或视图中查出某些满足条件的记录,将这些记录导入视图中。

​ WITH CHECK OPTION:为可选参数,表示创建视图时要保证在该视图的权限范围之内。

​ CASCADED:为可选参数,表示创建视图时,需要满足与该视图有关的所有相关视图和表的添加,该参数为默认值。

​ LOCAL:为可选参数,表示创建视图时,只要满足该视图本身定义的条件即可。

以上是创建视图的语法格式,视图可以建立在一张表上,也可以建立在多张表上,接下来针对这两种情况分别进行讲解。

1.在单表上创建视图

接下来利用准备好的数据,通过具体案例演示如何在单表上创建视图。

例8-1​ 在emp表上创建视图view_emp,包含的列为ID、NAME、SEX、AGE和DEPARTMENT,SQL语句如下所示。

mysql> CREATE VIEW view_emp

-> (ID,NAME,SEX,AGE,DEPARTMENT)

-> AS

-> SELECT ID,NAME,SEX,AGE,DEPARTMENT

-> FROM emp;

Query OK, 0 rows affected (0.10 sec)

以上执行结果证明视图创建成功,可以使用SELECT语句查看视图,SQL语句如下所示。

mysql> SELECT * FROM view_emp;

+----+------+-----+-----+------------+

| ID | NAME | SEX | AGE | DEPARTMENT |

+----+------+-----+-----+------------+

| 1 | 孙一 | 女 | 20 | 人事部 |

| 2 | 钱二 | 女 | 21 | 人事部 |

| 3 | 张三 | 男 | 22 | 研发部 |

| 4 | 李四 | 女 | 23 | 研发部 |

| 5 | 王五 | 女 | 24 | 研发部 |

| 6 | 赵六 | 男 | 25 | 销售部 |

| 7 | 田七 | 女 | 26 | 销售部 |

+----+------+-----+-----+------------+

7 rows in set (0.00 sec)

以上执行结果可看出,视图view_emp创建成功,大家会发现这与emp表是不同的,该视图只展示了emp表的部分数据,隐藏了另一部分数据,这样做可以对一些数据提供保护。

2.在多表上创建视图

前面讲解了在单表上创建视图,也可以在多表上创建视图,接下来以两张基本表为例,通过具体案例演示如何在多表上创建视图。

例8-2​ 在emp表和emp_detail表上创建视图view_emp_detail,包含的列为ID、NAME、SEX、AGE、DEPARTMENT、POS和EXPERENCE,SQL语句如下所示。

mysql> CREATE VIEW view_emp_detail

-> (ID, NAME, SEX, AGE,DEPARTMENT,POS,EXPERENCE)

-> AS

-> SELECT a.ID,a.NAME,a.SEX,a.AGE,

-> a.DEPARTMENT,b.POS,b.EXPERENCE

-> FROM emp a,emp_detail b WHERE a.ID=b.ID;

Query OK, 0 rows affected (0.03 sec)

以上执行结果证明视图创建成功,可以使用SELECT语句查看视图,SQL语句如下所示。

mysql> SELECT * FROM view_emp_detail;

+----+------+-----+-----+------------+------------+-----------+

| ID | NAME | SEX | AGE | DEPARTMENT | POS | EXPERENCE |

+----+------+-----+-----+------------+------------+-----------+

| 1 | 孙一 | 女 | 20 | 人事部 | 人事管理 | 工作二年 |

| 2 | 钱二 | 女 | 21 | 人事部 | 人事招聘 | 工作二年 |

| 3 | 张三 | 男 | 22 | 研发部 | 初级工程师 | 工作一年 |

| 4 | 李四 | 女 | 23 | 研发部 | 中级工程师 | 工作二年 |

| 5 | 王五 | 女 | 24 | 研发部 | 高级工程师 | 工作三年 |

| 6 | 赵六 | 男 | 25 | 销售部 | 销售代表 | 工作二年 |

| 7 | 田七 | 女 | 26 | 销售部 | 销售员 | 工作一年 |

+----+------+-----+-----+------------+------------+-----------+

7 rows in set (0.00 sec)

以上执行结果可看出,视图view_emp创建成功,通过观察可发现,创建基于多表的视图与基于单表的视图类似,区别在于还需要进行多张表的连接查询。

8.2.3​ 查看视图

查看视图的操作,要求当前登录的用户具有查看视图的权限,当前登录的是root用户,查询该用户是否具有查看视图的权限,SQL语句如下所示。

mysql> select Show_view_priv from mysql.user WHERE User='root';

+----------------+

| Show_view_priv |

+----------------+

| Y |

| Y |

+----------------+

2 rows in set (0.00 sec)

以上执行结果可看出,当前用户具有查看视图的权限,可以进行查看视图的操作,查看视图有三种方式,接下来针对三种方式分别讲解。

1.使用DESCRIBE语句查看视图

查看视图的字段信息,可以使用DESCRIBE语句,具体语法格式如下。

DESCRIBE 视图名;

该语句与查询数据表的字段信息类似,也可以简写为DESC,具体语法格式如下。

DESC 视图名;

接下来通过具体案例演示查看视图的字段信息。

例8-3​ 使用DESCRIBE语句查看视图view_emp_detail的字段信息,SQL语句如下所示。

mysql> DESCRIBE view_emp_detail;

+------------+----------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+------------+----------+------+-----+---------+-------+

| ID | int(11) | NO | | 0 | |

| NAME | char(30) | NO | | NULL | |

| SEX | char(2) | NO | | NULL | |

| AGE | int(11) | NO | | NULL | |

| DEPARTMENT | char(10) | NO | | NULL | |

| POS | char(10) | NO | | NULL | |

| EXPERENCE | char(10) | NO | | NULL | |

+------------+----------+------+-----+---------+-------+

7 rows in set (0.01 sec)

以上执行结果可看到视图view_emp_ detail的字段信息,包括字段名、字段类型等。

2.使用SHOW TABLE STATUS语句查看视图

查看视图的基本信息,可以使用SHOW TABLE STATUS语句,具体语法格式如下。

SHOW TABLE STATUS LIKE '视图名';

以上语法格式中,LIKE关键字后匹配的是字符串,视图名需要使用单引号括起来,接下来通过具体案例演示查看视图的基本信息。

例8-4​ 使用SHOW TABLE STATUS语句查看视图view_emp的基本信息,SQL语句如下所示。

mysql> SHOW TABLE STATUS LIKE 'view_emp'\G

*************************** 1. row ***************************

Name: view_emp

Engine: NULL

Version: NULL

Row_format: NULL

Rows: NULL

Avg_row_length: NULL

Data_length: NULL

Max_data_length: NULL

Index_length: NULL

Data_free: NULL

Auto_increment: NULL

Create_time: NULL

Update_time: NULL

Check_time: NULL

Collation: NULL

Checksum: NULL

Create_options: NULL

Comment: VIEW

1 row in set (0.01 sec)

从以上执行结果可看出,视图view_emp的Comment值为VIEW,其他大多数值都是NULL,因为视图并不是具体的数据表,而是一张虚拟表,所以存储引擎、数据长度等信息都显示为NULL。

3.使用SHOW CREATE VIEW语句查看视图

查看视图的详细信息,可以使用SHOW CREATE VIEW语句,具体语法格式如下。

SHOW CREATE VIEW 视图名;

接下来通过具体案例演示查看视图的详细信息。

例8-5​ 使用SHOW CREATE VIEW语句查看视图view_emp_detail的详细信息,SQL语句如下所示。

mysql> SHOW CREATE VIEW view_emp_detail\G

*************************** 1. row ***************************

View: view_emp_detail

Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost`

SQL SECURITY DEFINER VIEW `view_emp_detail` AS select `a`.`ID` AS `ID`,`a`

.`NAME` AS `NAME`,`a`.`SEX` AS `SEX`,`a`.`AGE` AS `AGE`,`a`.`DEPARTMENT` AS

`DEPARTMENT`,`b`.`POS` AS `POS`,`b`.`EXPERENCE` AS `EXPERENCE` from (`emp`

`a` join `emp_detail` `b`) where (`a`.`ID` = `b`.`ID`)

character_set_client: gbk

collation_connection: gbk_chinese_ci

1 row in set (0.00 sec)

以上执行结果中可看出,查询视图view_emp_detail的详细信息,不仅可以查询到创建视图的定义语句,还可以查询到视图的字符编码。

8.2.4​ 修改视图

在修改视图时,当前用户必须具有删除视图的权限。此时登录的是root用户,查询该用户是否具有删除视图的权限,SQL语句如下所示。

mysql> select Drop_priv from mysql.user WHERE User='root';

+-----------+

| Drop_priv |

+-----------+

| Y |

| Y |

+-----------+

2 rows in set (0.00 sec)

以上执行结果可看出,当前用户具有删除视图的权限,可以进行修改视图的操作。前面讲解了基于基本表创建视图,当基本表的某些字段发生变化时,可以通过修改视图的方式来保持视图与基本表的一致性,修改视图有两种方式,接下来对于两种方式分别讲解。

1.使用CREATE OR REPLACE VIEW语句修改视图

修改视图可以使用CREATE OR REPLACE VIEW语句,具体语法格式如下。

CREATE [OR REPLACE] [ALGORITHM={UNDEFINED | MERGE | TEMPTABLE}]

VIEW view_name[(column_list)]

AS SELECT_statement

[WITH [CASCADED | LOCAL] CHECK OPTION]];

使用以上语法修改视图时,如果修改的视图存在,则会对视图进行修改,如果修改的视图不存在,则会创建一个视图。接下来通过具体案例演示修改视图。

例8-6​ 使用CREATE OR REPLACE VIEW语句,将视图view_emp_detail修改为只保留前三列,SQL语句如下所示。

mysql> CREATE OR REPLACE VIEW view_emp_detail(ID, NAME, SEX)

-> AS

-> SELECT ID, NAME, SEX

-> FROM emp;

Query OK, 0 rows affected (0.04 sec)

以上执行结果证明视图修改成功,可以使用SELECT语句查看视图,SQL语句如下所示。

mysql> SELECT * FROM view_emp_detail;

+----+------+-----+

| ID | NAME | SEX |

+----+------+-----+

| 1 | 孙一 | 女 |

| 2 | 钱二 | 女 |

| 3 | 张三 | 男 |

| 4 | 李四 | 女 |

| 5 | 王五 | 女 |

| 6 | 赵六 | 男 |

| 7 | 田七 | 女 |

+----+------+-----+

7 rows in set (0.00 sec)

以上执行结果可看出,视图view_emp_detail修改成功,通过CREATE OR REPLACE VIEW语句的执行,视图只保留了前三列。

2.使用ALTER语句修改视图

修改视图还可以使用ALTER语句,具体语法格式如下。

ALTER [ALGORITHM={UNDEFINED | MERGE | TEMPTABLE}]

VIEW view_name[(column_list)]

AS SELECT_statement

[WITH [CASCADED | LOCAL] CHECK OPTION];

接下来通过具体案例演示修改视图。

例8-7​ 使用ALTER语句,将视图view_emp修改为只显示员工姓名和员工年龄, SQL语句如下所示。

mysql> ALTER VIEW view_emp

-> AS

-> SELECT NAME,AGE

-> FROM emp;

Query OK, 0 rows affected (0.03 sec)

以上执行结果证明视图修改成功,可以使用SELECT语句查看视图,SQL语句如下所示。

mysql> SELECT * FROM view_emp;

+------+-----+

| NAME | AGE |

+------+-----+

| 孙一 | 20 |

| 钱二 | 21 |

| 张三 | 22 |

| 李四 | 23 |

| 王五 | 24 |

| 赵六 | 25 |

| 田七 | 26 |

+------+-----+

7 rows in set (0.00 sec)

从以上执行结果可看出,视图view_emp修改成功,通过ALTER语句的执行,视图只展示了员工姓名和员工年龄。

8.2.5​ 更新视图

因为视图是虚拟表,所以更新视图中的数据时,实际上是在更新建立视图的基本表中的数据,例如删除视图中的数据,基本表中的数据也同样被删除,因此更新视图时要小心谨慎。通过更新视图,可以更新、插入和删除对应基本表中的数据,接下来详细讲解这三种更新视图的方式。

1.使用UPDATE语句更新视图

修改视图中的数据可以使用UPDATE语句,具体语法格式如下。

UPDATE 视图名

SET 字段名1=值1 [,字段名2=值2,……]

[WHERE条件表达式];

以上语法格式中,“字段名”用于指定要更新的字段名称,“值”用于表示字段更新的新数据,如果要更新多个字段的值,可以用逗号分隔多个字段和值,“WHERE条件表达式”是可选的,用于指定更新数据需要满足的条件,接下来通过具体案例演示修改视图。

例8-8​ 使用UPDATE语句,将视图view_emp_detail中姓名为“赵六”的员工性别修改为“女”,首先查看视图view_emp_detail中的数据,SQL语句如下所示。

mysql> SELECT * FROM view_emp_detail;

+----+------+-----+

| ID | NAME | SEX |

+----+------+-----+

| 1 | 孙一 | 女 |

| 2 | 钱二 | 女 |

| 3 | 张三 | 男 |

| 4 | 李四 | 女 |

| 5 | 王五 | 女 |

| 6 | 赵六 | 男 |

| 7 | 田七 | 女 |

+----+------+-----+

7 rows in set (0.00 sec)

然后修改数据,SQL语句如下所示。

mysql> UPDATE view_emp_detail

-> SET SEX='女'

-> WHERE NAME='赵六';

Query OK, 0 rows affected (0.10 sec)

Rows matched: 1 Changed: 0 Warnings: 0

以上执行结果证明视图数据修改成功,可以使用SELECT语句查看视图,SQL语句如下所示。

mysql> SELECT * FROM view_emp_detail;

+----+------+-----+

| ID | NAME | SEX |

+----+------+-----+

| 1 | 孙一 | 女 |

| 2 | 钱二 | 女 |

| 3 | 张三 | 男 |

| 4 | 李四 | 女 |

| 5 | 王五 | 女 |

| 6 | 赵六 | 女 |

| 7 | 田七 | 女 |

+----+------+-----+

7 rows in set (0.00 sec)

以上执行结果可以看出,姓名为“赵六”的员工性别修改为“女”,说明视图更新成功,此时还可以查看基本表emp中的数据是否修改,SQL语句如下所示。

mysql> SELECT * FROM emp;

+----+------+-----+-----+------------+--------+------+-------+-------+

| ID | NAME | SEX | AGE | DEPARTMENT | SALARY | HOME | MARRY | HOBBY |

+----+------+-----+-----+------------+--------+------+-------+-------+

| 1 | 孙一 | 女 | 20 | 人事部 | 4000 | 广东 | 否 | 网球 |

| 2 | 钱二 | 女 | 21 | 人事部 | 9000 | 北京 | 否 | 网球 |

| 3 | 张三 | 男 | 22 | 研发部 | 8000 | 上海 | 否 | 音乐 |

| 4 | 李四 | 女 | 23 | 研发部 | 9000 | 重庆 | 否 | 无 |

| 5 | 王五 | 女 | 24 | 研发部 | 9000 | 四川 | 是 | 足球 |

| 6 | 赵六 | 女 | 25 | 销售部 | 6000 | 福建 | 否 | 游戏 |

| 7 | 田七 | 女 | 26 | 销售部 | 5000 | 山西 | 否 | 篮球 |

+----+------+-----+-----+------------+--------+------+-------+-------+

7 rows in set (0.00 sec)

以上执行结果可看出,基本表emp中的数据同样被修改,说明更新视图是直接修改基本表中的数据。

2.使用INSERT语句更新视图

在视图中插入数据可以使用INSERT语句,具体语法格式如下。

INSERT INTO 视图名 VALUES (值1,值2,……);

以上语法格式中,“值1,值2”是每个字段要添加的数据,每个值的顺序、类型必须与表中字段的顺序和类型都对应,接下来通过具体案例演示修改视图。

例8-9​ 使用INSERT语句,向视图view_emp插入数据,NAME为“周八”,AGE为“25”,SQL语句如下所示。

mysql> INSERT INTO view_emp

-> VALUES(

-> '周八',

-> 25

-> );

Query OK, 1 row affected, 3 warnings (0.07 sec)

以上执行结果证明视图数据插入成功,可以使用SELECT语句查看视图,SQL语句如下所示。

mysql> select * from view_emp;

+------+-----+

| NAME | AGE |

+------+-----+

| 孙一 | 20 |

| 钱二 | 21 |

| 张三 | 22 |

| 李四 | 23 |

| 王五 | 24 |

| 赵六 | 25 |

| 田七 | 26 |

| 周八 | 25 |

+------+-----+

8 rows in set (0.00 sec)

以上执行结果可看出,视图view_emp中多出了一条数据,实际上这也是直接向基本表中插入了数据。

3.使用DELETE语句更新视图

删除视图中的数据可以使用DELETE语句,具体语法格式如下。

DELETE FROM 表名 [WHERE 条件表达式];

以上语法中,WHERE条件语句是可选的,用于指定删除数据满足的条件,通过DELETE语句可以删除全部数据或者删除部分数据,接下来针对这两种情况分别进行讲解。

例8-10​ 使用DELETE语句,删除视图view_emp中NAME为“周八”的数据,SQL语句如下所示。

mysql> DELETE FROM view_emp

-> WHERE NAME='周八';

Query OK, 1 row affected (0.09 sec)

以上执行结果证明视图数据删除成功,可以使用SELECT语句查看视图,SQL语句如下所示。

mysql> select * from view_emp;

+------+-----+

| NAME | AGE |

+------+-----+

| 孙一 | 20 |

| 钱二 | 21 |

| 张三 | 22 |

| 李四 | 23 |

| 王五 | 24 |

| 赵六 | 25 |

| 田七 | 26 |

+------+-----+

7 rows in set (0.00 sec)

以上执行结果可看出,视图view_emp中NAME为“周八”的数据已经删除,实际上这也是直接删除了基本表中的数据。

8.2.6​ 删除视图

在删除视图时,当前用户必须具有删除视图的权限。此时登录的是root用户,具体删除视图的权限,这里就不再验证,删除视图的语法格式如下所示。

DROP VIEW[IF EXISTS] 视图名[,视图名1]… [RESTRICT | CASCADE];

以上语法格式中,视图名是要删除的视图名称,视图名称可以添加多个,各个名称之间用逗号隔开,IF EXISTS是可选参数,用于判断视图是否存在,若存在则删除,接下来通过具体案例演示删除视图。

例8-11​ 将视图view_emp_detail删除,SQL语句如下所示。

mysql> DROP VIEW IF EXISTS view_emp_detail;

Query OK, 0 rows affected (0.00 sec)

以上执行结果证明视图删除成功,可以使用SELECT语句查看视图是否存在,SQL语句如下所示。

mysql> SELECT * FROM view_emp_detail;

ERROR 1146 (42S02): Table 'qianfeng6.view_emp_detail' doesn't exist

以上执行结果证明视图view_emp_detail已经不存在,视图删除成功。

8.3​ 本章小结

通过本章的学习,大家应当重视视图的作用。在实际工作中,可将经常使用的数据定义为视图,视图不仅可以简化用户对数据的理解,也可以简化用户的操作,视图可帮助用户屏蔽真实表结构变化带来的影响。

8.4​ 习题

1.思考题

(1) 请简述创建视图的语法格式。

(2) 请简述查看视图的语法格式。

(3) 请简述修改视图的语法格式。

(4) 请简述更新视图的语法格式。

(5) 请简述删除视图的语法格式。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。