什么是视图:是从一个或多个表中导出来的表,它是一种虚拟存在的表,表的结构和数据都依赖于基本表。
简化查询语句:简化用户的查询操作,使查询更加快捷。
安全性:更方便的进行权限控制。
逻辑数据独立性:屏蔽真实表结构变化带来的影响。
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]
ALGORITHM取值有如下3个:
UNDEFINED:默认,由MySQL自动选择算法。
MERGE:将select_statement和查询视图时的SELECT语句合并起来
查询。
TEMPTABLE:先将select_statement的查询结果存入临时表,然后用
临时表进行查询。
SQL SECURITY取值有如下2个:
DEFINER:默认,由定义者指定的用户的权限来执行。
INVOKER:由调用视图的用户的权限来执行。
取值:
CASCADED:默认,操作数据时要满足所有相关视图和表定义的条件。例如,当在一个视图的基础上创建另一个视图时,进行级联检查。
LOCAL:操作数据时满足该视图本身定义的条件即可。
在多表上创建视图
#创建视图
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字段列表的数量- -致。
mysq1> DESC view_ goods_ cate;
mysq1> SHOW TABLE STATUS LIKE 'view_ goods_ cate' \G
mysql> SHOW CREATE VIEW view_ goods_ cate \G .
修改视图:修改数据库中存在的视图的定义。
例如,当基本表中的某些字段发生变化时,视图必须修改才能正常使用。
#创建视图
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;
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
使用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;
使用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;
使用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)