我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL基础备忘(2)之视图

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL基础备忘(2)之视图

  使用过微软Access小型数据库管理系统的朋友可能永远不会忘记查询的概念,它也是二级Access考试的重中之重。掌握了查询部分,二级过关就有了绝对把握。查询之所以重要,其中一个主要原因在于其灵活性。创建数据库表初期,我们可以建立一些基础表格,但是由于现实需求的复杂性,很难一下设计出符合所有需求的所有表格,例如有时需要基于一些字段很多的大表创建一些临时性的若干“子表”。这种所谓的‘子表’,就可以使用查询来设计实现。从本质上讲,这种查询只是存储了创建这些查询的SQL语句,并没有生成独立的查询对应的‘子表’。当然,这也在一定程度上节约了存储。

在例如MySQL,MS SQL及Oracle等大型关系数据库中,你很难找到查询的概念。相反,你看到的是视图;它正是类似于Access中查询的东西。因此,这种视图在数据库设计中的位置也是不言而喻的。


一. 视图概念

  MySQL视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

  对其中所引用的基础表来说,MySQL视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

  实际上,视图是存储在数据库中的查询的sql 语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。

  实用开发中,视图一般是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言这些数据列和数据行来源于其所引用的表。

  所以,MySQL视图不是真实存在的基础表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。

  视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。

  当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

  视图有很多优点,主要表现在:

  • 视点集中和简化操作:视图机制使用户可以将注意力集中在所关心地数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的的数据查询操作。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏起来了。换句话说,用户所作的只是对一个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。

  • 定制数据:视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一个数据库时,这种灵活性是非常必要的。

  • 视图对重构数据库提供了一定程度的逻辑独立性:

  数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。
  在关许数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(Sno,Sname,Ssex,Sage,Sdept),
分为SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:

CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)AS SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept FROM SX,SY WHERE SX.Sno=SY.Sno;

 这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。

  当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。

  • 安全性:有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。

二. 创建MySQL视图——create view

  1. 语法

    create [or replace] [algorithm = {undefined | merge | temptable}] view [db_name.]view_name [(column_list)] as select_statement [with [cascaded | local] check option]

  通过该语句可以创建视图,若给定了[or replace],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。

  表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。

  1. 使用举例

  本例创建一个产品表(product)和一个购买记录表(purchase),再通过MySQL视图purchase_detail查询出购买的详细信息。

create table product  
(  
product_id int not null,  
name varchar(50) not null,  
price double not null  );  
insert into product values(1, 'apple ', 5.5);  
create table purchase  
(  
id int not null,  
product_id int not null,  
qty int not null default 0,  
gen_time datetime not null  );  
insert into purchase values(1, 1, 10, now());  
create view purchase_detail as select product.name as name, product .price as price, purchase.qty as qty, 
product .price * purchase.qty as total_value from product, 
purchase where product.product_id = purchase.product_id;

创建成功后,输入:select * from purchase_detail;

运行效果如下:

+-------+-------+-----+-------------+
| name | price | qty | total_value |
+-------+-------+-----+-------------+
| apple | 5.5 | 10 | 55 |
+-------+-------+-----+-------------+
1 row in set (0.01 sec)


注意事项归纳:

创建视图存在如下注意事项:

(1) 运行创建视图的语句需要用户具有创建视图(crate view)的权限,若加了[or replace]时,还需要用户具有删除视图(drop view)的权限;

(2) select语句不能包含from子句中的子查询;

(3) select语句不能引用系统或用户变量;

(4) select语句不能引用预处理语句参数;

(5) 在存储子程序内,定义不能引用子程序参数或局部变量;

(6)在定义中引用的表或视图必须存在。但是,创建了MySQL视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用check table语句;

(7) 在定义中不能引用temporary表,不能创建temporary视图;

(8) 在视图定义中命名的表必须已存在;

(9) 不能将触发程序与视图关联在一起;

(10) 在视图定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略。


三. 修改MySQL视图——alter view

  1. 语法

    alter [algorithm = {undefined | merge | temptable}] view view_name [(column_list)] as select_statement [with [cascaded | local] check option]该语句用于更改已有视图的定义。其语法与create view类似。

  2. 使用举例

  将上一小节中中创建的视purchase_detail进行修改,去掉qty列,语句如下:

alter  view purchase_detail as select product.name as name, product .price as price, product .
price * purchase.qty as total_value from product, 
purchase where product.product_id = purchase.product_id;


四,重要参考文章


  • http://blog.csdn.net/lihaitao_1/article/details/51504626

  • http://www.2cto.com/database/201508/427083.html

  • http://www.jb51.net/article/36363.htm

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL基础备忘(2)之视图

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL基础-视图

视图定义:本质就是一张虚拟表。从一个或多个表中结合查询出来的结果集,作用和真实表一样。可以使用SELECT 语句查询数据,也可以使用INSERT,UPDATE,DELETE 来修改数据。优点:1) 简单化,数据所见即所得;2) 安全性,用户只能查询或修改他们所
2021-02-05

MySQL基础(4) | 视图

MySQL基础(4) | 视图基本语法1.创建CREATE VIEW AS 语法说明如下。:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。对于创建视图中的 SELEC
MySQL基础(4) | 视图
2019-06-10

SQL基础随记2 视图 存储过程 - G

SQL基础随记2 视图 存储过程 ViewCREATE/ALTER/DROP VIEW ViewName as SELECT(...)可以在视图的基础上继续创建视图,即,将之前创建的视图当做表名放在新视图的select语句中利用视图进行数据格式化(就是对字段进
SQL基础随记2 视图 存储过程 - G
2020-04-02

自定义视图View绘图基础之Path的使用

这篇文章主要介绍了自定义视图View绘图基础之Path的使用,path类是一个非常有用的类,他可以预先在view上讲N个点连成一条“路径”,然后调用Canvas的drawPath(path,paint)即可沿着路径绘制图形,需要的朋友可以参考下
2023-05-14

Python图像处理之图像与视频处理基础教程

这篇文章主要介绍了Python图像处理之图像与视频处理基础教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-15

MySQL基础教程2 —— 数据类型之日期和时间类型

表示时间值的DATE和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。TIMESTAMP类型有专有的自动更新特性,
2022-05-24

MySQL基础篇(04):存储过程和视图,用法和特性详解

本文源码:GitHub·点这里 || GitEE·点这里一、存储过程1、概念简介存储程序是被存储在服务器中的组合SQL语句,经编译创建并保存在数据库中,用户可通过存储过程的名字调用执行。存储过程核心思想就是数据库SQL语言层面的封装与重用性。使用存储过程可以较
MySQL基础篇(04):存储过程和视图,用法和特性详解
2020-12-21

编程热搜

目录