RDBMS技术之视图
第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) 请简述删除视图的语法格式。
- 点赞
- 收藏
- 关注作者
评论(0)