什么是视图? <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />



视图(view)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。



 视图相对普通的表的优势主要包括一下几项:



(1) 简单:使用视图的用户完全不需要关心后面对应的表结构、关联条件和筛选条件,对用户来说已经是过滤好的符合条件的结果集。



(2) 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。



(3) 数据独立:一旦视图的结构确定的,可以屏蔽不表结构的变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。





视图操作



视图的操作包括创建或者修改视图、删除视图,以及查看视图定义。



创建或者修改视图



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



创建视图的语法为:


CREATE [OR REPLACE] [ALGORITHM  = {UNDEFINED|MERGE|TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED|LOCAL] CHECK OPTION] 
    
   
 
  
修改视图的语法为: 
    
   
 
  
ALTER [ALGORITHM ={UNDEFINED|MERGE|TEMPTABLE}] 
    
   
 
  
VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED|LOCAL] CHECK OPTION]



MYSQL视图的定义有一些限制,例如,在FROM关键字后面不能包含子查询,这和其他数据库是不同的,如果视图是从其他数据库迁移过来的,那么可能需要因此做一些改动,可以将子查询的内容先定义成一个视图,然后对该视图在创建视图就可以实现类似的功能了。



视图的可更新性和视图中查询的定义有关系,以下类型的视图是不可更新的。



(1) 包含以下关键字的SQL语句:聚合函数(SUM、MIN、MAX、COUNT等) DISTINCT、GROUP BY 、HAVING、UNION或者UNION ALL。



(2) 常量视图



(3) SELECT 中包含子查询



(4) JION:外左联合查询、外右联合查询、内查询



(5) FROM 一个不能更新的视图



(6) WHERE字句的子查询引用了FROM字句中的表。



WITH [CASCADED|LOCAL] CHECK OPTION决定了是否允许更新数据使记录不再满足视图的条件。这个选项与ORACLE数据库中的选项是类似的,其中:



(1) LOCAL是只要满足本视图的条件就可以更新;



(2) CASCADED则是必须满足所有针对该视图的所有视图的条件才可以更新。如果没有明确是LOCAL还是CASCADED,则默认是CASCDAED



(3) 删除视图



用户可以一次删除一个或者多个视图,前提是必须有该视图的DROP权限。


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




(1)设计视图



1) 建立一个名为V_CX_ZG的视图,功能是从职工信息表中查询非汉族的职工记录,并按出生日期排序。(该视图用于“固定条件查询”功能)



MYSQL>CREATE OR REPLACE VIEM V_CX_ZG AS SELECT NATIONAL,BRITH FROM EMPLOYEE WHERE NATIONAL NOT IN('汉') GROUP BY BRITH; 
    
   
 
  
MYSQL>SELECT * FROM V_CX_ZG;



mysql人员的工资类别 mysql工资表_条件查询





2)  建立一个名为V_CX_GZ的视图,功能是从工资档案表中查询岗位工资和补贴都高于500元的记录,要求显示出部门名称、姓名、性别、职称、基本工资、岗位工资、补贴和奖金,并按部门和基本工资的降序排列。(该视图用于“固定条件查询”功能)



MYSQL>CREATE OR REPLACE VIEW V_CX_GZ AS SELECT A.DEPARTMENT_NAME,A.EMPLOYEE_NAME,A.GENDER,A.TITLE,B.BASIC_WAGE,B.POST_WAGE,B.SUBSIDIES,B.FUND FROM EMPLOYEE A LEFT JOIN WAGE B ON (A.EMPLOYEE_ID=B.EMPLOYEE_ID)  WHERE (B.POST_WAGE >500) AND (B.SUBSIDIES >500); 
    
   
 
  
MYSQL>SELECT * FROM V_CX_GZ;



mysql人员的工资类别 mysql工资表_mysql人员的工资类别_02



mysql人员的工资类别 mysql工资表_数据库_03



3)  建立一个所有职工工资统计视图V_ZGGZTJ,计算所有人员的基本工资的总和、平均值、最大值和最小值。(该视图用于“数据统计”功能)



MYSQL>CREATE OR REPLACE VIEW V_ZGGZTJ AS SELECT SUM(BASIC_WAGE),AVG(BASIC_WAGE),MAX(BASIC_WAGE),MIN(BASIC_WAGE) FROM WAGE; 
    
   
 
  
MYSQL>SELECT * FROM V_ZGGZTJ;



mysql人员的工资类别 mysql工资表_子查询_04





4)  建立一个各部门人数统计的视图V_BMTJ,功能是从职工信息表中统计各部门的人数。(该视图用于“数据统计”功能)



MYSQL>CREATE OR REPLACE VIEW V_BMTJ AS SELECT DEPARTMENT_NAME,COUNT(DEPARTMENT_ANEM) FROM EMPLOYEE GROUP BY DEPARTMENT_NAME; 
    
   
 
  
MYSQL>SELECT * FROM V_BMTJ;



