MySQL数据库——视图

视图的定义

视图就是一条SELECT语句执行后返回的结果集,

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

视图作用

  1. 简化用户的操作

关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,
简化操作;

  1. 对机密数据提供保护作用

不希望用户访问表中某些含敏感信息的列,比如salary…

操作视图

  1. 创建视图:
Create view  视图名称 as DQL语句(select ...);
  1. 删除视图:
Drop view 视图名称;

下面就做一个操作视图的案例:
有 t_employee和 t_employee_detail 表格
创建t_temployee 表格:


CREATE TABLE t_employee(
        ID INT  PRIMARY KEY  AUTO_INCREMENT,
        NAME CHAR(30) NOT NULL,
        GENDER  CHAR(2) NOT NULL,
        AGE INT NOT NULL,
        DEPARTMENT CHAR(10) NOT NULL,
        SALARY  INT NOT NULL,
        HOME CHAR(30),
        MARRY CHAR(2) NOT NULL DEFAULT  '否',       
        HOBBY CHAR(30)
 );

然后插入数据:

INSERT INTO t_employee(NAME, GENDER, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES('张飞','女',21,'人事部','9000','北京','否','网球');

INSERT INTO t_employee(NAME, GENDER, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES('刘备','男',22,'研发部','8000','上海','否','音乐');

INSERT INTO t_employee(NAME, GENDER, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES('关羽','女',23,'研发部','9000','重庆','否','无');

INSERT INTO t_employee(NAME, GENDER, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES('马超','女',24,'研发部','9000','四川','是','足球');

INSERT INTO t_employee(NAME, GENDER, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES('赵云','男',25,'销售部','6000','福建','否','游戏');

INSERT INTO t_employee(NAME, GENDER, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES('诸葛亮','女',26,'销售部','5000','山西','否','篮球');

创建t_employee_detail 表格:


create TABLE t_employee_detail(
ID INT PRIMARY KEY,
POS CHAR(10) NOT NULL,
EXPERENCE CHAR(10) NOT NULL,
CONSTRAINT `FK_ID` FOREIGN KEY(ID) REFERENCES t_employee(ID)
)

然后插入数据:

INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(1,'人事管理','工作二年');

INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(2,'人事招聘','工作二年');

INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(3,'初级工程师','工作一年');

INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(4,'中级工程师','工作二年');

INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(5,'高级工程师','工作三年');

INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(6,'销售代表','工作二年');

创建一个员工基本信息的视图。
步骤如下:

  1. 查看表格中的所有数据
select * from t_employee;
  1. 查看表格中员工的基本信息。
select name,gender,age,home,marry,hobby from t_employee;
  1. 创建视图。
create view v_employee as select name,gender,age,home,marry,hobby from t_employee;
  1. 查看视图中的内容
select * from v_employee;

将员工所有的信息做成一个视图。
步骤如下:

  1. 查询出所有员工信息
select * from t_employee as t1 LEFT JOIN t_employee_detail as t2 ON t1.id=t2.id;
  1. 去掉 重复的id
select t1.*,t2.pos,t2.experence from t_employee as t1 LEFT JOIN t_employee_detail as t2 ON t1.id=t2.id;
  1. 创建视图
create view v_employee_detail as select t1.*,t2.pos,t2.experence from t_employee as t1 LEFT JOIN t_employee_detail as t2 ON t1.id=t2.id;
  1. 显示所有数据
select * from v_employee_detail;
select name,gender,age from v_employee_detail;

更新视图

在MySQL中,更新视图是指通过视图来插入(INSERT)、**更新(UPDATE)和删除(DELETE)**表中的数据。

因为视图是一个虚拟表,其中没有数据,所以通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。

举个例子将上面表的张飞性别改成男

update v_employee_detail set gender ='男' where name='张飞';

注意:对应 的真实表上的数据也发生改变 了

不可更新的视图:

某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。

对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:

  • 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
  • DISTINCT
  • GROUP BY
  • HAVING
  • UNION
  • 位于选择列表中的子查询
  • Join
  • FROM子句中的不可更新视图
  • WHERE子句中的子查询,引用FROM子句中的表。

注意:

视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。

你可能感兴趣的:(MySQL数据库,数据库,mysql,视图)