1.初识视图
1.视图的概念和作用
什么是视图:是从一个或多个表中导出来的表,它是一种虚拟存在的表,表的结构和数据都依赖于基本表。
作用:
简化查询语句:简化用户的查询操作,使查询更加快捷。
安全性:更方便的进行权限控制。
逻辑数据独立性:屏蔽真实表结构变化带来的影响。
2.创建视图语法
CREATE[OR REPLACe][ALGORITHM = {
UNDEFINED |MERGE│TEMPTABLE]
[DEFINER= { user | CURRENT_USER]
[SQL SECURITY { DEFINER | INVOKER}]
VIEW view_name [(column_list)]
AS select_statement
[WITH[CASCADED|LOCAL]CHECK OPTION]
- CREATE:表示创建视图的关键字。
- OR REPLACE:可选,表示替换已有视图。
- ALGORITHM:可选,表示视图算法,会影响查询语句的解析方式。
ALGORITHM取值有如下3个:
UNDEFINED:默认,由MySQL自动选择算法。
MERGE:将select_statement和查询视图时的SELECT语句合并起来
查询。
TEMPTABLE:先将select_statement的查询结果存入临时表,然后用
临时表进行查询。
- DEFINER:可选,表示定义视图的用户,与安全控制有关,默认为当前用户。
- SQL SECURITY:可选,用于视图的安全控制。
SQL SECURITY取值有如下2个:
DEFINER:默认,由定义者指定的用户的权限来执行。
INVOKER:由调用视图的用户的权限来执行。
- view_name:表示要创建的视图名称。
- column_list:可选,用于指定视图中的各个列的名称。(默认与SELECT语句查询的列相同)
- AS:表示视图要执行的操作。
- select_statement:一个完整的查询语句,表示从某些表或视图中查出某些满足条件的记录,将这些记录导入视图中。
- WITH CHECK OPTION:可选,用于视图数据操作时的检查条件。若省略此子句,则不进行检查。
取值:
CASCADED:默认,操作数据时要满足所有相关视图和表定义的条件。例如,当在一个视图的基础上创建另一个视图时,进行级联检查。
LOCAL:操作数据时满足该视图本身定义的条件即可。
2.视图管理
1.创建视图
在多表上创建视图
#创建视图
mysql> CREATE VIEW view_goods_cate As
->SELECT g.id,g.name,c.name category_name FROM sh_goods
->LEFT JOIN sh_goods_category c
-> ON g.category_id = c.id;
Query OK,0 rows affected (o.01 sec)
#查询视图
mysql> SELECt * FROM view_goods_cate LIMIT 3;
十————十————————十——————————十
| id l namel category_namel
十————十————————十——————————十
| 1 | 2B铅笔| 文具 |
| 2 | 钢笔 | 文具 |
| 3 | 碳素笔| 文具 |
十————十————————十——————————十
3 rows in set (o.00 sec)
自定义列名称
#创建视图
mysq1> CREATE VIEW view_ goods_ promo (sn, title, promotion_ _price) AS
-> SELECt id, name, price*0.8 FROM sh_ goods;
#②查询视图
mysq1> SELECt * FROM view goods_ promo WHERe sn <= 3;
在创建视图时,自定义列名称的顺序与AS后SELECt字段列表的顺序一-致。
自定义列名称的数量必须与SELECT字段列表的数量- -致。
2.查看视图
1.查看视图字段信息
mysq1> DESC view_ goods_ cate;
2.查看视图状态信息
mysq1> SHOW TABLE STATUS LIKE 'view_ goods_ cate' \G
3.查看创建视图的语句
mysql> SHOW CREATE VIEW view_ goods_ cate \G .
3.修改视图
修改视图:修改数据库中存在的视图的定义。
例如,当基本表中的某些字段发生变化时,视图必须修改才能正常使用。
1.替换已有的视图
#创建视图
mysql> CREATE VIEW view_ goods AS
-> SELECT id, name, price FROM sh_ goods;
Query OK, 0 rows affected (0.01 sec)
#修改已有视图
mysql> CREATE OR REPLACe VIEW view_ goods AS
-> SELECT id, name FROM sh_ goods;
#查看修改结果
mysql> DESC view_ goods;
修改视图语法
ALTER [AL GORITHM = {
UNDEFINED | MERGE| TEMPTABLE}]
[DEFINER = { user | CURRENT_ _USER }]
[SQL SECURITY { DEFINER |INVOKER }]
VIEW view_ name [(column_ list)]
AS SELECt_ statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
使用方法如下所示:
#修改视图
mysql> ALTER VIEW view_ goods AS SELECT id FROM sh_ goods;
#查看修改结果
mysql> DESC view_ goods;
4.修改视图
DROp VIEW [IF EXISTS] view_ name [,view_ name1]...
使用方法如下图所示:
#删除视图
mysql> DROP VIEW view_goods;
Query OK, 0 rows affected (0.00 sec)
#检查视图是否已被删除
mysql> SELECT * FROM view_goods;
ERROR 1146 (42S02) : Table 'shop. view_ goods' doesn't exist
3.视图数据操作
1.添加数据
使用INSERT语句通过视图向基本表添加数据
#创建视图
mysql> CREATE VIEW view_ category AS
-> SELECt id, name FROM sh_goods_category;
Query OK, 0 rows affected (0.01 sec)
#添加数据
mysql> INSERT INTO view_ category VALUES (17, '图书') ;
Query OK,1 row affected (0.00 sec)
#查询添加后的数据
mysql> SELECt id, name FROM sh_ goods_ category WHERe id = 17;
2.修改数据
使用UPDATe语句通过视图修改基本表中的数据
#修改数据
mysql> UPDATE view_category SET name = '家电' WHERe id = 17;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
#查询修改后的数据
mysql> SELECT id, name FROM sh_ goods_ category WHERe id = 17;
3.修改数据
使用DELETe语句通过视图删除基本表中的数据
#删除数据
mysql> DELETE FROM view_category WHERe id = 17;
Query OK, 1 row affected (0.00 sec)
#查询数据是否已经删除
mysql> SELECt id, name FROM sh_goods_category WHERe id = 17;
Empty set (0.00 sec)