1.视图简介
为了提高复杂SQL语句的复用性和表操作的安全性,MySql数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储数据值的形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用时动态生成。
视图使程序员只关心感兴趣的某些特定数据和他们所负责的特定任务。这样我们只能看到视图中所定义的数据,而不是视图所引用表中的全部数据,从而提高数据库中数据的安全性。
视图有以下几个特点:
(1)视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。
(2)视图是由基本表(实表)产生的表(虚表)。
(3)视图的建立和删除不影响基本表。
(4)对视图内容的更新(添加,删除和修改)直接影响基本表。
(5)当视图来自多个基本表时,不允许添加和删除数据。
视图的操作包括创建视图,查看视图,删除视图和修改视图。
2. 创建视图
具体讲解之前,请执行以下两条语句,创建一个名为t_product的表并插入四条数据
mysql> create table t_product(id INT,name VARCHAR(20),price FLOAT); Query OK, 0 rows affected (0.03 sec) mysql> insert into t_product values(1,'apple',6.5),(2,'banana',4.5),(3,'orange',1.5),(4,'pear',2.5); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> desc t_product; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | price | float | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) mysql> select * from t_product; +------+--------+-------+ | id | name | price | +------+--------+-------+ | 1 | apple | 6.5 | | 2 | banana | 4.5 | | 3 | orange | 1.5 | | 4 | pear | 2.5 | +------+--------+-------+ 4 rows in set (0.00 sec)
2.1 创建视图的语法形式
从视图的概念可以发现其数据来源于查询语句,因此创建视图的语法为:
create view view_name as 查询语句;示例:创建出隐藏价格字段price的视图view_selectproduct:
mysql> create view view_selectproduct as select id,name from t_product; Query OK, 0 rows affected (0.02 sec)视图的查询就像查询表一样简单:
mysql> select * from view_selectproduct; +------+--------+ | id | name | +------+--------+ | 1 | apple | | 2 | banana | | 3 | orange | | 4 | pear | +------+--------+ 4 rows in set (0.01 sec)
2.2 创建各种视图
2.2.1 封装实现查询语句的视图,即所谓的常量视图
具体语句如下:
create view view_test1 as select 3.1415926;
2.2.2 封装使用聚合函数查询语句的视图
聚合函数包括但不限于SUM,MIN,MAX,COUNT,具体语句如下:
create view view_test2 as select COUNT(name) from t_product;
2.2.3 封装了实现排序功能(ORDER BY)查询语句的视图
具体语句如下:create view view_test3 as select name from t_product order by id desc;
*desc表示降序,asc表示升序。
2.2.4 封装了实现表内连接查询语句的视图
具体语句如下:
create view view_test4 as select s.name from t_student as s ,t_group as g where s.group_id=g.id and g.id=2;
其中,t_student,t_group分别时学生表和分组表,学生表中有一个字段为_id,分组表中有一个字段为id,且都为INT型。
2.2.5 封装了实现表外连接的查询语句视图
具体语句如下:
create view view_test5 as select s.name from t_student as s left join t_group as g on s.group_id=g.id where g.id=2;
2.2.6 封装了实现子查询相关查询语句的视图
具体语句如下:
create view view_test6 as select s.name from t_student as s where s.group_id in (select id from t_group);
2.2.7 封装了实现记录联合(UNION和UNION ALL)查询语句的视图
具体语句如下:create view view_test7 as select id, name from t_student union all select id,name from t_group;
2.3 查看视图
2.3.1 查看视图名:
具体语句:
show tables;
以上语句不仅会显示当前数据库中的数据包名,还会显示视图名。
2.3.2 语句查询视图的详细信息
show table status from table_name \G上述语句会列出当前数据库中表和视图的详细信息,如下所示:
*************************** 2. row *************************** Name: t_product 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: NULL Create_time: 2018-05-13 21:42:08 Update_time: 2018-05-13 21:43:48 Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment: *************************** 3. row *************************** Name: view_selectproduct 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 3 rows in set (0.00 sec)
也可以使用show table查看指定视图的详细信息,具体语句如下:
show table status from database_name like 'view_name';例如显示视图view_selectproduct的详细信息:
mysql> show table status from canvas like 'view_selectproduct' \G *************************** 1. row *************************** Name: view_selectproduct 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)
2.3.3 show create view语句查看视图定义信息
如果像查看视图的定义信息,可以使用如下语句:
show create view view_name;例如,查看视图view_selectproduct视图的定义信息:
mysql> show create view view_selectproduct \G *************************** 1. row *************************** View: view_selectproduct Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_selectproduct` AS select `t_product`.`id` AS `id`,`t_product`.`name` AS `name` from `t_product` character_set_client: utf8 collation_connection: utf8_general_ci 1 row in set (0.00 sec)
2.3.4 DESCRIBE|DESC语句查看视图设计信息
如果想要查看视图的设计信息,可以使用如下语句:describe|desc view_name;例如查看视图view_selectproduct的设计信息:
mysql> desc view_selectproduct; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
2.4 删除视图
删除视图的语法形式如下:
drop view view_name1,view_name2...view_namen;
可以看出执行删除操作可以同时删除多个视图,示例略。
2.5 修改视图
2.5.1 CREATE OR REPLACE VIEW 语句修改视图
MySql提供了可以实现替换的创建视图语法,具体创建语法如下:
create or replace view view_name as 查询语句;示例,重新创建view_selectproduct视图:
mysql> create or replace view view_selectproduct as select name from t_product; Query OK, 0 rows affected (0.02 sec) mysql> desc view_selectproduct; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 1 row in set (0.00 sec)
2.5.2 ALTER修改语句
和修改表一样,alter语句也可以修改视图,具体语法如下:
alter view view_name as 查询语句;例如,使用alter语句修改视图view_selectproduct:
mysql> alter view view_selectproduct as select name,price from t_product; Query OK, 0 rows affected (0.02 sec) mysql> desc view_selectproduct; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | price | float | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
2.6 利用视图操作基本表
2.6.1 检索(查询)数据
通过视图查询数据与通过表查询数据一样,只不过通过视图查询比表更安全,更简单实用。在具体使用时只需要把表名换成视图名即可。
具体语法如下:
select * from view_name;
示例略。
2.6.2 利用视图操作基本表数据
对于视图的操作不仅限于查询,还可以对视图进行更新(增加,删除和更新)数据操作。由于视图时“虚表”,所以对视图数据进行的更新操作,实际是对其基本表数据进行更新操作。在具体更新视图数据时,需要注意以下两点:
(1)对视图数据进行添加,删除会直接影响基本表。
(2)视图来自于多个基本表时,不允许添加和删除数据。
2.6.2.1 添加数据操作
具体语法形式如下:
insert into view_name(属性名1,属性名2...)values(数据1,数据2...); 或者 insert into view_name values(数据1,数据2...);
示例略。
2.6.2.2 删除数据
语法形式如下:
delete from view_name where 条件语句;
示例略。
2.6.2.3 更新数据
语法形式如下:
update view_name set 新的属性值 where 条件语句;
示例:通过更新view_selectproduct中apple的售价为10.5:
mysql> select * from view_selectproduct; +--------+-------+ | name | price | +--------+-------+ | apple | 6.5 | | banana | 4.5 | | orange | 1.5 | | pear | 2.5 | +--------+-------+ 4 rows in set (0.00 sec) mysql> select * from t_product; +------+--------+-------+ | id | name | price | +------+--------+-------+ | 1 | apple | 6.5 | | 2 | banana | 4.5 | | 3 | orange | 1.5 | | 4 | pear | 2.5 | +------+--------+-------+ 4 rows in set (0.00 sec) mysql> update view_selectproduct set price=10.5 where name='apple'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from view_selectproduct; +--------+-------+ | name | price | +--------+-------+ | apple | 10.5 | | banana | 4.5 | | orange | 1.5 | | pear | 2.5 | +--------+-------+ 4 rows in set (0.00 sec) mysql> select * from t_product; +------+--------+-------+ | id | name | price | +------+--------+-------+ | 1 | apple | 10.5 | | 2 | banana | 4.5 | | 3 | orange | 1.5 | | 4 | pear | 2.5 | +------+--------+-------+ 4 rows in set (0.00 sec)