开发者社区> jclian91> 正文

MySQL学习之使用视图

简介:   视图是虚拟的表,在数据库中并不真实存在,它只包含使用时动态检索数据的查询。MySQL从5.0.1 版本开始提供视图功能。   视图相对于普通表的优点有: 重用SQL语句,简化复杂的SQL操作。
+关注继续查看

  视图是虚拟的表,在数据库中并不真实存在,它只包含使用时动态检索数据的查询。MySQL从5.0.1 版本开始提供视图功能。
  视图相对于普通表的优点有:

  • 重用SQL语句,简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道其基本查询细节。
  • 使用表的一部分而不是整个表。
  • 保护数据。可以授予用户访问表的特定部分的权限,而不是整个表的访问权限。
  • 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。
  • 数据独立。一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

视图的基本操作有:创建或修改视图、删除视图,以及查看视图定义。

一、创建或修改视图操作

  创建视图需要有CREATE VIEW 的权限,并且对于查询涉及的列有SELECT 权限。如果使用CREATE OR REPLACE 或者ALTER修改视图,那么还需要该视图的DROP 权限。创建或修改视图的语法为:

(CREATE|REPLACE)/ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

其中WITH [CASCADED | LOCAL] CHECK OPTION 决定了是否允许更新数据使记录不再满足视图的条件:

  • LOCAL 是只要满足本视图的条件就可以更新;
  • CASCADED (默认)则是必须满足所有针对该视图的所有视图的条件才可以更新。

MySQL 创建或使用视图常见的规则与限制有:

  • 必须唯一命名;
  • 视图数目没有限制;
  • 视图可以嵌套;
  • ORDER BY可以在视图中使用,但如果从该视图检索数据SELECT中也含有ORDER BY,那么该视图的ORDER BY将被覆盖;
  • 视图不能索引,不能有关联的触发器或默认值;
  • 视图可以和表一起使用,如编写一条联接表和视图的SELECT语句;
  • 在FROM 关键字后面不能包含子查询。

  最重要的还是例子!我们的数据来源于http://www.forta.com/books/0672336073/ 创建的数据表,下载该网页的MySQL (and MariaDB) SQL scripts文档,并在MySQL中执行创建好表格。关于这5张表的说明,可参看样例表说明
  我们将结合实例讲述视图的实际操作及其作用。
  
例1.利用视图简化复杂的联接

create view ProductCustomers as
select cust_name, cust_contact, prod_id
from customers, orders, orderitems
where customers.cust_id = orders.cust_id
and orderitems.order_num = orders.order_num;

这样我们就创建了一个名为ProductCustomers的视图,它联接了三个表,返回已订购了任意产品的所有顾客的列表。如果我们想检索出订购了产品RGAN01的顾客,可进行如下查询:

select cust_name, cust_contact from ProductCustomers where prod_id = 'RGAN01';

结果如下:
VIEW1
   可以看出,视图极大地简化了复杂SQL语句的使用。利用视图,可一次性编写基础的SQL,然后根据需要多次使用。
   
例2.用视图过滤不想要的数据
  可以定义CustomerEmailList视图,过滤掉没有电子邮件的顾客,代码如下:

create view CustomerEmailList AS
select cust_id, cust_name, cust_email
from customers
where cust_email is not null;

  现在可以像使用普通表一样使用视图CustomerEmailList.

select * from CustomerEmailList;

VIEW2

例3.使用视图与计算字段
  检索某个订单中的物品,计算每种物品的总价格:

create view OrderItemsExpanded AS
select order_num, prod_id, quantity, item_price, quantity*item_price as expanded_price
from orderitems;

  我们检索订单20008的详细内容,操作如下:

select * from OrderItemsExpanded  where order_num = 20008;

VIEW3

例4. WITH [CASCADED | LOCAL] CHECK OPTION的使用

#WITH LOCAL CHECK OPTION orderitems_view
create view orderitems_view as
select * from orderitems
where quantity>50 WITH LOCAL CHECK OPTION;
#WITH CHECK OPTION orderitems_view1
create view orderitems_view1 as
select * from orderitems
where quantity>50 WITH CHECK OPTION;
#orderitems_view2 from orderitems_view1
create view orderitems_view2 as
select * from orderitems_view1
where quantity<250 WITH CHECK OPTION;

