热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL学习之使用视图

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

  视图是虚拟的表,在数据库中并不真实存在,它只包含使用时动态检索数据的查询。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;

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

update orderitems_view set quantity &#61; 300 where prod_id &#61; &#39;BR03&#39;;
update orderitems_view2 set quantity &#61; 300 where prod_id &#61; &#39;BR03&#39;;

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

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

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

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

例如&#xff1a;

drop view OrderItemsExpanded;

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

show tables;

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

show create view orderitems_view;

VIEW6




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

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


推荐阅读
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
author-avatar
你问什么只为她停留_538
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有