mysql人员的工资类别 mysql工资表_子查询_05





5)  建立一个各类职称人数统计的视图V_ZCTJ,功能是从职工信息表中统计各类职称的人数。(该视图用于“数据统计”功能)



MYSQL>CREATE OR REPLACE VIEW V_ZCTJ AS SELECT TITLE,COUNT(TITLE) FROM EMPLOYEE GROUP BY TITLE; 
    
   
 
  
MYSQL>SELECT * FROM V_ZCTJ;



mysql人员的工资类别 mysql工资表_mysql人员的工资类别_06





6)  建立一个各民族人数统计的视图V_MZTJ,功能是从职工信息表中统计各民族的人数。(该视图用于“数据统计”功能)


MYSQL>CREATE OR REPLACE VIEW V_MZTJ AS SELECT NATIONAL,COUNT(NATIONAL) FROM EMPLOYEE GROUP BY NATIONAL; 
    
   
 
  
MYSQL>SELECT * FROM V_MZTJ;


mysql人员的工资类别 mysql工资表_子查询_07





7) 建立一个职工工资视图V_ZGGZ,功能是从职工信息、工资档案和工资发放三个表中查询所有职工的工资情况,其中包括部门名、姓名、性别、职称、基本工资、岗位工资、补贴、奖金、应得工资、其他加、其他扣、实发工资、发放日期。(其中:应得工资=基本工资+岗位工资+补贴+奖金+其他加;实发工资=基本工资+岗位工资+补贴+奖金+其他加-其他扣。)(该视图用于“选择条件查询”功能)



内部查询



MYSQL>CREATE OR REPLACE VIEW V_ZGGZ AS SELECT EMPLOYEE.DEPARTMENT_NAME,EMPLOYEE.EMPLOYEE_NAME,EMPLOYEE.GENDER,EMPLOYEE.TITLE,WAGE.BASIC_WAGE,WAGE.POST_WAGE,WAGE.SUBSICDIES,WAGE.FUND,WAGE.BASIC_WAGE+WAGE.POST_WAGE+WAGE.SUBSIDIES+WAGE.FUND+PWAGE.BAISE_WAGE AS TOTAL_WAGE,PWAGE.RAISE_WAGE,PWAGE.CUT_WAGE,WAGE.BASIC_WAGE+WAGE.POST_WAGE+WAGE.SUBSIDIES+WAGE.FUND+PWAGE.RAISE_WAGE-PWAGE.CUT_WAGE AS WAGES FROM EMPLOYEE INNER JOIN WAGE ON EMPLOYEE.EMPLOYEE_ID=WAGE.EMPLOYEE_ID INNER JOIN PWAGE ON  WAGE.EMPLOYEE_ID=PWAGE.EMPLOYEE_ID; 
    
   
 
  
MYSQL>SELECT * FROM V_ZGGZ;



mysql人员的工资类别 mysql工资表_mysql人员的工资类别_08



mysql人员的工资类别 mysql工资表_mysql人员的工资类别_09





8)  建立一个月工资汇总视图V_YGZHZ,功能是从视图V_ZGGZ中统计每个月发放的基本工资、岗位工资、补贴、奖金、其他加、应得工资、其他扣、实发工资的总和。 (该视图用于“数据统计”功能)



MYSQL>CREATE OR REPLACE VIEW V_YGZHZ AS SELECT SUM(BASIC_WAGE),SUM(POST_WAGE),SUM(SUBSIDIES),SUM(FUND),SUM(RAISE_WAGE),SUM(TOTAL_WAGE),SUM(WAGES) FROM V_ZGGZ; 
    
   
 
  
MYSQL>SELECT * FROM V_YGZHZ;



mysql人员的工资类别 mysql工资表_条件查询_10





9)  建立一个部门工资汇总视图V_BMGZHZ,功能是从视图V_ZGGZ中统计各个部门的基本工资、岗位工资、补贴、奖金、其他加、应得工资、其他扣、实发工资的总和。(该视图用于“数据统计”功能)



MYSQL>CREATE OR REPLACE VIEW V_BMGZHZ AS SELECT SUM(BASIC_WAGE),SUM(POST_WAGE),SUM(SUBSIDIES),SUM(FUND),SUM(RAISE_WAGE),SUM(TOTAL_WAGES),SUM(CUT_WAGE),SUM(WAGES) FROM V_ZGGZ GROUP BY DEPARTMENT_NAME; 
    
   
 
  
MYSQL>SELECT * FROM V_BMGZHZ;



mysql人员的工资类别 mysql工资表_数据统计_11






转载于:https://blog.51cto.com/chenboqiang/279374