视图

     视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。
理解视图最好的办法就是来看一下例子:
SELECT cust_name , cust_contact
FROM customers , orders,orderitems
WHERE customers.cust_id = orders.cust_id
AND orderitems.order_num = orders.order_num
AND prod_id = 'TNT2';
结果如下:
+----------------+--------------+
| cust_name | cust_contact |
+----------------+--------------+
| Coyote Inc. | Y Lee |
| Yosemite Place | Y Sam |
+----------------+--------------+
      此查询用来检索订购了某个特定产品的客户。任何需要这个数据的人都必须理解相关表的结构,包括如何创建查询以及对表的联结。为了检索其他的产品的相同数据,必须修改最后的where字句。
     现在,加入可以把这个查询包装成一个名为productcustomers的虚拟表,测可以如下轻松的检索出相同的数据:
select cust_name , cust_contact
from productcustomers
where prod_id = 'TNT2';
     这就是视图的作用,productcustomers是一个视图,作为视图,他不包含表中应该用的任何列或数据,他包含的是一个sql查询(与上面用以正确联结表的查询相同的查询)。
 
为什么使用视图
    我们看到了视图的一个例子,下面看一下视图的常见的应用:
        1、重用sql语句
        2、简化复杂的sql操作。在编写查询后,可以很方便的重用他,而不必知道他的基本查询细节。
        3、使用表的组成部分而不是整个表。
        4、保护数据。可以给用户授予表的特定部分的访问权限。
        5、更改数据的格式和表示。视图可返回与底层表的表示与格式不同的数据。
      在视图创建了之后,可以用与表基本相同的方式利用它。可以对视图进行SELECT操作,过滤与排序数据,将视图联结到其他的视图和表,甚至能添加和更新数据(添加和更新数据需要一定的限制 )。
      重要的是知道视图仅仅是用来查看存储在别处的数据的一种设施。视图本身不包含数据。因为他们返回的数据是从其他表中查询而来。再添加和更改这些表中的数据后,视图将会返回改变过的数据。
      性能注意:因为视图不包含数据,所以每次使用它时,都必须处理查询执行时所需的任一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,可能会发现性能下降的很厉害。因此在部署大量的视图应用之前,需要对视图的性能做测试。
 
视图的规则和限制
    下面是对于视图的创建和使用的一些最常见的规则与限制:
        1、与表一样视图必须唯一命名。(不能给视图取和别的视图或者是表相同的名字)
        2、对于可以创建的视图个数是没有限制的。
        3、为了创建视图,必须有足够的权限,这些权限是有数据库管理员授予的。
        4、视图可以嵌套,即可以利用从其他视图中检索数据的查询来构建一视图。
        5、ORDER BY可以使用在视图上,但是如果从该视图中检索数据的SELECT中如果也包含ORDER BY 语句,则视图中的ORDER 将会被覆盖。
        6、视图不能过索引,也不能有关联的触发器或默认值。
        7、视图可以和表一起使用。例如,编写一条连接视图与表的SELECT语句。
 
使用视图
     在理解了什么是视图之后来看一下视图的创建。
          1、使用CREATE VIEW来创建视图
          2、使用SHOW CREATE VIEW viewname,来查看创建视图的语句。
          3、使用DROP VIEW viewname来删除视图。
          4、更新视图的时候可以先用DROP 在用CREATE,也可以直接使用CREATE OR REPLACE VIEW 。如果要更新的视图不存在,第二种更新的语句将会创建一个视图。如果更新的视图存在,则在第二条更新语句使用后将会替换以前的视图。
 
利用视图简化复杂的联结
     视图最常见的应用之一就是隐藏复杂的sql。因此通常会涉及到表的联结。举例如下:
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的视图,他联结三个表用以返回已订购了任意产品的所有客户的列表。如果执行select * from productcustomers ,将列出订购了任意产品的客户。
      如果我们要检索订购了TNT2,这个产品的客户,可以使用如下:
SELECT cust_name, cust_contact
FROM productcustomers
WHERE prod_id = 'TNT2';
      通过where子句我们从视图中检索特定的数据。在mysql处理此查询时,他将指定的where子句添加到视图查询中已有的where子句中,以便正确过滤数据。
      可以看出,视图极大的简化了复杂sql语句的使用。利用视图可一次性编写基础的sql,然后根据需要多次使用。
      注意可重用的视图:创建不受特定数据限制的视图是一种好方法。例如上面创建的视图,返回生产所有产品的客户而不是某一个特定产品的客户(TNT2这个产品的客户)。扩展视图的范围不仅使得视图可以被重用,而且有更多其他的好处。这样做我们就不用创建和维护多个类似这样的视图了。
 
