欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql数据库---视图,视图的作用,操作视图以及更新视图

程序员文章站 2022-03-03 20:00:37
...

1、什么是视图
视图就是一条SELECT语句执行后返回的结果集,
视图是一个虚拟表,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来*定义视图的查询所引用的表。
2、视图作用
(1)简化用户的操作
关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,
简化操作;

(2)对机密数据提供保护作用
不希望用户访问表中某些含敏感信息的列,比如salary…
3、操作视图
(1)创建视图:
Create view 视图名称 as DQL语句(select …);
(2)删除视图:
Drop view 视图名称;
练习
有 t_employee和 t_employee_detail 表格
t_employee 表格:

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)
 );

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(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','山西','否','篮球');

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;
-- 查看表格中员工的基本信息。
select name,gender,age,home,marry,hobby from t_employee;
-- 创建视图。
create view v_employee as select name,gender,age,home,marry,hobby from t_employee;
-- 查看视图中的内容
select * from v_employee;

练习2:将员工所有的信息做成一个视图。

-- 查询出所有员工信息
select * from t_employee as t1 LEFT JOIN t_employee_detail as t2 ON t1.id=t2.id;

-- 去掉 重复的id
select t1.*,t2.pos,t2.experence from t_employee as t1 LEFT JOIN t_employee_detail as t2 ON t1.id=t2.id;

-- 创建视图
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;

-- 显示所有数据
select * from v_employee_detail;
select name,gender,age from v_employee_detail;

4、更新视图
在MySQL中,更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,其中没有数据,所以通过视图更新时,都是转换到基本表来更新。
更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。

练习1:将张飞性别改成男

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

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

不可更新的视图:
某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:

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

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