什么是视图?
一张虚表,和真实的表一样。视图包含一系列带有名称的行和列数据。视图是从一个或多个表中导出来的,我们可以通过insert,update,delete来操作视图。当通过视图看到的数据被修改时,相应的原表的数据也会变化。同时原表发生变化,则这种变化也可以自动反映到视图中。
视图具有以下优点:
1* 简单化:看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化操作。经常被使用的查询可以制作成一个视图; 2* 安全性:通过视图用户只能查询和修改所能见到的数据,数据库中其他的数据既看不见也取不到。数据库授权命令可以让每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定的行,列上; 3* 逻辑数据独立性:视图可帮助用户屏蔽真实表结构变化带来的影响。
视图和表的区别以及联系是什么?
两者的区别:
1* 视图是已经编译好的SQL语句,是基于SQL语句的结果集的可视化的表,而表不是; 2* 视图没有实际的物理记录,而表有; 3* 表是内容,视图窗口; 4* 表和视图虽然都占用物理空间,但是视图只是逻辑概念存在,而表可以及时对数据进行修改,但是视图只能用创建语句来修改 ; 5* 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL 语句的集合。从安全角度来说,视图可以防止用户接触数据表,因而不知道表结构 ; 6* 表属于全局模式中的表,是实表。而视图属于局部模式的表,是虚表; 7* 视图的建立和删除只影响视图本身,而不影响对应表的基本表。
两者的联系:
视图是在基本表之上建立的表,它的结构和内容都来自于基本表,它依赖基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本的抽象和逻辑意义上建立的关系。
一、创建视图
1、创建单表视图
1#创建表 2mysql> create table t( 3 -> quantity int, 4 -> price int 5 -> ); 6#插入数据 7mysql> insert into t values(3,50); 8#创建视图 9mysql> create view view_t as select quantity,price,quantity*price as total from t; 10Query OK, 0 rows affected (0.00 sec) 11 12mysql> select * from view_t; 查看视图中的数据 13+----------+-------+-------+ 14| quantity | price | total | 15+----------+-------+-------+ 16| 3 | 50 | 150 | 17+----------+-------+-------+ 181 row in set (0.01 sec)
2、创建多表视图
1#创建基本表 2mysql> create table student( 3 -> s_id int(3) primary key, 4 -> s_name varchar(30), 5 -> s_age int(3), 6 -> s_sex varchar(8) 7 -> ); 8Query OK, 0 rows affected (0.02 sec) 9 10mysql> create table stu_info( 11 -> s_id int(3), 12 -> class varchar(50), 13 -> addr varchar(100) 14 -> ); 15Query OK, 0 rows affected (0.01 sec) 16#插入数据 17mysql> insert into stu_info values 18 -> (1,'erban','anhui'), 19 -> (2,'sanban','chongqing'), 20 -> (3,'yiban','shandong'); 21Query OK, 3 rows affected (0.01 sec) 22Records: 3 Duplicates: 0 Warnings: 0 23#创建视图 24mysql> create view stu_class(id,name,class) as 25 -> select student.s_id,student.s_name,stu_info.class 26 -> from student,stu_info where student.s_id=stu_info.s_id;
3、查看视图的相关信息
1#查看视图的表结构 2mysql> desc stu_class; 3+-------+-------------+------+-----+---------+-------+ 4| Field | Type | Null | Key | Default | Extra | 5+-------+-------------+------+-----+---------+-------+ 6| id | int(3) | NO | | NULL | | 7| name | varchar(30) | YES | | NULL | | 8| class | varchar(50) | YES | | NULL | | 9+-------+-------------+------+-----+---------+-------+ 103 rows in set (0.00 sec) 11#查看视图的基本信息 12mysql> show table status like 'stu_class'\G 13*************************** 1. row *************************** 14 Name: stu_class 15 Engine: NULL 16 Version: NULL 17 Row_format: NULL 18 Rows: NULL 19 Avg_row_length: NULL 20 Data_length: NULL 21Max_data_length: NULL 22 Index_length: NULL 23 Data_free: NULL 24 Auto_increment: NULL 25 Create_time: NULL 26 Update_time: NULL 27 Check_time: NULL 28 Collation: NULL 29 Checksum: NULL 30 Create_options: NULL 31 Comment: VIEW 321 row in set (0.00 sec) 33#查看视图的详细信息 34mysql> show create view stu_class\G 35*************************** 1. row *************************** 36 View: stu_class 37 Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `stu_class` AS select `student`.`s_id` AS `id`,`student`.`s_name` AS `name`,`stu_info`.`class` AS `class` from (`student` join `stu_info`) where (`student`.`s_id` = `stu_info`.`s_id`) 38character_set_client: utf8 39collation_connection: utf8_general_ci 401 row in set (0.00 sec) 41#也可以直接查询information_schema库中的views表,来查看所有的视图 42mysql> select * from information_schema.views where table_schema='test1'\G 43#where后面指定的是一个库名,也就是查看test02这个库中的所有视图
4、修改视图
方法一:
1mysql> create or replace view view_t as select * from t; 2Query OK, 0 rows affected (0.00 sec) 3 4mysql> select * from view_t; 查看修改后的视图 5+----------+-------+ 6| quantity | price | 7+----------+-------+ 8| 3 | 50 | 9+----------+-------+ 101 row in set (0.00 sec)
方法二:
1修改指定视图的列名 2mysql> alter view view_t(abc) as select quantity from t; 3Query OK, 0 rows affected (0.00 sec) 4查看修改后的表结构 5mysql> desc view_t; 6+-------+---------+------+-----+---------+-------+ 7| Field | Type | Null | Key | Default | Extra | 8+-------+---------+------+-----+---------+-------+ 9| abc | int(11) | YES | | NULL | | 10+-------+---------+------+-----+---------+-------+ 11row in set (0.00 sec)
5、更新视图
1)update指令更新
1#查看表以及视图的数据,其中quantity对应视图的abc字段 2mysql> select * from t; 3+----------+-------+ 4| quantity | price | 5+----------+-------+ 6| 3 | 50 | 7+----------+-------+ 81 row in set (0.00 sec) 9 10mysql> select * from view_t; 11+------+ 12| abc | 13+------+ 14| 3 | 15+------+ 161 row in set (0.01 sec) 17 18mysql> update view_t set abc=5; 19Query OK, 1 row affected (0.00 sec) 20Rows matched: 1 Changed: 1 Warnings: 0 21#查看更新后的视图 22mysql> select * from view_t; 23+------+ 24| abc | 25+------+ 26| 5 | 27+------+ 281 row in set (0.00 sec) 29#查看更新后的表 30mysql> select * from t; 31+----------+-------+ 32| quantity | price | 33+----------+-------+ 34| 5 | 50 | 35+----------+-------+ 361 row in set (0.00 sec)
2)insert指令更新
1#查看表的数据 2mysql> select * from t; 3+----------+-------+ 4| quantity | price | 5+----------+-------+ 6| 5 | 50 | 7+----------+-------+ 81 row in set (0.00 sec) 9#查看视图的数据 10mysql> select * from view_t; 11+------+ 12| abc | 13+------+ 14| 5 | 15+------+ 161 row in set (0.00 sec) 17#向表中插入数据 18mysql> insert into t values(3,5); 19Query OK, 1 row affected (0.00 sec) 20#查看视图的数据 21mysql> select * from view_t; 22+------+ 23| abc | 24+------+ 25| 5 | 26| 3 | 27+------+ 282 rows in set (0.00 sec) 29#查看表的数据 30mysql> select * from t; 31+----------+-------+ 32| quantity | price | 33+----------+-------+ 34| 5 | 50 | 35| 3 | 5 | 36+----------+-------+
3) delete指令删除表数据
1#创建新的视图 2mysql> create view view_t2(qty,price,total) as select quantity,price,quantity*price from t; 3mysql> select * from view_t2; 4+------+-------+-------+ 5| qty | price | total | 6+------+-------+-------+ 7| 5 | 50 | 250 | 8| 3 | 5 | 15 | 9+------+-------+-------+ 102 rows in set (0.00 sec) 11#删除视图中的数据 12mysql> delete from view_t2 where price=5; 13Query OK, 1 row affected (0.00 sec) 14#再次查看视图的数据 15mysql> select * from view_t2; 16+------+-------+-------+ 17| qty | price | total | 18+------+-------+-------+ 19| 5 | 50 | 250 | 20+------+-------+-------+ 211 row in set (0.00 sec) 22查看原表的数据 23mysql> select * from t; 24+----------+-------+ 25| quantity | price | 26+----------+-------+ 27| 5 | 50 | 28+----------+-------+ 291 row in set (0.00 sec)
6、删除视图
mysql> drop view view_t;