用视图格式化检索出来的数据
       如上所述,视图的另一种用法就是重新格式化检索出来的数据。下面的select语句在单个组合计算列中,返回供应商名和位置。
SELECT CONCAT(RTRIM(vend_name),'(',RTRIM(vend_country),')')
AS vend_title
FROM vendors
ORDER BY vend_name;
    输出:
+------------------------+
| vend_title |
+------------------------+
| ACME(USA) |
| Anvils R Us(USA) |
| Furball Inc.(USA) |
| Jet Set(England) |
| Jouets Et Ours(France) |
| LT Supplies(USA) |
+------------------------+
    现在假如经常使用这样格式的结果,不必在每次使用时都要执行一次联结,我们可以创建一个视图,每次需要的时候使用就可以了。可按如下方法把前面的语句转化成为视图。
 
CREATE VIEW vendorlocations AS
SELECT CONCAT(RTRIM(vend_name),'(',RTRIM(vend_country),')')
AS vend_title
FROM vendors
ORDER BY vend_name;
    上面这条语句使用了和前面一样的查询来创建了一个视图,为了检索出以创建所有邮件标签的数据。可如下进行:
SELECT *
FROM vendorlocations;
    输出的就过和上面一样。
 
    用视图过滤不想要的数据
    视图对于应用普通的where字句也很有用。例如,可以定义一个customermaillist视图,他过滤没有电子邮件地址的客户。为此我们可以使用下面的语句来创建
CREATE VIEW customermaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;
     显然在我们要发送电子邮件的时候,我们需要排除那些没有电子邮件的客户。这里的where子句过滤了cust_mail为null的情况,是他们不能被检索出来。
     现在可以像其他的视图一样来使用了。
SELECT *
FROM customermaillist;
     结果如下:
+---------+----------------+---------------------+

| cust_id | cust_name      | cust_email          |
+---------+----------------+---------------------+
| 10001 | Coyote Inc. | ylee@coyote.com |
| 10003 | Wascals | rabbit@wascally.com |
| 10004 | Yosemite Place | sam@yosemite.com |
+---------+----------------+---------------------+
WHERE子句与WHERE 子句 如果从视图检索数据时使用了一条WHERE子句,则两组子句(一组在视图中,另一组是传递给视图的)将自动组合。
 
使用视图与计算字段
    视图对于简化计算字段的使用特别有用。下面是第 章中介绍的一条SELECT语句。它检索某个特定订单中的物品,计算这种物品的总价格:
SELECT prod_id, quantity, item_price,quantity * item_price AS total_price
FROM orderitems
WHERE order_num = 20005;
    结果为:
+---------+----------+------------+-------------+
| prod_id | quantity | item_price | total_price |
+---------+----------+------------+-------------+
| ANV01 | 10 | 5.99 | 59.90 |
| ANV02 | 3 | 9.99 | 29.97 |
| TNT2 | 5 | 10.00 | 50.00 |
| FB | 1 | 10.00 | 10.00 |
+---------+----------+------------+-------------+
    为将其转换为视图,可以如下进行
CREATE VIEW orderitemsexpands AS
SELECT prod_id, quantity, item_price,quantity * item_price AS total_price
FROM orderitems
    这样我们就可以通过视图来检索order_num = 20005;的数据了。如下:
select *
from orderitemsexpands
where order_num = 20005;
    从上面的这么多用法,我们知道视图其实是很容易创建,而且很好用。正确的使用它,可以极大的简化复杂的数据处理。
 
更新视图
    迄今为止的所有视图都是和 SELECT语句使用的。然而,视图的数据能否更新?答案视情况而定。
通常,视图是可更新的(即,可以对它们使用 INSERT、UPDATE 和DELETE)。更新一个视图将更新其基表(可以回忆一下,视图本身没有数据)。如果你对视图增加或删除行,实际上是对其基表增加或删除行。但是,并非所有视图都是可更新的。基本上可以说,如果 MySQL不能正确地确定被更新的基数据,则不允许更新(包括插入和删除)。这实际上意味着,如果视图定义中有以下操作,则不能进行视图的更新:
        1、 分组(使用GROUP BY和 HAVING);
        2、 联结;
        3、 子查询;
        4、并;
        5、聚集函数(Min()、 Count()、Sum() 等);
        6、 DISTINCT;
        7、 导出(计算)列。
    换句话说,本章许多例子中的视图都是不可更新的。这听上去好像是一个严重的限制,但实际上不是,因为视图主要用于数据检索。
    注意:上面列出的限制自 MySQL 5以来是正确的。不过,未来的 MySQL很可能会取消某些限制。
    一般,应该将视图用于检索( SELECT语句)而不用于更新( INSERT、UPDATE 和DELETE)。
 
