《数据库优化》- MySQL视图

一、什么是视图

  视图,是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改,视图基于的表称为基表。视图是存储在数据字典里的一条select语句。
  通俗地讲,视图就是一条 Select 语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条 SQL 查询语句上。

二、视图的特性及优点

 1、特性

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

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

 2、优点

  ● 对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。

  ● 用户通过简单的查询可以从复杂查询中得到结果。

  ● 维护数据的独立性,视图可从多个表检索数据。

  ● 对于相同的数据可产生不同的视图。

三、视图的分类、作用及使用场合

 1、分类:

  视图分为简单视图复杂视图

  简单视图只从单表里获取数据,复杂视图从多表;

  简单视图不包含函数和数据组,复杂视图包含;

  简单视图可以实现DML操作,复杂视图不可以.。

 2、作用:

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

  更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建视图,可以把权限限定到行列级别;(例如我们只想给其他人展示账号和用户名,密码不展示,则可以通过视图实现。)

 3、使用场合:

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

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

四、创建视图

  有如下3张表:Student(学生)、Course(课程)、学生课程中间表(Student_Course),表结构及数据如下:

 1 -- ============================
 2 -- Table structure for `Student`
 3 -- ----------------------------
 4 DROP TABLE IF EXISTS `Student`;
 5 CREATE TABLE `Student` (
 6   `id` bigint(20) NOT NULL AUTO_INCREMENT,
 7   `account` varchar(255) NOT NULL,
 8   `name` varchar(255) NOT NULL,
 9   `address` varchar(255) DEFAULT NULL,
10   `others` varchar(200) DEFAULT NULL,
11   `others2` varchar(200) DEFAULT NULL,
12   PRIMARY KEY (`id`)
13 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
14
15 -- ----------------------------
16 -- Records of Student
17 -- ----------------------------
18 INSERT INTO `Student` VALUES (‘1‘, ‘Student1‘, ‘小陈‘, ‘美国‘, ‘1‘, ‘1‘);
19 INSERT INTO `Student` VALUES (‘2‘, ‘Student2‘, ‘小张‘, ‘日本‘, ‘2‘, ‘2‘);
20 INSERT INTO `Student` VALUES (‘3‘, ‘Student3‘, ‘小王‘, ‘中国‘, ‘3‘, ‘3‘);
21
22 -- ============================
23 -- Table structure for `Course`
24 -- ----------------------------
25 DROP TABLE IF EXISTS `Course`;
26 CREATE TABLE `Course` (
27   `id` bigint(20) NOT NULL AUTO_INCREMENT,
28   `name` varchar(200) NOT NULL,
29   `description` varchar(500) NOT NULL,
30   PRIMARY KEY (`id`)
31 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
32
33 -- ----------------------------
34 -- Records of Course
35 -- ----------------------------
36 INSERT INTO `Course` VALUES (‘1‘, ‘JAVA‘, ‘JAVA课程‘);
37 INSERT INTO `Course` VALUES (‘2‘, ‘C++‘, ‘C++课程‘);
38 INSERT INTO `Course` VALUES (‘3‘, ‘C语言‘, ‘C语言课程‘);
39
40 -- ============================
41 -- Table structure for `Student_Course`
42 -- ----------------------------
43 DROP TABLE IF EXISTS `Student_Course`;
44 CREATE TABLE `Student_Course` (
45   `id` bigint(20) NOT NULL AUTO_INCREMENT,
46   `Studentid` bigint(20) NOT NULL,
47   `Courseid` bigint(20) NOT NULL,
48   PRIMARY KEY (`id`)
49 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
50
51 -- ----------------------------
52 -- Records of Student_Course
53 -- ----------------------------
54 INSERT INTO `Student_Course` VALUES (‘1‘, ‘1‘, ‘2‘);
55 INSERT INTO `Student_Course` VALUES (‘2‘, ‘1‘, ‘3‘);
56 INSERT INTO `Student_Course` VALUES (‘3‘, ‘2‘, ‘1‘);
57 INSERT INTO `Student_Course` VALUES (‘4‘, ‘2‘, ‘2‘);
58 INSERT INTO `Student_Course` VALUES (‘5‘, ‘2‘, ‘3‘);
59 INSERT INTO `Student_Course` VALUES (‘6‘, ‘3‘, ‘2‘);

  表数据:

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

SELECT sc.id AS id, s.name AS Studentname, c.name AS Coursename
  FROM Student s
  LEFT JOIN Student_Course sc
    ON ((s.id = sc.Studentid))
  LEFT JOIN Course c
    ON ((sc.Courseid = c.id))
 WHERE s.name = ‘小张‘;

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

 1 -- ============================
 2 -- View structure for `View_Student_Course`
 3 -- ----------------------------
 4 DROP VIEW
 5 IF EXISTS `View_Student_Course`;
 6
 7 CREATE ALGORITHM = UNDEFINED
 8 DEFINER = `root`@`localhost`
 9 SQL SECURITY DEFINER
10 VIEW `View_Student_Course` AS (
11     SELECT
12         sc.id AS id, s.name AS Studentname, c.name AS Coursename
13     FROM
14         (
15             (
16                 Student s
17                 LEFT JOIN Student_Course sc ON ((s.id = sc.Studentid))
18             )
19             LEFT JOIN Course c ON ((sc.Courseid = c.id))
20         )
21 );

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

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

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

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

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

SELECT
    vsc.studentname,
    vsc.coursename
FROM
    View_Student_Course vsc
WHERE
     vsc.studentname = ‘小张‘;

三、视图的增删改

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

update view_student_course set studentname=‘test‘,coursename=‘JAVASCRIPT‘ where id=3;

  不错所料,操作失败,信息如下:

  [SQL] update view_student_course set studentname=‘test‘,coursename=‘JAVASCRIPT‘ where id=3

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

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

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

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

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

-- ----------------------------
-- View structure for `view_student_keyinfo`
-- ----------------------------
DROP VIEW
IF EXISTS `view_student_keyinfo`;

CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `view_student_keyinfo` AS SELECT
    `u`.`id` AS `id`,
    `u`.`account` AS `account`,
    `u`.`name` AS `studentname`
FROM
    `student` `u`;

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

INSERT INTO view_student_keyinfo (account, studentname)
VALUES
    (‘test1‘, ‘test1‘);
DELETE
FROM
    view_student_keyinfo
WHERE
    studentname = ‘test1‘;
UPDATE view_student_keyinfo
SET studentname = ‘updatestudent‘
WHERE
    id = 1

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

update view_student_course set coursename=‘JAVA‘ where id=1;
update view_student_course set studentname=‘test2‘ where id=3;

  

  以下操作失败:

delete from view_student_course where id=3;
insert into view_student_course(studentname, coursename) VALUES(‘2‘,‘3‘);

四、其他

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

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

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

  转载自:风一样的码农 - 《Mysql中的视图

view_student_course 

原文地址:https://www.cnblogs.com/qiuhaitang/p/12594619.html

时间: 2024-08-30 06:26:09

《数据库优化》- MySQL视图的相关文章

7Python全站之路系列之MySQL视图

Python全栈之路系列之MySQL视图 视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,并可以将其当作表来使用. 创建视图 创建一个名称为v1的视图,其功能就是查询color表中的所有数据 CREATE VIEW v1 AS SELECT * FROM color; 查看视图 使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建.更新和删除操作,仅能做查询用. select * from 

第11章 mysql 视图

2015-10-24 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 范德兰斯.MySQL开发者SQL权威指南 [M].北京:机械工业出版社,2008 [4] Forta.MySQL必知必会 [M].北京:人民邮电出版社,2009 [5] mysql视图学习总结 [6] mysql之视图 [7] mysql之视图详解

八、mysql视图、存储过程、函数以及时间调度器

1.create or replace view emp_view as select * from t4 ;给t4表创建一个名为emp_view的视图 2.drop view emp_view 删除视图 ======================================= 1.创建一个存储过程(查询所有数据) create procedure p1 () READS SQL DATA BEGIN select * from t4; END 2.创建一个存储过程(查询传参数据) cre

MySQL视图view/存储过程和函数的使用

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px ".PingFang SC Semibold"; color: #454545 } p.p3 { margin: 0.0px 0.0px 2.0px 0.0px; font: 14.0px

深入解析MySQL视图view

阅读目录---深入解析MySQL视图 创建视图 查看视图 视图的更改 create or replace view alter DML drop 使用with check option约束 嵌套视图 定义视图时的其他选项:algorithm.definer.SQL security 视图查询语句的处理 替代方法 具体化方法 Q:什么是视图?视图是干什么用的? A: 视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据.作为一个select语句保存在数据字典中的. 通过视图,可以展现

MySQL视图概述

1.介绍 在传统关系型数据库里,视图有时也被称作虚表,是基于特定SQL结果集的虚拟数据表.在有些场合会变得很方便,例如:原有系统重构,旧的数据表A和B已经被拆分和合并到数据表C.D.F里面,为了实现平滑迁移不影响对外数据业务,可以分别创建和原有数据表A和B一致的视图G和H,再实现数据层升级,不影响现有业务. 2.创建 创建MySQL视图语法如下 CREATE [ALGORITHM=[UNDEFINED | MERGE | TEMPTABLE] ] [DEFINER=用户名] [SQL SECUR

MySQL 视图使用初探

<一> 视图 1.优点 视点集中 简化操作 定制数据 合并分割数据 安全性 2.为什么需要视图? 视图是存储在数据库中的查询的sql 语句,它主要出于两种原因: 安全原因,视图可以隐藏一些数据,如社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等, 可使复杂的查询易于理解和使用. 3.创建视图的语法 CREATE VIEW view_name      AS         SELECT column_name(s)         FROM table_name    

Mysql视图的作用及其性能分析

定义:视图是从一个或几个基本表导出的表,它与基本表不同,是一个虚表. 作用: 1.简化操作,不用进行多表查询. 2.当不同种类的用用户共享同一个数据库时,非常灵活,(用户以不同的 方式看待同一数据. 3.视图对重构数据库提供了一定程度的逻辑独立性. 数据的逻辑独立性是指:如增加新的关系或对原有的关系增加新的 字段,用户的应用程序不受影响. 例如:原有一个Student(Sno,Sname,Ssex,Sage,Sdept)这样一个表. 后来变动为:Sx(Sno,Sname,Sage)和SY(Sno

MySQL 视图知识点小结

视图本身是一个虚拟表,不存放任何数据.在使用SQL语句访问视图的时候,它返回的数据是MySQL从其他表中生成的.视图和表在同一个命名空间, MySQL在很多地方对于视图和表是同样对待的.不过视图和表也有不同.例如,不能在视图上创建触发器,也不能用DROP TABLE命令删除视图. 视图的实现算法: 合并算法:merge 临时表算法:tmptable 可更新视图(updatable view):可以通过更新视图来更新视图涉及的相关表. 如果视图定义中包含了group by .union.聚合函数.

MYSQL视图的学习笔记

MYSQL视图的学习笔记,学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆 课程笔记的综合. 视图及图形化工具   1.       视图的定义 视图就是从一个或多个表中,导出来的表,是一个虚拟存在的表.视图就像一个窗口(数据展示的窗口),通过这个窗口,可以看到系统专门提供的数据(也可以查看到数据表的全部数据),使用视图就可以不用看到数据表中的所有数据,而是只想得到所需的数据. 在数据库中,只存放了视图的定义,并没有存放视图的数据,数据还是存储在原来的表里,视图的数据是依赖原来表中的