阅读目录

什么是视图

通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

视图的特性

视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);

可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制);

视图的作用

方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;

更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建视图,可以把权限限定到行列级别;

使用场合

权限控制的时候,不希望用户访问表中某些含敏感信息的列,比如salary...

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

视图实例1-创建视图及查询数据操作

现有三张表:用户(user)、课程(course)、用户课程中间表(user_course),表结构及数据如下:

表定义:

-- ----------------------------

-- Table structure for `course`

-- ----------------------------

DROP TABLE IF EXISTS `course`;

CREATE TABLE `course` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(200) NOT NULL,

`description` varchar(500) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of course

-- ----------------------------

INSERT INTO `course` VALUES ('1', 'JAVA', 'JAVA课程');

INSERT INTO `course` VALUES ('2', 'C++', 'C++课程');

INSERT INTO `course` VALUES ('3', 'C语言', 'C语言课程');

-- ----------------------------

-- Table structure for `user`

-- ----------------------------

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`account` varchar(255) NOT NULL,

`name` varchar(255) NOT NULL,

`address` varchar(255) DEFAULT NULL,

`others` varchar(200) DEFAULT NULL,

`others2` varchar(200) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of user

-- ----------------------------

INSERT INTO `user` VALUES ('1', 'user1', '小陈', '美国', '1', '1');

INSERT INTO `user` VALUES ('2', 'user2', '小张', '日本', '2', '2');

INSERT INTO `user` VALUES ('3', 'user3', '小王', '中国', '3', '3');

-- ----------------------------

-- Table structure for `user_course`

-- ----------------------------

DROP TABLE IF EXISTS `user_course`;

CREATE TABLE `user_course` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`userid` bigint(20) NOT NULL,

`courseid` bigint(20) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of user_course

-- ----------------------------

INSERT INTO `user_course` VALUES ('1', '1', '2');

INSERT INTO `user_course` VALUES ('2', '1', '3');

INSERT INTO `user_course` VALUES ('3', '2', '1');

INSERT INTO `user_course` VALUES ('4', '2', '2');

INSERT INTO `user_course` VALUES ('5', '2', '3');

INSERT INTO `user_course` VALUES ('6', '3', '2');

表数据:

这时,当我们想要查询小张上的所以课程相关信息的时候,需要这样写一条长长的SQL语句,如下:

SELECT

`uc`.`id` AS `id`,

`u`.`name` AS `username`,

`c`.`name` AS `coursename`

FROM

`user` `u`

LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))

LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))

WHERE

u.`name` = '小张'

但是我们可以通过视图简化操作,例如我们创建视图view_user_course如下:

-- ----------------------------

-- View structure for `view_user_course`

-- ----------------------------

DROP VIEW

IF EXISTS `view_user_course`;

CREATE ALGORITHM = UNDEFINED

DEFINER = `root`@`localhost`

SQL SECURITY DEFINER

VIEW `view_user_course` AS (

SELECT

`uc`.`id` AS `id`,

`u`.`name` AS `username`,

`c`.`name` AS `coursename`

FROM

(

(

`user` `u`

LEFT JOIN `user_course` `uc` ON ((`u`.`id` = `uc`.`userid`))

)

LEFT JOIN `course` `c` ON ((`uc`.`courseid` = `c`.`id`))

)

);

几点说明(MySQL中的视图在标准SQL的基础之上做了扩展):

ALGORITHM=UNDEFINED:指定视图的处理算法;

DEFINER=`root`@`localhost`:指定视图创建者;

SQL SECURITY DEFINER:指定视图查询数据时的安全验证方式;

创建好视图之后,我们可以直接用以下SQL语句在视图上查询小张上的所以课程相关信息,同样可以得到所需结果:

SELECT

vuc.username,

vuc.coursename

FROM

view_user_course vuc

WHERE

vuc.username = '小张'

视图实例2-增删改数据操作

继续,我们可以尝试在视图view_user_course上做增删改数据操作,如下:

update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

遗憾的是操作失败,提示错误信息如下:

[SQL] update view_user_course set username='test',coursename='JAVASCRIPT' where id=3

[Err] 1393 - Can not modify more than one base table through a join view 'demo.view_user_course'

因为不能在一张由多张关联表连接而成的视图上做同时修改两张表的操作;

那么哪些操作可以在视图上进行呢?

视图与表是一对一关系情况:如果没有其它约束(如视图中没有的字段,在基本表中是必填字段情况),是可以进行增删改数据操作;

如我们创建用户关键信息视图view_user_keyinfo,如下:

-- ----------------------------

-- View structure for `view_user_keyinfo`

-- ----------------------------

DROP VIEW

IF EXISTS `view_user_keyinfo`;

CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view_user_keyinfo` AS SELECT

`u`.`id` AS `id`,

`u`.`account` AS `account`,

`u`.`name` AS `username`

FROM

`user` `u`;

进行增删改操作如下,操作成功(注意user表中的其它字段要允许为空,否则操作失败):

INSERT INTO view_user_keyinfo (account, username)

VALUES

('test1', 'test1');

DELETE

FROM

view_user_keyinfo

WHERE

username = 'test1';

UPDATE view_user_keyinfo

SET username = 'updateuser'

WHERE

id = 1

视图与表是一对多关系情况:如果只修改一张表的数据,且没有其它约束(如视图中没有的字段,在基本表中是必填字段情况),是可以进行改数据操作,如以下语句,操作成功;

update view_user_course set coursename='JAVA' where id=1;

update view_user_course set username='test2' where id=3;

以下操作失败:

delete from view_user_course where id=3;

insert into view_user_course(username, coursename) VALUES('2','3');

其它

视图中的查询语句性能要调到最优;

修改操作时要小心,不经意间你已经修改了基本表里的多条数据;

其它性能相关方面待实践体会...

mysql的财务视图_Mysql中的视图相关推荐

  1. mysql视图表修复_mysql中含有视图数据库在恢复数据时视图变成数据表的解决方法...

    # version:      1.0 for linux # method:       全备份mysql数据 # author:       fengzhanhai # history:      ...

  2. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  3. php中使用mysql的视图_MYSQL中视图的用法介绍(代码示例)

    本篇文章给大家带来的内容是关于MYSQL中视图的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.什么是视图 执行一条SQL,将结果集保存在一张虚拟表中 (相关 ...

  4. mysql中视图的概念_MySql中的视图的概念及应用

    视图的基本概念 视图是从一个或几个基本表(或者视图)导出的表.它与基本表不同,是一个虚表. 数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中.所以基本表中的数据发生变化, ...

  5. mysql视图执行原理_MySql中的视图 触发器 存储过程,以及事物

    视图: 一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称.视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图 ...

  6. mysql的视图的名词解释_MySql中的视图的概念及应用

    视图的基本概念 视图是从一个或几个基本表(或者视图)导出的表.它与基本表不同,是一个虚表. 数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中.所以基本表中的数据发生变化, ...

  7. mysql 对视图的操作_Mysql中关于视图操作的详解

    视图的操作: 1.视图的创建:create view view_name as 查询语句; 2.视图的查看:show tables;// 显示所有的表和视图 show create view view ...

  8. mysql 无法创建视图_mysql无法创建视图怎么办

    mysql无法创建视图的解决办法: 基本语法 可以使用 CREATE VIEW 语句来创建视图. 语法格式如下: CREATE VIEW AS 语法说明如下. :指定视图的名称.该名称在数据库中必须是 ...

  9. mysql 5.6物化视图_mysql实现物化视图详解及视图与物化视图区别

    再一次sql优化中一个select count(*)语句因数据量实在太大,已经无法从简单的索引什么进行优化了,在同事的推荐下考虑到了物化视图 物化视图是相对于视图而言的,但是两者实际上并没有什么关系就 ...

最新文章

  1. 开发日记-20190918 关键词 努力
  2. 页面跳转与重定向(之二)
  3. 51单片机微波炉c语言程序,基于51单片机的微波炉控制C源程序.doc
  4. 在传统以太网中,为什么要有最小帧长度和最大帧长度的限制
  5. 博客制作系 -- 2.4. Git
  6. [原]VC被控制时关闭极域电子教室、破解联想硬盘保护系统密码(下)
  7. GoAhead学习之GoForms
  8. 微软官方Windows2003原版下载
  9. Arnold阿诺德电影级渲染器完全教学
  10. chrome 切换标签页快捷键_如何在Chrome浏览器中切换标签页
  11. SpringBoot单元测试的@RunWith与@SpringBootTest注解
  12. numeric转换varchar_数据库中varchar类型数据转换为numeric类型
  13. wangeditor上传本地视频的方法
  14. Python游戏概率补偿算法-马尔科夫链
  15. 基于肤色高斯概率模型的人脸检测
  16. CUDA: 矩阵乘法优化
  17. cc2530自组网的网络结构是什么?在哪里可以修改
  18. 计算机核心期刊排名及投稿经验
  19. 【CTF bugku 秋名山车神】关于会话脚本、session、正则表达式
  20. OpenCV图像处理:基于RANSAC的二维图像中直线、圆及椭圆的检测 C++

热门文章

  1. 父类指针指向子类对象,子类指针不能指向父类对象
  2. Android objdump/nm/readelf使用
  3. linux线程退出正确姿势demo
  4. 802.11 monitor模式
  5. OpenGL环境搭建(四)
  6. AVAssetWriter写h264数据
  7. nginx之反向代理配置
  8. UE4之整合第三方库
  9. android之list排序
  10. matlab 求极小值 一维优化,MATLABoptimization