07 MySQL之视图

01-视图的含义

视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。视图还可以从已经存在的视图的基础上定义。

02-创建视图

# 基本语法格式:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS SELECT_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

CREATE表示创建新视图;REPLACE表示替换已经创建的视图;
ALGORITHM表示视图选择的算法;view_name 为视图的名称;
column_list 为属性列;SELECT_statement表示select语句;WITH[CASCADED | LOCAL] CHECK OPTION 参数表示视图在更新时保证在视图的权限范围之内。
ALGORITHM的取值有3个,分别是 UNDEFINED | MERGE | TEMPTABLE,
UNDEFINED 表示MySQL将自动选择算法;
MERGE 表示将使用的视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对应的部分;
TEMPTABLE 表示将视图的结果存入临时表,然后用临时表来执行语句。
CASCADED | LOCAL 为可选参数,CASCADED 为默认值,表示更新视图时要满足所有相关视图和表的条件; 
LOCAL 表示更新视图时满足该视图本身定义的条件即可。

在单表上创建视图:

mysql> mysql> create t (quantity int, price int);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    6
Current database: test_db

Query OK, 0 rows affected (0.15 sec)

mysql> insert into t values (3, 50);
Query OK, 1 row affected (0.01 sec)

mysql> create view view_t as select quantity,price, quantity*price from t;
Query OK, 0 rows affected (0.03 sec)

mysql> select * from views_t;
ERROR 1146 (42S02): Table 'test_db.views_t' doesn't exist
mysql> select * from view_t;
+----------+-------+----------------+
| quantity | price | quantity*price |
+----------+-------+----------------+
|        3 |    50 |            150 |
+----------+-------+----------------+
1 row in set (0.01 sec)

mysql> create view view_t2 (qty, price, total) as select quantity, price, quantity*price from t;
Query OK, 0 rows affected (0.02 sec)

mysql> select * from view_t2;
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|    3 |    50 |   150 |
+------+-------+-------+
1 row in set (0.01 sec)

在多表上创建视图

mysql> create table student (s_id int, name varchar(255));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into student values (1, 'liming'), (2, 'wangwu'), (3, 'lisi');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> create table stu_info (s_id int, glass varchar(255), address varchar(255));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into stu_info values (1, 'wuban', 'jilin'), (2, 'liuban', 'shandong'), (3, 'qiban', 'beijing');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

# 创建视图
mysql> create view stu_glass (id, name, glass) as select student.s_id, student.name, stu_info.glass from student, stu_info where student.s_id = stu_info.s_id;
Query OK, 0 rows affected (0.03 sec)

mysql> select * from stu_glass;
+------+--------+--------+
| id   | name   | glass  |
+------+--------+--------+
|    1 | liming | wuban  |
|    2 | wangwu | liuban |
|    3 | lisi   | qiban  |
+------+--------+--------+
3 rows in set (0.01 sec)

03-查看视图

查看视图是查看数据库中已存在的视图的定义。查看视图必须要有 SHOW VIEW 的权限,MySQL数据库下的user 表中保存着这个信息。

查看视图的方法包括:DESCRIBE、SHOW TABLE STATUS 和 SHOW CREATE VIEW。

DESCRIBE、SHOW TABLE STATUS 和 SHOW CREATE VIEW。

# 1、使用DESCRIBE 语句查看视图基本信息
DESCRIBE 视图名;
例:
mysql> DESCRIBE stu_glass;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(255) | YES  |     | NULL    |       |
| glass | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> DESC view_t;
+----------------+------------+------+-----+---------+-------+
| Field          | Type       | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| quantity       | int(11)    | YES  |     | NULL    |       |
| price          | int(11)    | YES  |     | NULL    |       |
| quantity*price | bigint(21) | YES  |     | NULL    |       |
+----------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

# 2、使用SHOW TABLE STATUS语句查看视图基本信息
语法如下:
SHOW TABLE STATUS LIKE '视图名';
例:
mysql> SHOW TABLE STATUS like 'view_t' \G
*************************** 1. row ***************************
           Name: view_t
         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.00 sec)

