1.概述

1.1.什么是视图

视图是逻辑上来自一个或多个表的数据集合。或者说:视图是经过定制的方式显示来自一张或多张表中的数据。
视图也可以看做是“虚拟表”,或者“存储的查询”。
p01_01.png

1.2.为什么要使用视图

为什么要使用视图:

  • 视图可以限制其它用户对数据库表的访问,因为视图可以有选择性的显示数据库表的一部分;
  • 视图容易实现复杂的查询;
  • 对于相同的数据可以产生不同的视图;

视图的应用场合:

  • 比如根据需求要查询某张表或某几张表中的某些字段数据。
  • 比如根据不同的权限让不同的用户查询不同的数据等等。

1.3.视图的特点

  1. 创建视图所依据的表叫做“基表”。
  2. 基表可以是一个,也可以是多个。
  3. 在视图上也可以修改数据。(基表有多个时不能修改)
  4. 如果修改违反了约束,也不能修改。
  5. 视图的优点:安全性、隐藏复杂性、简化sql命令。

2.视图语法

2.1.创建视图

创建视图的语法:

  1. create view 视图名 as 查询语句;

实例:创建一个视图v_emp10,通过该视图只能查看10号部门的员工编号,员工姓名,职位。

create view v_emp10
as select * from emp where deptno = 10

运行上面代码,就会创建一个 v_emp10 视图:
p01_02.png

也可以使用 show tables; 来查看视图:
p01_03.png

2.2.在视图上执行DML操作

在视图上可以执行 DML 操作。

2.2.1.查询

查询视图:可以像查询一张表那样去查询一个视图:

select * from v_emp10

2.2.2.插入

可以通过视图向基表插入数据,只要视图中不出现以下情况:

  • GROUP函数、GROUP BY子句,DISTINCT关键字;
  • 使用表达式定义的列;
  • 基表中未在视图中选择的其它列定义为非空并且没有默认值;
    insert into v_emp10 values(7988,'黄药师','岛主',null,'2017-09-19',8000,1000,10)
    

2.2.3.更新

可以通过视图修改基表中数据,只要视图中不出现以下情况:

  • GROUP函数、GROUP BY子句,DISTINCT关键字;
  • 使用表达式定义的列;
    update v_emp10 set sal=3000 where empno=7988
    

2.2.4.删除

可以通过视图删除基表中数据,只要视图中不出现以下情况:

  • Group 函数、GROUP BY 子句、DISTINCT 关键字;
    delete from v_emp10 where empno=7988
    

2.3.查看视图

查看数据库中所有视图的详细信息:

select * from information_schema.views;

3.视图实例

需求:公司领导希望能够快捷方便的看到公司所有员工的一些统计信息,包括:

  • 公司所有员工信息:总人数,平均工资,总工资,最高工资,最低工资
  • 每个部门的员工信息:部门编号,部门名称,部门总人数,部门平均工资,部门总工资,部门最高工资,部门最低工资
    drop view if exists v_report;
    create view  v_report 
    as 
    select  (select count(*) from emp)  总人数,
           (select avg(sal) from emp)  平均工资,
           (select sum(sal) from emp)  总工资,
           (select max(sal) from emp)  最高工资,
           (select min(sal) from emp)  最低工资,
           e.deptno 部门编号,
           d.dname 部门名称,
           count(e.empno) 部门总人数,
           avg(e.sal) 部门平均工资,
           sum(e.sal) 部门总工资,
           max(e.sal) 部门最高工资,
           min(e.sal) 部门最低工资
    from emp e left join dept d
    on e.deptno=d.deptno
    group by e.deptno;