数据库组成视图
15.1 视图概述
MySQL从5.0版本开始支持视图。视图能够方便开发人员对数据进行增、删、改、查等操作。不仅如此,访问视图能够根据相应的权限来限制用户直接访问数据库中的数据表,在一定程度上,能够保障数据库的安全性。
15.1.1 视图的概念
视图可以由数据库中的一张表或者多张表生成,在结构上与数据表类似,但是视图本质上是一张虚拟表,视图中的数据也是由一张表或多张表中的数据组合而成。可以对视图中的数据进行增加、删除、修改、查看等操作,也可以对视图的结构进行修改。
在数据库中,视图不会保存数据,数据真正保存在数据表中。当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化;反之亦然。也就是说,不管是视图中的数据发生变化,还是数据表中的数据发生变化,另一方的数据也会相应地变化。
15.1.2 视图的优点
在数据库中使用视图存在诸多优点,这里列举几个使用视图相对于使用数据表的优势。
1.操作简单
将经常使用的查询操作定义为视图,可以使开发人员不需要关心视图对应的数据表的结构、表与表之间的关联关系,也不需要关心数据表之间的业务逻辑和查询条件,而只需要简单地操作视图即可,极大简化了开发人员对数据库的操作。
2.数据安全
MySQL根据权限将用户对数据的访问限制在某些数据的结果集上,而这些数据的结果集可以使用视图来实现。因此,可以根据权限将用户对数据的访问限制在某些视图上,而不必直接查询或操作数据表,这在一定程度上保障了数据表中数据的安全性。
3.数据独立
视图创建完成后,视图的结构就被确定了,当数据表的结构发生变化时不会影响视图的结构。当数据表的字段名称发生变化时,只需要简单地修改视图的查询语句即可,而不会影响用户对数据的查询操作。
4.适应灵活多变的需求
当业务系统的需求发生变化后,如果需要改动数据表的结构,则工作量相对较大,可以使用视图来减少改动的工作量。这种方式在实际工作中使用得比较多。
5.能够分解复杂的查询逻辑
数据库中如果存在复杂的查询逻辑,则可以将问题进行分解,创建多个视图获取数据,再将创建的多个视图结合起来,完成复杂的查询逻辑。
15.2 创建视图
MySQL中使用CREATE VIEW语句创建视图。本节简单介绍如何在MySQL中创建视图。
注意:本章中使用的测试表为第8章中创建的t_goods数据表和t_goods_category数据表。
15.2.1 语法格式
MySQL中可以使用CREATE VIEW语句创建视图,创建视图的语法格式如下:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
语法格式说明如下:
·CREATE:新建视图。
·REPLACE:替换已经存在的视图。
·ALGORITHM:标识视图使用的算法。
·{UNDEFINED | MERGE | TEMPTABLE}:视图使用的算法。其中,UNDEFINED表示MySQL会自动选择算法;MERGE表示将引用视图的语句与视图定义进行合并;TEMPTABLE表示将视图的结果放置到临时表中,接下来使用临时表执行相应的SQL语句。
·DEFINER:定义视图的用户。
·SQL SECURITY:安全级别。DEFINER表示只有创建视图的用户才能访问视图;INVOKER表示具有相应权限的用户能够访问视图。
·view_name:创建的视图名称。
·column_list:视图中包含的字段名称列表。
·select_statement:SELECT语句。
·[WITH [CASCADED | LOCAL] CHECK OPTION]:保证在视图的权限范围内更新视图。
15.2.2 创建单表视图
例如,基于t_goods数据表创建一个名称为view_name_price的视图,视图中的字段只包含t_goods数据表中的t_name字段和t_price字段。
mysql> CREATE VIEW view_name_price
-> AS
-> SELECT t_name, t_price FROM t_goods;
Query OK, 0 rows affected (0.13 sec)
结果显示SQL语句执行成功。
查看view_name_price视图中的数据。
mysql> SELECT * FROM view_name_price;
+-----------------+---------+
| t_name | t_price |
+-----------------+---------+
| T恤 | 39.90 |
| 连衣裙 | 79.90 |
| 卫衣 | 79.90 |
| 牛仔裤 | 89.90 |
| 百褶裙 | 29.90 |
| 呢绒外套 | 399.90 |
| 自行车 | 399.90 |
| 山地自行车 | 1399.90 |
| 登山杖 | 59.90 |
| 骑行装备 | 399.90 |
| 运动外套 | 799.90 |
| 滑板 | 499.90 |
| 葡萄 | 49.90 |
| 香蕉 | 39.90 |
+-----------------+---------+
14 rows in set (0.00 sec)
view_name_price视图中只包含t_goods数据表的t_name字段和t_price字段,查询出的结果列字段名称与t_goods数据表的字段名称一样。
也可以在创建视图时,将数据表的所有字段都包含在视图中。例如,创建名称为view_all_price的视图,其中包含t_goods数据表中的所有字段。
mysql> CREATE VIEW view_all_price
-> AS
-> SELECT * FROM t_goods;
Query OK, 0 rows affected (0.00 sec)
查询view_all_price视图中的数据。
mysql> SELECT * FROM view_all_price;
+----+---------------+-----------------+-------------+---------+---------+---------------------+
| id | t_category_id | t_category | t_name | t_price | t_stock | t_upper_time |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
| 1 | 1 | 女装/女士精品 | T恤 | 39.90 | 1000 | 2020-11-10 00:00:00 |
| 2 | 1 | 女装/女士精品 | 连衣裙 | 79.90 | 2500 | 2020-11-10 00:00:00 |
| 3 | 1 | 女装/女士精品 | 卫衣 | 79.90 | 1500 | 2020-11-10 00:00:00 |
| 4 | 1 | 女装/女士精品 | 牛仔裤 | 89.90 | 3500 | 2020-11-10 00:00:00 |
| 5 | 1 | 女装/女士精品 | 百褶裙 | 29.90 | 500 | 2020-11-10 00:00:00 |
| 6 | 1 | 女装/女士精品 | 呢绒外套 | 399.90 | 1200 | 2020-11-10 00:00:00 |
| 7 | 2 | 户外运动 | 自行车 | 399.90 | 1000 | 2020-11-10 00:00:00 |
| 8 | 2 | 户外运动 | 山地自行车 | 1399.90 | 2500 | 2020-11-10 00:00:00 |
| 9 | 2 | 户外运动 | 登山杖 | 59.90 | 1500 | 2020-11-10 00:00:00 |
| 10 | 2 | 户外运动 | 骑行装备 | 399.90 | 3500 | 2020-11-10 00:00:00 |
| 11 | 2 | 户外运动 | 运动外套 | 799.90 | 500 | 2020-11-10 00:00:00 |
| 12 | 2 | 户外运动 | 滑板 | 499.90 | 1200 | 2020-11-10 00:00:00 |
| 13 | 5 | 水果 | 葡萄 | 49.90 | 500 | 2020-11-10 00:00:00 |
| 14 | 5 | 水果 | 香蕉 | 39.90 | 1200 | 2020-11-10 00:00:00 |
+----+---------------+-----------------+-------------+---------+---------+---------------------+
14 rows in set (0.00 sec)
view_all_price视图的结构与t_goods数据表结构一样,同时包含t_goods数据表中的所有数据。
默认情况下,创建的视图的字段名称和数据表的字段名称一样,也可以在创建视图时为视图指定字段名称。例如创建一个名称为view_name_price_tag的视图,并指定视图中的两个字段名称为name和price。
mysql> CREATE VIEW view_name_price_tag
-> (name, price)
-> AS
-> SELECT t_name, t_price FROM t_goods;
Query OK, 0 rows affected (0.00 sec)
查询view_name_price_tag视图中的数据。
mysql> SELECT * FROM view_name_price_tag;
+-------------+---------+
| name | price |
+-------------+---------+
| T恤 | 39.90 |
| 连衣裙 | 79.90 |
| 卫衣 | 79.90 |
| 牛仔裤 | 89.90 |
| 百褶裙 | 29.90 |
| 呢绒外套 | 399.90 |
| 自行车 | 399.90 |
| 山地自行车 | 1399.90 |
| 登山杖 | 59.90 |
| 骑行装备 | 399.90 |
| 运动外套 | 799.90 |
| 滑板 | 499.90 |
| 葡萄 | 49.90 |
| 香蕉 | 39.90 |
+-------------+---------+
14 rows in set (0.00 sec)
查询结果列的名称为创建视图时为视图指定的字段名称。
MySQL支持在创建视图时为SELECT语句设置查询条件,当设置查询条件时,只有符合查询条件的数据才能在视图中出现。例如,创建名称为view_goods_consition的视图并指定查询条件。
mysql> CREATE VIEW view_goods_consition
-> (name, price)
-> AS
-> SELECT t_name, t_price FROM t_goods
-> WHERE id = 1;
Query OK, 0 rows affected (0.01 sec)
创建视图时,为SELECT语句指定的查询条件为id=1,此时,视图中只会包含t_goods数据表中id值为1的数据。查看view_goods_consition视图中的数据。
mysql> SELECT * FROM view_goods_consition;
+-------------+---------+
| name | price |
+-------------+---------+
| T恤 | 39.90 |
+-------------+---------+
1 row in set (0.00 sec)
view_goods_consition视图中只包含id为1的商品的名称和价格。
15.2.3 创建多表联合视图
MySQL支持在多张数据表上创建联合视图,例如,在t_goods_category数据表和t_goods数据表上创建一个名称为view_category_goods的视图。
mysql> CREATE VIEW view_category_goods
-> (category, name, price)
-> AS
-> SELECT category.t_category, goods.t_name, goods.t_price
-> FROM t_goods_category category, t_goods goods
-> WHERE category.id = goods.t_category_id;
Query OK, 0 rows affected (0.00 sec)
查看view_category_goods视图中的数据。
mysql> SELECT * FROM view_category_goods;
+-----------------+-------------+---------+
| category | name | price |
+-----------------+-------------+---------+
| 女装/女士精品 | T恤 | 39.90 |
| 女装/女士精品 | 连衣裙 | 79.90 |
| 女装/女士精品 | 卫衣 | 79.90 |
| 女装/女士精品 | 牛仔裤 | 89.90 |
| 女装/女士精品 | 百褶裙 | 29.90 |
| 女装/女士精品 | 呢绒外套 | 399.90 |
| 户外运动 | 自行车 | 399.90 |
| 户外运动 | 山地自行车 | 1399.90 |
| 户外运动 | 登山杖 | 59.90 |
| 户外运动 | 骑行装备 | 399.90 |
| 户外运动 | 运动外套 | 799.90 |
| 户外运动 | 滑板 | 499.90 |
+-----------------+-------------+---------+
12 rows in set (0.00 sec)
在view_category_goods视图中,caregory字段中的数据是从t_goods_category数据表中获取的,name字段和price字段中的数据是从t_goods数据表中获取的。
也可以使用JOIN语句进行多表之间的关联。例如创建一个名称为view_category_join_goods的视图,结构与view_category_goods视图相同。
mysql> CREATE VIEW view_category_join_goods
-> (category, name, price)
-> AS
-> SELECT category.t_category, goods.t_name, goods.t_price
-> FROM t_goods_category category
-> INNER JOIN t_goods goods
-> ON category.id = goods.t_category_id;
Query OK, 0 rows affected (0.01 sec)
查看view_category_join_goods视图中的数据。
mysql> SELECT * FROM view_category_join_goods;
+-----------------+-------------+---------+
| category | name | price |
+-----------------+-------------+---------+
| 女装/女士精品 | T恤 | 39.90 |
| 女装/女士精品 | 连衣裙 | 79.90 |
| 女装/女士精品 | 卫衣 | 79.90 |
| 女装/女士精品 | 牛仔裤 | 89.90 |
| 女装/女士精品 | 百褶裙 | 29.90 |
| 女装/女士精品 | 呢绒外套 | 399.90 |
| 户外运动 | 自行车 | 399.90 |
| 户外运动 | 山地自行车 | 1399.90 |
| 户外运动 | 登山杖 | 59.90 |
| 户外运动 | 骑行装备 | 399.90 |
| 户外运动 | 运动外套 | 799.90 |
| 户外运动 | 滑板 | 499.90 |
+-----------------+-------------+---------+
12 rows in set (0.00 sec)
view_category_join_goods视图的结构和数据与view_category_goods视图的结构和数据相同。
15.3 查看视图
MySQL中查看视图可以使用SHOW TABLES语句、DESCRIBE/DESC语句、SHOW TABLE STATUS语句和SHOW CREATE VIEW语句。本节就简单介绍一下如何在MySQL中查看视图。
15.3.1 使用SHOW TABLES语句查看视图
从MySQL 5.1版本开始,SHOW TABLES语句不仅能够显示当前数据库中数据表的名称,还能够显示出当前数据库中的视图名称。
例如,使用SHOW TABLES语句查看当前数据库下的数据表和视图。
mysql> SHOW TABLES;
+--------------------------+
| Tables_in_goods |
+--------------------------+
| t_goods |
| t_goods_category |
| vew_all_price |
| view_category_goods |
| view_category_join_goods |
| view_goods_consition |
| view_name_price |
| view_name_price_tag |
+--------------------------+
8 rows in set (0.00 sec)
可以看到,SHOW TABLE语句同时显示出了当前数据库中数据表的名称和视图的名称。
注意:MySQL中不支持使用SHOW VIEWS语句查看视图,示例如下:
mysql> SHOW VIEWS;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'VIEWS' at line 1
结果显示,当使用SHOW VIEWS语句查看视图时,MySQL报错。
15.3.2 使用DESCRIBE/DESC语句查看视图
使用DESCRIBE/DESC语句查看视图的语法格式如下:
DESCRIBE view_name
或者:
DESC view_name
其中,view_name为视图的名称。
例如,使用DESCRIBE语句查看view_category_goods视图的信息。
mysql> DESCRIBE view_category_goods;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| category | varchar(30) | NO | | | |
| name | varchar(50) | YES | | | |
| price | decimal(10,2) | YES | | 0.00 | |
+----------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
使用DESCRIBE语句能够查看视图中的字段,以及字段所使用的数据类型,字段中的数据是否允许为NULL,字段是否是主键或者外键,字段中是否有默认值,是否有附加信息等。
DESC语句的作用与DESCRIBE语句的作用完全相同,使用DESC语句查看view_category_goods视图的信息。
mysql> DESC view_category_goods;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| category | varchar(30) | NO | | | |
| name | varchar(50) | YES | | | |
| price | decimal(10,2) | YES | | 0.00 | |
+----------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
可以看到,与DESCRIBE语句查看的结果信息完全相同。
15.3.3 使用SHOW TABLE STATUS语句查看视图
使用SHOW TABLE STATUS语句查看视图,语法格式如下:
SHOW TABLE STATUS LIKE ‘view_name’
其中,view_name表示视图的名称。
查看view_category_goods视图的信息。
mysql> SHOW TABLE STATUS LIKE 'view_category_goods' \G
*************************** 1. row ***************************
Name: view_category_goods
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: 2019-12-26 13:38:08
Update_time: NULL
Check_time: NULL
Collation: NULL
Checksum: NULL
Create_options: NULL
Comment: VIEW
1 row in set (0.00 sec)
Comment属性的值为VIEW,说明view_category_goods为视图,其他信息为NULL,说明视图是一张虚拟表。为了更好地对比数据表的信息,接下来,使用SHOW TABLE STATUS语句查看t_goods_category数据表的信息。
mysql> SHOW TABLE STATUS LIKE 't_goods_category' \G
*************************** 1. row ***************************
Name: t_goods_category
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 4
Avg_row_length: 4096
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 4
Create_time: 2019-12-20 21:36:46
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
使用SHOW TABLE STATUS语句查看数据的信息时,会显示数据表的存储引擎、版本、数据行数和数据大小等信息。
15.3.4 使用SHOW CREATE VIEW语句查看视图
使用SHOW CREATE VIEW语句查看视图,语法格式如下:
SHOW CREATE VIEW 'view_name'
其中,view_name为视图的名称。
例如,查看view_category_goods视图的信息。
mysql> SHOW CREATE VIEW view_category_goods \G
*************************** 1. row ***************************
View: view_category_goods
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW
`view_category_goods` (`category`,`name`,`price`) AS select `category`.`t_category` AS `t_category`,
`goods`.`t_name` AS `t_name`,`goods`.`t_price` AS `t_price` from (`t_goods_category` `category` join
`t_goods` `goods`) where (`category`.`id` = `goods`.`t_category_id`)
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
1 row in set (0.00 sec)
可以看到,视图的名称和MySQL底层执行创建视图的完整SQL语句的信息。
15.3.5 查看views数据表中的视图信息
MySQL中会将视图的信息存储到information_schema数据库下的views数据表中,可以查看views数据表来查看视图的信息。
mysql> SELECT * FROM information_schema.views \G
################此处省略n行数据#########################
TABLE_CATALOG: def
TABLE_SCHEMA: goods
TABLE_NAME: view_category_goods
VIEW_DEFINITION: select `category`.`t_category` AS `t_category`,`goods`.`t_name` AS `t_name`,
`goods`.`t_price` AS `t_price` from `goods`.`t_goods_category` `category` join `goods`.`t_goods`
`goods` where (`category`.`id` = `goods`.`t_category_id`)
CHECK_OPTION: NONE
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_general_ci
*************************** 106. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: goods
TABLE_NAME: view_category_join_goods
VIEW_DEFINITION: select `category`.`t_category` AS `t_category`,`goods`.`t_name` AS `t_name`,
`goods`.`t_price` AS `t_price` from (`goods`.`t_goods_category` `category` join `goods`.`t_goods`
`goods` on((`category`.`id` = `goods`.`t_category_id`)))
CHECK_OPTION: NONE
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4_general_ci
106 rows in set (0.00 sec)
结果会显示在数据库中创建的所有视图的信息。
15.4 修改视图的结构
MySQL中支持使用CREATE OR REPLACE VIEW语句和ALTER语句来修改视图的结构信息,本节将简单介绍如何修改视图的结构信息。
15.4.1 使用CREATE OR REPLACE VIEW语句修改视图结构
使用CREATE OR REPLACE VIEW语句修改视图结构,语法格式如下:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
语法格式与创建视图的语法格式相同,不再赘述。
CREATE OR REPLACE VIEW语句的含义为如果视图不存在,则创建视图;如果视图存在则更新视图。
例如,创建名称为view_create_replace的视图,视图中包含的字段为t_goods_category数据表中的id字段和t_category字段。
mysql> CREATE VIEW view_create_replace
-> (id, category)
-> AS
-> SELECT id, t_category FROM t_goods_category;
Query OK, 0 rows affected (0.01 sec)
SQL语句执行成功。使用DESC语句查看view_create_replace视图的信息。
mysql> DESC view_create_replace;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | 0 | |
| category | varchar(30) | NO | | | |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
结果显示出了view_create_replace视图的字段信息。
创建名称为view_name_price的视图,由于之前创建过view_name_price视图,因此,使用CREATE OR REPLACE VIEW语句会修改view_name_price视图的结构。首先,查看view_name_price视图的信息。
mysql> DESC view_name_price;
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| t_name | varchar(50) | YES | | | |
| t_price | decimal(10,2) | YES | | 0.00 | |
+---------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
此时,view_name_price视图中只包含t_name和t_price两个字段。
使用CREATE OR REPLACE VIEW语句修改view_name_price视图的结构。
mysql> CREATE OR REPLACE VIEW view_name_price
-> (category, name, price)
-> AS
-> SELECT category.t_category, goods.t_name, goods.t_price
-> FROM t_goods_category category
-> INNER JOIN
-> t_goods goods
-> ON category.id = goods.t_category_id;
Query OK, 0 rows affected (0.00 sec)
SQL语句执行成功。再次查看view_name_price视图的结构。
mysql> DESC view_name_price;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| category | varchar(30) | NO | | | |
| name | varchar(50) | YES | | | |
| price | decimal(10,2) | YES | | 0.00 | |
+----------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
此时,view_name_price视图中包含category、name和price三个字段,说明成功修改了view_name_price视图的结构。
15.4.2 使用ALTER语句修改视图结构
使用ALTER语句修改视图结构,语法格式如下:
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = user]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
从语法格式上看,除了ALTER语句外,其他信息与创建视图时的语法格式相同,不再赘述。
例如,使用ALTER语句修改view_goods_consition视图的结构。首先,查看view_goods_consition视图的结构。
mysql> DESC view_goods_consition;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | varchar(50) | YES | | | |
| price | decimal(10,2) | YES | | 0.00 | |
+----------+---------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
此时,view_goods_consition视图中存在name和price两个字段。使用ALTER语句修改view_goods_consition视图的结构。
mysql> ALTER VIEW view_goods_consition AS
-> SELECT * FROM t_goods
-> WHERE id BETWEEN 1 AND 3;
Query OK, 0 rows affected (0.01 sec)
SQL语句执行成功,查看view_goods_consition视图的结构。
mysql> DESC view_goods_consition;
+---------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| id | int(11) | NO | | 0 | |
| t_category_id | int(11) | YES | | 0 | |
| t_category | varchar(30) | YES | | | |
| t_name | varchar(50) | YES | | | |
| t_price | decimal(10,2) | YES | | 0.00 | |
| t_stock | int(11) | YES | | 0 | |
| t_upper_time | datetime | YES | | NULL | |
+---------------+---------------+------+-----+---------+-------+
7 rows in set (0.01 sec)
view_goods_consition视图的结构已经发生变化,说明使用ALTER语句成功修改了视图的结构信息。
15.5 更新视图的数据
MySQL支持使用INSERT、UPDATE和DELETE语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。
15.5.1 直接更新视图数据
创建名为view_category的视图。
mysql> CREATE VIEW view_category
-> AS
-> SELECT * FROM t_goods_category;
Query OK, 0 rows affected (0.00 sec)
查看view_category视图中的数据。
mysql> SELECT * FROM view_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
+----+---------------------+
4 rows in set (0.00 sec)
查看t_goods_category数据表中的数据。
mysql> SELECT * FROM t_goods_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
+----+---------------------+
4 rows in set (0.00 sec)
通过INSERT、UPDATE和DELETE语句对view_category视图中的数据进行了插入、更新和删除操作。
1.向视图中插入数据
向view_category视图中插入数据。
mysql> INSERT INTO view_category(id, t_category) VALUES (5, '水果');
Query OK, 1 row affected (0.01 sec)
SQL语句执行成功,查看view_category视图中的数据。
mysql> SELECT * FROM view_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
| 5 | 水果 |
+----+---------------------+
5 rows in set (0.00 sec)
此时,view_category视图中新增了一条id为5的数据。
查看t_goods_category数据表中的数据。
mysql> SELECT * FROM t_goods_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
| 5 | 水果 |
+----+---------------------+
5 rows in set (0.00 sec)
此时,t_goods_category数据表中同步添加了一条id为5的数据。
2.更新视图中的数据
例如,将view_category视图中id为5的数据的t_category字段值更新为“图书”。
mysql> UPDATE view_category SET t_category = '图书' WHERE id = 5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
查看view_category视图中的数据。
mysql> SELECT * FROM view_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
| 5 | 图书 |
+----+---------------------+
5 rows in set (0.00 sec)
view_category视图中id为5的数据被更新为“图书”类别。
查看t_goods_category数据表中的数据。
mysql> SELECT * FROM t_goods_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
| 5 | 图书 |
+----+---------------------+
5 rows in set (0.00 sec)
此时,t_goods_category数据表中id为5的数据已经同步修改为“图书”。
3.删除视图中的数据
例如,删除view_category视图中id为5的数据。
mysql> DELETE FROM view_category WHERE id = 5;
Query OK, 1 row affected (0.00 sec)
SQL语句执行成功。查看view_category视图中的数据。
mysql> SELECT * FROM view_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
+----+---------------------+
4 rows in set (0.00 sec)
此时,view_category视图中id为5的数据已经被删除。
查看t_goods_category数据表中的数据。
mysql> SELECT * FROM t_goods_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
+----+---------------------+
4 rows in set (0.00 sec)
可以看到,t_goods_category数据表中id为5的数据已经被同步删除。
15.5.2 间接更新视图数据
间接更新视图数据就是通过更新数据表的数据达到更新视图数据的目的。
1.向数据表中插入数据
例如,向t_goods_category数据表中插入一条id为5、t_category为“电子设备”的记录。
mysql> INSERT INTO t_goods_category(id, t_category) VALUES (5, '电子设备');
Query OK, 1 row affected (0.00 sec)
SQL语句执行成功。查看t_goods_category数据表中的数据。
mysql> SELECT * FROM t_goods_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
| 5 | 电子设备 |
+----+---------------------+
5 rows in set (0.00 sec)
此时,t_goods_category数据表中成功插入了一条id为5的数据记录。
查看view_category视图中的数据。
mysql> SELECT * FROM view_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
| 5 | 电子设备 |
+----+---------------------+
5 rows in set (0.00 sec)
可以看到,view_category视图中同步添加了id为5的数据记录。
2.更新数据表中的数据
例如,将t_goods_category数据表中id为5的数据更新为“车辆配件”。
mysql> UPDATE t_goods_category SET t_category = '车辆配件' WHERE id = 5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
SQL语句执行成功。查看t_goods_category数据表中的数据。
mysql> SELECT * FROM t_goods_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
| 5 | 车辆配件 |
+----+---------------------+
5 rows in set (0.00 sec)
此时,t_goods_category数据表中id为5的数据被修改为“车辆配件”。
查看view_category视图中的数据。
mysql> SELECT * FROM view_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
| 5 | 车辆配件 |
+----+---------------------+
5 rows in set (0.00 sec)
可以看到,view_category视图中id为5的数据被同步修改为“车辆配件”。
3.删除数据表中的数据
删除t_goods_category数据表中id为5的数据。
mysql> DELETE FROM t_goods_category WHERE id = 5;
Query OK, 1 row affected (0.00 sec)
SQL语句执行成功。查看t_goods_category数据表中的数据。
mysql> SELECT * FROM t_goods_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
+----+---------------------+
4 rows in set (0.00 sec)
此时,t_goods_category数据表中id为5的数据已经被删除。
查看view_category视图中的数据。
mysql> SELECT * FROM view_category;
+----+---------------------+
| id | t_category |
+----+---------------------+
| 1 | 女装/女士精品 |
| 2 | 户外运动 |
| 3 | 男装 |
| 4 | 童装 |
+----+---------------------+
4 rows in set (0.00 sec)
可以看到,view_category视图中id为5的数据已经被同步删除。
15.6 删除视图
当数据库不再需要视图时,就可以将视图删除。删除视图的语法格式如下:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
例如,删除名称为view_category的视图。
mysql> DROP VIEW view_category;
Query OK, 0 rows affected (0.00 sec)
查看view_category视图的结构。
mysql> DESC view_category;
ERROR 1146 (42S02): Table 'goods.view_category' doesn't exist
- 点赞
- 收藏
- 关注作者
评论(0)