# 3、使用 SHOW CREATE VIEW 语句查看视图详细信息
语法如下:
SHOW CREATE VIEW 视图名;
例:
mysql> SHOW CREATE VIEW view_t \G;
*************************** 1. row ***************************
                View: view_t
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`skip-grants user`@`skip-grants host` SQL SECURITY DEFINER VIEW `view_t` AS select `t`.`quantity` AS `quantity`,`t`.`price` AS `price`,(`t`.`quantity` * `t`.`price`) AS `quantity*price` from `t`
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

ERROR: 
No query specified

# 4、在views表中查看视图详细信息
在MySQL中,information_schema 数据库下的views表中存储了所有视图的定义。通过对views表的查询,可以查看数据库中所有视图的详细信息,查询语句如下:
SELECT * FROM information_schema.views;
查询结果太长就不在这里显示,结果显示当前以及定义的所有视图的详细信息,在这里也可以看到前面定义的 stu_glass、view_t 视图的详细信息。

04-修改视图

# 1、使用 CREATE OR REPLACE VIEW 语句修改视图
语法如下:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 
VIEW view_name [(column_list)] 
AS SELECT_statement 
[WITH [CASCADED | LOCAL] CHECK OPTION]

修改视图的语句和创建视图的语句是完全一样的。当视图已经存在时,修改语句对视图进行修改;当视图不存在时,创建视图。
例:
mysql> desc view_t;
+----------------+------------+------+-----+---------+-------+
| Field          | Type       | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| quantity       | int(11)    | YES  |     | NULL    |       |
| price          | int(11)    | YES  |     | NULL    |       |
| quantity*price | bigint(21) | YES  |     | NULL    |       |
+----------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> create or replace view view_t as select * from t;
Query OK, 0 rows affected (0.01 sec)

mysql> desc view_t;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES  |     | NULL    |       |
| price    | int(11) | YES  |     | NULL    |       |
+----------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

# 2、使用 ALTER 语句修改视图
语法如下:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 
VIEW view_name [(column_list)] 
AS SELECT_statement 
[WITH [CASCADED | LOCAL] CHECK OPTION]

ALTER VIEW view_t AS SELECT quantity from t;
例:
mysql> desc view_t;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES  |     | NULL    |       |
| price    | int(11) | YES  |     | NULL    |       |
+----------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> ALTER VIEW view_t AS SELECT quantity from t;
Query OK, 0 rows affected (0.02 sec)

mysql> desc view_t;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES  |     | NULL    |       |
+----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

05-更新视图

1、更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。
2、通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对基本表增加或者删除记录。

# 1、使用 UPDATE 语句更新视图 view_t
UPDATE view_t SET quantity=5;
例:
mysql> select * from view_t;
+----------+
| quantity |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

mysql> UPDATE view_t SET quantity=5;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from view_t;
+----------+
| quantity |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)

# 当视图中包含有如下内容时,视图的更新操作将不能被执行:
(1)视图中不包含基本表中被定义为非空的列。
(2)在定义视图的 SELECT 语句后的字段列表中使用了数学表达式。    
(3)在定义视图的SELECT 语句后的字段列表中使用了聚合函数。
(4)在定义视图的SELECT 语句中使用了DISTINCT,UNION,TOP,GROUP BY 或HAVING子句。

06-删除视图

当视图不再需要时,可以将其删除。删除一个或多个使用 DROP VIEW 语句,
语法如下:
DROP VIEW [IF EXISTS]
    view_name [, view_name] ...
    [RESTRICT | CASCADE]
其中,view_name 是要删除的视图名称,可以添加多个需要的视图名称,各个名称之间使用逗号分隔开。
删除视图必须拥有 DROP 权限。
例:
mysql> drop view if exists stu_glass;
Query OK, 0 rows affected (0.01 sec)

猜你喜欢

转载自www.cnblogs.com/pgxpython/p/11725712.html
07