视图
一、MySQL视图
1.1.视图的含义
- 视图是一个虚拟表,是从数据库中一个或是多个表导出来的表。视图也可以从已经存在的视图基础上定义。
- 单表视图可以进行增、删、改。对视图的操作语法和操作表一致。
- 联表视图无法进行DML
1.1.1 视图基本操作:
- 查看MySQL所有的视图
mysql> show table status where comment='view'G
- 创建视图
mysql> create ALGORITHM=[MERGE/TEMPTABLE/UNDEFINED] view view_name as (select * from test); 或是: mysql> create view view_name(v_id,v_class) as (select s_id,class from stu_info);
补充:
- 视图的ALGORITHM
- ALGORITHM = MERGE/TEMPTABLE/UNDEFINED
MERGE:当使用视图时,会把查询视图的语句和创建视图的语句合并起来,形成一条语句,最后再从基表中查询
TEMPTABLE:当使用视图时,会把创建视图的语句的查询结果当成一张临时表,再从临时表中进行筛选
UNDEFINED:未定义,自动,让系统帮你选
- 视图的检查:
mysql> show table status like 'view_name'G 或是: mysql> desc [describe] view_name;
- 视图的修改:
mysql> alter view view_name as (select * from test01); 或是: mysql> create or replace view view_name as (select * from test);
- 视图的删除:
mysql> drop view view_name;
1.2.视图案例
- 有两张基本表:student和stu_info,按要求只公布id号、姓名和班级。
表结构如下:
表 |
字段1 |
字段2 |
字段3 |
student |
s_id |
name |
—— |
stu_info |
s_id |
class |
addr |
1.2.1.创建表和数据
mysql> create table student ( s_id int, name varchar(40) ); mysql> insert into student values(1,'tansk'), (2,'tanmy'); mysql> create table stu_info( s_id int, class varchar(40), addr varchar(90)); mysql> insert into stu_info values('001','1011','gz'),(002,'1012','nn');
查看表数据:
mysql> select * from student; +------+-------+ | s_id | name | +------+-------+ | 1 | tansk | | 2 | tanmy | +------+-------+ 2 rows in set (0.00 sec) mysql> select * from stu_info; +------+-------+------+ | s_id | class | addr | +------+-------+------+ | 1 | 1011 | gz | | 2 | 1012 | nn | +------+-------+------+ 2 rows in set (0.00 sec) mysql>
1.2.2.编写查询SQL
注意:一般的都是先写好查询SQL,在进行视图创建。因为视图中引用的就是这一条SQL
方法一(普通查询):
mysql> select a.s_id,a.name, b.class from student as a,stu_info as b where a.s_id=b.s_id; +------+-------+-------+ | s_id | name | class | +------+-------+-------+ | 1 | tansk | 1011 | | 2 | tanmy | 1012 | +------+-------+-------+ 2 rows in set (0.04 sec) mysql>
方法二(外连接,推荐使用):
mysql> select a.s_id,a.name, b.class from student as a left join stu_info as b on a.s_id=b.s_id ; +------+-------+-------+ | s_id | name | class | +------+-------+-------+ | 1 | tansk | 1011 | | 2 | tanmy | 1012 | +------+-------+-------+ 2 rows in set (0.00 sec) mysql>
1.2.3.创建视图
mysql> create view view_stuAndinfo_01 as ( select a.s_id,a.name, b.class from student as a,stu_info as b where a.s_id=b.s_id); 或是: mysql> create view view_stuAndinfo_02 as (select a.s_id,a.name, b.class from student as a left join stu_info as b on a.s_id=b.s_id);
查询视图:
mysql> select * from view_stuAndinfo_01; +------+-------+-------+ | s_id | name | class | +------+-------+-------+ | 1 | tansk | 1011 | | 2 | tanmy | 1012 | +------+-------+-------+ 2 rows in set (0.03 sec) mysql> select * from view_stuAndinfo_02; +------+-------+-------+ | s_id | name | class | +------+-------+-------+ | 1 | tansk | 1011 | | 2 | tanmy | 1012 | +------+-------+-------+ 2 rows in set (0.00 sec) mysql>
1.2.4.查看视图属性
mysql> show table status like 'view_stuAndinfo_01'G *************************** 1. row *************************** Name: view_stuAndinfo_01 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) mysql>
1.3 视图的作用
- 提高了重用性,就和函数一样 --当频繁获取一些数据的时候,减少了写SQL的过程
- 提高了安全性。对不同的用户创建不同的视图,每个用户跟进可以看到的信息不同
- 简化查询,提高了查询性能
- 提高灵活性,在生产中如果修改表结构导致工作量比较大,可以使用视图(虚拟表)的形式达到修改表结构的效果。