mysql视图

来源:互联网 发布:阿里云备案拍照点分布 编辑:程序博客网 时间:2024/05/17 21:51


1.什么是视图?

    SQL中,视图是基于 SQL语句的结果集的可视化的表。

      视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。

 

使用视图主要用于两种原因

      1、安全原因。视图可以隐藏一些数据,如对于社会保险金表,可以用视图只显示姓名、地址,而不显示社会保险好和工资数等。

   2、另一个原因是可使复杂的查询易于理解和使用。

2.视图的语法

   mysql在处理视图时有两种算法,分别为 merge temptable, 可以指定使用哪种算法。 merge是指在处理涉及到视图的操作时,将对视图额操作根据视图的定义进行展开,优点类似于C语言中的宏展开。

 mysql>pager more;

1.mysql> ? create view

2. Name: 'CREATE VIEW'

3. Description:

4. Syntax:

5. CREATE

6.    [OR REPLACE]

7.    [ALGORITHM = {UNDEFINED | MERGE |TEMPTABLE}]

8.    [DEFINER = { user | CURRENT_USER }]

9.    [SQL SECURITY { DEFINER | INVOKER }]

10.    VIEW view_name [(column_list)]

11.    AS select_statement

12.    [WITH [CASCADED | LOCAL] CHECK OPTION]

  该语句能创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。 select_statement是一种SELECT语句,它给定了视图的定义。该语句可从基表或其他视图进行选择。

  该语句要求具有针对视图的 CREATE VIEW权限,以及针对有SELECT语句选择的每列上的某些权限。对于在 SELECT语句中其他地方使用的列,必须具有select权限。如果还有 OR REPLACE子句,必须在视图上具有DROP权限。

   视图属于数据库。在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确的创建视图,创建时,应将名称指定为 db_name.view_name

如:

 

1.mysql> create viewtest.v as select * from t

  表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。

  视图必须具有唯一的列名。

  视图创建成功后,如果需要修改,可以使用alter view修改

 

1.mysql> ? alter view

2. Name: 'ALTER VIEW'

3. Description:

4. Syntax:

5. ALTER

6.    [ALGORITHM = {UNDEFINED | MERGE |TEMPTABLE}]

7.    [DEFINER = { user | CURRENT_USER }]

8.    [SQL SECURITY { DEFINER | INVOKER }]

9.    VIEW view_name [(column_list)]

10.    AS select_statement

11.    [WITH [CASCADED | LOCAL] CHECK OPTION

 

删除视图

1.mysql> ? drop view

2. Name: 'DROP VIEW'

3. Description:

4. Syntax:

5. DROP VIEW [IF EXISTS]

6.    view_name [, view_name] ...

7.    [RESTRICT | CASCADE]

 

可以使用关键字 IF EXISTS来防止因存在的视图而出错

此外,还可以通过下面的语句查看 view_name的完整定义

1.mysql> show create viewview_name

3.使用视图的好处

1、视图能简化用户操作

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

 

2、视图使用户能以多种角度看待同一数据

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

 

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

   数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。

 在关许数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表垂直地分成多个基本表。例如:将学生关系StudentSnoSnameSsexSageSdept),

分为SXSnoSnameSage)和SYSnoSsexSdept)两个关系。这时原表StudentSX表和SY表自然连接的结果。如果建立一个视图Student

CREATE VIEW Student
SnoSnameSsexSageSdept
AS
SELECT SX.Sno
SX.SnameSY.SsexSX.SageSY.Sdept
FROM SX
SY
WHERE SX.Sno=SY.Sno

   这样尽管数据库的逻辑结构改变了(变为SXSY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
   
当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。

 

4、视图能够对机密数据提供安全保护

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

5、适当的利用视图可以更清晰地表达查询

  例如经常需要执行这样的查询对每个学生找出他获得最高成绩的课程号。可以先定义一个视图,求出每个同学获得的最高成绩:

 

CREATE VIEWVMGRADE
AS
SELECT Sno
MAX(Grade) Mgrade
FROM SC
GROUP BY Sno

 

然后用如下的查询语句完成查询:

 

SELECT SC.SnoCno FROM SCVMGRADE WHERE SC.Sno = VMGRADE.Sno AND SC.Grade = VMGRADE.Mgrade

4.视图的操作

1、创建视图

建表:product

createtable product

( 

id int, 

name varchar(50) , 

price double

)

 

创建视图:myview

createview myview as

selectid,name,price from product

 

2、修改视图

alterview myview as select id,price from product

--去掉name字段

3、删除视图

Dropview myview

5注意事项

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

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

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

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

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

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

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

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

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

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

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

1 0
原创粉丝点击