视图的定义:
视图(View)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。
视图的优点:
- 使用视图,可以定制用户数据,聚焦特定的数据
根据不同的需求,可以创建不同的视图,满足不同的权限所能查到的数据,也能屏蔽一些隐私性信息。
- 使用视图,可以简化数据操作
一个复杂的查询创建成视图之后,我们只需要一个简单的sql语句查询视图,或者视图进行关联查询,不需要每次都把原来的复杂查询再写一遍。
- 使用视图,基表中的数据就有了一定的安全性
视图是一张虚拟的表,并不实际存放数据,只能看到视图里面所展示出来的数据,不能随意篡改和删除数据,保证了安全性。
- 可以合并分离的数据,创建分区视图
一个大公司,下属都设有很多的分公司,为了管理方便,我们需要统一表的结构,定期查看各公司业务情况,而分别看各个公司的数据很不方便,没有很好的可比性,如果将这些数据合并为一个表格里,就方便多啦,这时我们就可以使用union关键字,将各分公司的数据合并为一个视图。
视图的缺点:
性能:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。
表依赖关系:将根据数据库的基础表创建一个视图。每当更改与其相关联的表的结构时,都必须更改视图
以上定义来源于网络的总结。
创建视图:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
ALGORITHM :创建视图的算法
undefined:未定义(默认的):没有算法
temptable:临时表算法:系统应该先执行视图的select语句,后执行外部查询的语句
merge:合并算法:系统应该先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行(效率高)
select_statement :sql语句
WITH :约束
修改视图:
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
删除视图:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
示例:
create view couponlist as
select t.*,t2.nominalValue from a_zhoukun.t_market_coupon_rule as t
left join a_zhoukun.t_market_coupon_nominal as t2 on t.fk_nominalId = t2.id
where t.`type` = 1
order by t.id desc
视图创建结果:
在基本的理解中,mysql的视图是不能通过传参来动态创建的,创建好视图后结果集也是一定的(随着基表的变化而变化),那么随之而来的问题就是当我们查询把视图作为主表关联其他表来做关联查询(或者多个视图关联查询)之后,它们所产生的笛卡尔积的数量就会比较大。而当数据量非常大的时候,查询的效率就会变的很低。
为了解决这个问题,我可以使用传参的方法来动态的生成视图,这样能很有效的减少笛卡尔积的数量,加快查询的效率
创建set_user的函数
DELIMITER //
create FUNCTION set_user(mobilePhone VARCHAR(20))
returns varchar(20)
BEGIN
set @mobilePhone = mobilePhone;
return @mobilePhone;
END
//
DELIMITER ;
创建getuser函数
DELIMITER //
create FUNCTION get_user()
returns varchar(20)
BEGIN
return @mobilePhone;
END
//
DELIMITER ;
创建视图:
DELIMITER //
create view user_view
AS
select mobile_phone,reg_source,user_name from b_user_reg where mobile_phone = bh_user.get_user();
//
DELIMITER ;
查询视图:
select * from user_view where set_user('13100000001') = '13100000001';