【详细】MySQL之视图篇

一、基本概念

视图是一个虚拟表,是sql的查询结果,其内容由查询定义。
同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。

二、视图的作用

1、权限控制

比如说,某几列允许用户查询,其它列不允许,就可以只把允许的列作为查询字段使用视图展示

2、大数据分表使用

比如,表的行数超过200万行时,就会变慢,可以把一张的表的数据拆成4张表来存放.然后使用视图来关联几张表(Create view news as select from n1 union select from n2 union…)

3、提高查询效率

看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

三、视图的操作

视图的数据变化会影响到基表,当视图与多个基表关联时,不能通过视图去修改多个基表,只能去insert/update/delete一个基表的字段,而且在操作视图时基表的约束对视图同样有效
基表的数据变化也会影响到视图

1、创建

注意:Mysql视图的定义在from关键字后面不能包含子查询

create view  视图名  as  select 字段名 from 表名;
2、查看
show tables;
desc 视图名 -- 查看视图结果
3、删除
drop view 视图名
4、使用视图结果

和表查询一样

select * from 视图名

四、应用示例

1、创建userinfo表存储员工基本信息

-- ----------------------------
-- Table structure for userinfo
-- ----------------------------
DROP TABLE IF EXISTS `userinfo`;
CREATE TABLE `userinfo`  (
  `id` int(11) NOT NULL,
  `userName` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `passWord` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `sex` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `phone` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of userinfo
-- ----------------------------
INSERT INTO `userinfo` VALUES (1, '李虎', '123456', 25, '男', '17694855647');
INSERT INTO `userinfo` VALUES (2, '吴霞', '456789', 20, '女', '13894567899');
INSERT INTO `userinfo` VALUES (3, '张杰', '666666', 16, '男', '15687486985');
INSERT INTO `userinfo` VALUES (23, '赵雷', '7788', 32, '男', '14525896544');

2、创建员工工资表

-- ----------------------------
-- Table structure for job
-- ----------------------------
DROP TABLE IF EXISTS `job`;
CREATE TABLE `job`  (
  `id` int(20) NOT NULL,
  `job` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `salary` int(20) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `INDEX_JOB`(`job`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of job
-- ----------------------------
INSERT INTO `job` VALUES (1, 'java初级开发工程师', 6000);
INSERT INTO `job` VALUES (2, 'c++中级开发工程师', 16000);
INSERT INTO `job` VALUES (3, '数据库工程师', 10000);
INSERT INTO `job` VALUES (4, 'java高级工程师', 25000);
INSERT INTO `job` VALUES (23, 'HR', 4000);

3、创建视图
用来存储员工工资

CREATE VIEW `salaryview` AS select `a`.`id` AS `id`,`a`.`job` AS `job`,`a`.`salary` AS `salary`,`b`.`userName` AS `userName` from (`job` `a` join `userinfo` `b`) where (`a`.`id` = `b`.`id`) order by `a`.`salary`

4、操作视图来
我们在视图中插入一条sql,来看看基表的数据有没有同时变化

insert into salaryView(id, job, salary, userName) values(3, 'php工程师', 7000, '王萌')

报错“Can not modify more than one base table through a join view ‘spring.salaryview’”
意思是

不能通过视图去同时操作多张基表

好,接着我们改下sql,只来操作一张表的字段

insert into salaryView(id, job, salary) values(3, 'php工程师', 7000)

报错Duplicate entry ‘4’ for key ‘PRIMARY’ 意思是:主键重复,这也说明了

基表的约束条件同时也会作用于与其关联的视图

好,接着改下id

insert into salaryView(id, job, salary) values(5, 'php工程师', 7000)
insert into salaryView(id, job, salary) values(6, 'php工程师')

这时候我们发现视图表中并没有新增数据,而操作字段对应的基表job表中却新增了2条数据,这时为什么尼?
我们回头来看看定义视图的语句,很明显视图中封装的是两个基表的联查结果,而只有job表中有这2条数据时当然不会联查出结果

5、操作基表
我们删除一条基表的数据,来看看视图的变化

DELETE from userinfo where id = 3

执行后发现,userinfo中id为3的这条数据删除了,对应视图中的这条数据也删除了
基表的操作之所以会影响到视图,是因为视图的结果来自于基表,所以也只有当视图中存在基表作用后的数据时,对基表的操作才能影响到视图

五、总结

视图实质是对单表或多表联查结果的封装
需要注意以下几点

1、不能通过视图去操作多张基表;
2、基表的约束同时也会作用于对应的视图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值