小结
    视图为虚拟的表。它们包含的不是数据而是根据需要检索数据的查询。视图提供了一种 MySQL的SELECT 语句层次的封装,可用来简化数据处理以及重新格式化基础数据或保护基础数据。

mysql之视图的更多相关文章

  1. mysql数据库视图连接出现2003····错误

    MySQL利用视图工具连接数据库时出现2003····错误                                                  原因:MySQL的服务没有开启 解决步骤: ...

  2. mysql 查询表,视图,触发器,函数,存储过程

    1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TAB ...

  3. mysql view(视图)

    一,什么是视图 视图是存放数据的一个接口,也可以说是虚拟的表.这些数据可以是从一个或几个基本表(或视图)的数据.也可以是用户自已定义的数据.其实视图里面不存放数据的,数据还是放在基本表里面,基本表里面 ...

  4. 第五章 MySQL事务,视图,索引,备份和恢复

    第五章 MySQL事务,视图,索引,备份和恢复 一.事务 1.什么是事务 事务是一种机制,一个操作序列,它包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求.要么都执行 ...

  5. MySQL之视图、触发器、事务、存储、函数、流程控制

    一.视图 视图就是一个虚拟表,我们把复杂的sql语句后看到的虚拟表封装起来,给他取个名字,当我们下次使用的时候,就不用再去写复杂的sql语句,直接调用封装后的视图名字,就可以得到我们想要的表,然后就可 ...

  6. MySQL之视图、触发器、事务、存储过程、函数 流程控制

    MySQL之视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上全部 ...

  7. MySQL的视图view,视图创建后,会随着表的改变而自动改变数据

    首先是创建视图 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `new_view` A ...

  8. MySQL通过视图(或临时表)实现动态SQL(游标)

    >参考de优秀文章 写MySQL存储过程实现动态执行SQL Dynamic cursor in stored procedure MySQL通过视图(或临时表)实现动态SQL(游标). 因在实现 ...

  9. 数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件

    数据库MySQL之 视图.触发器.存储过程.函数.事务.数据库锁.数据库备份.事件 浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表, ...

  10. MySQL 的视图、触发器、事务、存储过程、函数

    MySQL 的视图.触发器.事务.存储过程.函数   阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句 ...

随机推荐

  1. 十一、从头到尾彻底解析Hash 表算法

    在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  ...

  2. 海蜘蛛ISPV6.1.5,目前破解版本中最稳定的!

    海蜘蛛ISPV6.1.5,目前破解版本中最稳定的! 破解步骤如下: 一.安装完毕进控制台 二.使用muddyboot登陆 密码(123456) 三.输入root回车 四.输入regtools回车 五. ...

  3. Charles移动端抓包工具使用

    软件Charle 是一个HTTP代理服务器,HTTP监视器,反转代理服务器.它允许一个开发者查看所有连接互联网的HTTP通信.这些包括request, response现HTTP headers (包 ...

  4. [iOS]深入浅出 iOS 之多线程 NSThread

    OS 支持多个层次的多线程 编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.     下面简要说明这三种不同范式:  Thread 是这三种范式里面相对轻量级的,但也是使用起 ...

  5. quartz2D简单使用

    quartz2D绘图 1:上下文:context,这个翻译不好理解,其实翻译环境更好一点,就是给了你一个画板,你看不到而已 在: CGContextRef ctx = UIGraphicsGetCur ...

  6. php大文件下载

    <?php header("Content-Type:text/html;charset:utf-8"); //class FileDownServer{ //$file_n ...

  7. C#委托详解(2):实现方式大全

    本系列文章将详细探讨C#中的委托,列举其主要的实现方式,并分析其在设计层面和编码层面带来的好处,最后会讨论其安全性和执行效率等. 接上篇(C#委托详解(1):什么是委托)介绍完什么是委托之后,来看看C ...

  8. makefile常用函数

    标签(空格分隔): makefile 1.字符串替换和分析函数 $(subst from,to,text) #在文本"text"中使用"to"替换每一处&quo ...

  9. css3动画实例

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. gvim编辑文件到github乱码

    with below _vimrc settings, code uploaded to GitHub will display with proper encoding set encoding=u ...