1 什么是视图
视图:存储的查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色.
使用场景
权限控制的时候,不希望用户访问表中某些含敏感信息的列,比如salary...
关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,简化操作;
注意事项:
修改视图时有些场景会修改原表数据,建议不要对视图数据进行变更操作
2 .视图相关操作
创建:
(1).第一类:create view v as select * from table;
(2).第二类:create view v as select id,name,age from table;
(3).第三类:create view v[vid,vname,vage] as select id,name,age from table;
如果涉及到数据量过大,业务逻辑需要跨表查询等等也可建立一个跨表的视图,有三种情况:
基于同一数据库
这种情况较为简单,只需简单的一行sql命令,如下:
create view v as (select * from table1) union all (select * from table2);
基于不同数据库
这种情况只比上面的sql语句多一个数据库的名字,如下:
create view 数据库1.v as (select * from 数据库1.table1) union all (select * from 数据库2.table2);
或
create view 数据库2.v as (select * from 数据库1.table1) union all (select * from 数据库2.table2);
如果执行第一个sql将在数据库1下建立视图,反之亦然;
基于不同服务器
这种情况稍微麻烦一点,需要先建立一个远程表来访问远程服务器的数据表,然后再对这个刚建立的远程表和本地表进行视图,步骤如下:
(1)、查看MySql是否支持federated引擎
(1).登录Mysql;
(2).mysql>show engines;
(3).如果显示为no,在配置文件中添加:federated (在my.ini),重新启动mysql服务。
(2)、创建远程表
mysql>CREATE TABLE federated_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
other INT(20) NOT NULL DEFAULT '0',
PRIMARY KEY (id)
)
ENGINE=FEDERATEDDEFAULT
CHARSET=utf8
CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';
CONNECTION可以按如下方式进行配置:
(1).CONNECTION='mysql://username:password@hostname:port/database/tablename'
(2).CONNECTION='mysql://username@hostname/database/tablename'
(3).CONNECTION='mysql://username:password@hostname/database/tablename'
(3)、建立视图
create view 本地数据库.v as (select * from 本地数据库.table1) union all (select * from 远程数据库.test_table);
查询:
查看当前库下所有的视图:
mysql> show full tables where table_type like 'VIEW';
查询视图详情:
查看视图的方法包括:DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW及查询information_schema数据库下的views表。
(1)mysql> DESC vproduct;
(2)mysql> SHOW TABLE STATUS LIKE 'vproduct';
(3)mysql> SHOW CREATE VIEW vproduct\G
(4)mysql> SELECT * FROM information_schema.views WHERE TABLE_NAME='vproduct'\G
后两种都可以查看视图的定义
修改视图
通过CREATE OR REPLACE VIEW语句和ALTER语句来修改视图。
(1)CERATE OR REPLACE [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }] VIEW view_name [(column_name, .. ,column_name)] AS SELECT statement [WITH [CASCADED | LOCAL] CHECK OPTION];
(2)ALTER [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }] VIEW view_name [(column_name, .. ,column_name)] AS SELECT statement [WITH [CASCADED | LOCAL] CHECK OPTION];
删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。
DROP VIEW [IF EXISTS] view_name,[view_name] [RESTRICT | CASCADE]