该段代码创建了三个视图,其中orderitems_view是WITH LOCAL CHECK OPTION的,而orderitems_view1,orderitems_view是WITH CHECK OPTION的。我们执行更新操作:

update orderitems_view set quantity = 300 where prod_id = 'BR03';
update orderitems_view2 set quantity = 300 where prod_id = 'BR03';

执行结果如下:
VIEW4
  另外,需要指出的是,视图的可更新性和视图中查询的定义有关系,以下类型的视图是不可更新的。

  • 包含以下关键字的SQL 语句:聚合函数(SUM,MIN,MAX,COUNT 等),DISTINCT,GROUP BY,HAVING,JOIN,UNION ,UNION ALL;
  • 常量视图;
  • SELECT 中包含子查询
  • FROM 一个不能更新的视图;
  • WHERE 字句的子查询引用了FROM 字句中的表.

  
二、删除视图操作
用户可以一次删除一个或者多个视图,前提是必须有该视图的DROP 权限。其语法如下:

DROP VIEW [IF EXISTS] view_name [, view_name] ...[RESTRICT | CASCADE]

例如:

drop view OrderItemsExpanded;

三、查看视图操作
  从MySQL 5.1 版本开始,使用SHOW TABLES 命令的时候不仅显示表的名字,同时也会显示视图的名字,而不存在单独显示视图的SHOW VIEWS 命令。
例如:

show tables;

view5
  在使用SHOW TABLE STATUS 命令的时候,不但可以显示表的信息,同时也可以显示视图的信息。如果需要查询某个视图的定义,可以使用SHOW CREATE VIEW 命令进行查看。最后,通过查看系统表information_schema.views 也可以查看视图的相关信息。
例如:

show create view orderitems_view;

VIEW6



  本次关于MySQL视图使用就写到这儿了~~如有不足之处,还请批评指正,欢迎交流^o^

参考书目:
1.SQL 必知必会(第4版), Ben Forta, 人民邮电出版社
2.深入浅出MySQL

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MySQL超详细学习教程,2023年硬核学习路线(三)
MySQL超详细学习教程,2023年硬核学习路线(三)
15 0
MySQL超详细学习教程,2023年硬核学习路线(二)
MySQL超详细学习教程,2023年硬核学习路线(二)
16 0
MySQL超详细学习教程,2023年硬核学习路线(一)
MySQL超详细学习教程,2023年硬核学习路线(一)
19 0
从零开始学习MySQL调试跟踪(2)
从零开始学习MySQL调试跟踪(2)
50 0
一个Redis的Java客户端Jedis的学习,线程不安全问题的解决及与MySQL的简单的结合
> Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人 Salvatore Sanfilippo 使用 C 语言编写。 > > Redis 遵守 BSD 协议,实现了免费开源,其最新版本是 6.20,常用版本包括 3.0 、4.0、5.0。自 Redis 诞生以来,它以其超高的性能、完美的文档和简洁易懂的源码广受好评,国内外很多大型互联网公司都在使用 Redis,比如腾讯、阿里、Twitter、Github 等等。 简单的来说:Redis是一种极其高效的,迅速的一种基于缓存读写的N
30 0
Mysql碎片整理:视图的学习
视图可以帮助我们做复杂查询时省去细节,也可以对大量重复的sql语句做简化,因为它是一个别名的存在,视图并不真的存数据内容,它还是调用底层的sql代码。尽量不要对视图做修改。
16 0
MySQL学习
MySQL学习 MySQL的DML操作 MySQL的约束 Mysql的查询
11 0
如何学习MySQL,这几本书初学者必看!
《高性能MySQL》第四版发布后,收到了很多读者的反馈,其中关注最多的是作为一个初学者,应该如何能够较为系统的学习MySQL,从而应对日常工作或者获得更好的职业发展。于是和多个业内朋友讨论后,整理了一些MySQL学习的推荐资源,供初学者参考。本文分成几部分,包括业界专家的经验、推荐书籍、视频/音频资源、其他资源或者学习方式、MySQL学习沟通群、抽奖赠书等。对于不同基础的人,学习的重点和方法是各有不同的,所以本文会列举主要的MySQL数据库的学习资源和方法,读者需要结合自己的实际情况选择合适的方法。如果你有好的经验分享,可以在留言评论谈谈你的经验。
299 0
+关注
jclian91
热爱算法,热爱技术,热爱生活,期待更好的自己与明天~
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
高效MySQL的N个习惯
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像