知识点七:MySQL视图的创建(14)

视图的定义:

  什么是视图:

    视图数由查询结果形成的一张虚拟的表。

   什么时候要用到视图?

    如果某个查询结果出现的非常频繁,也就是,要经常拿这个查询结果来做子查询。

  使用视图的好处:

    1.简化查询语句:

      案例:比如求每个人的平均工资。

 --简化查询语句
use mzjj;
CREATE OR REPLACE VIEW v_salaries
AS
SELECT employees.emp_no,first_name,last_name,IFNULL(AVG(salary),0) AS salary FROM employees LEFT JOIN salaries
ON employees.emp_no =salaries.emp_no GROUP BY employees.emp_no; SELECT * FROM v_salaries;
SELECT * FROM v_salaries WHERE emp_no =1001;

简化查询语句测试

    2.可以进行权限控制:

     把表的权限封闭,但是开放相应的视图权限,视图只开放部分数据列;

      案例:比如把员工的工资表的权限关闭,但是开放员工的发放工资的次数的权限。

 --权限控制
CREATE VIEW v_getSalaryCount
AS
SELECT employees.emp_no,first_name,last_name,COUNT(salary) AS salaryNum FROM employees LEFT JOIN salaries
ON employees.emp_no =salaries.emp_no GROUP BY employees.emp_no; SELECT * FROM v_getSalaryCount;
SELECT * FROM v_getSalaryCount WHERE emp_no =1001;

权限管理测试

    3.大数据表分类的时候,比如某张表的数据有100万条,那么可以将这张表分为四个视图

     按照对ID取余的计算;

 --大数据分区
CREATE VIEW v_employees1
AS
SELECT * FROM employees WHERE emp_no % 4 =0; CREATE VIEW v_employees2
AS
SELECT * FROM employees WHERE emp_no % 4 =1; CREATE VIEW v_employees3
AS
SELECT * FROM employees WHERE emp_no % 4 =2; CREATE VIEW v_employees4
AS
SELECT * FROM employees WHERE emp_no % 4 =3;

分区测试

  视图与表的关系:

    视图是表的查询结果,自然表的数据变化了,会影响视图的结果。

  能否对视图表进行增删改查:

    视图的增删改也会影响表;

    但视图并不总是能增删改的

    视图的数据与表的数据一一对应时可以修改;

    对视图的insert还应注意:视图必须包含表中没有默认值的列。

视图的创建:

   视图的创建语法:

    CREATE [OR REPLACE] [ALGORITHM ={UNDEFINED | MERGE | TEMPEABLE}]

      VIEW view_name [(column_list)]

      AS select_statement

      [WITH [CASCADED | LOCAL] CHECK OPTION]

    注释:该语句能创建新的视图,如果给定了OR REPLACE子句,该语句还能替换已有的视图。

select_statement是一种SELECT语句,它给出了视图的定义。该语句可从基表或其他视图进行选择。

深入理解视图:

  视图的存放位置:

    视图存放在information_schema数据库的views表里。

  存在两种执行算法:

    Merge:合并的执行方式,每当执行的时候,先将我们的视图的sql语句与外部查询视图的sql语句,混合在一起,最终执行。

    Temptable:临时表模式,每当查询的时候,将视图所使用的SELECT语句生成一个结果的临时表,再在当前的临时表内进行查询。

  指的是一个视图是在什么时候执行,依据那些方式执行:

    对于MERGE,会将引用视图的语句的文本与视图定义结合起来,使得视图定义的某一部分取代语句的对应部分。

    对于REMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

    对于UNDEFINED,MySQL将选择所需要使用的算法。如果可能,它倾向于MERGE而不是REMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

视图的管理:

  查看视图的定义:

    SHOW TABLE STATUS [FROM 数据库名称] [LIKE ‘视图名称匹配’];

  删除视图

    只能删除视图的定义,不能删除数据,必须有drop权限。

    DROP VIEW [IF EXISTS] view_name [RESTRICT | CASCADE]

  查看权限:

    SELECT drop_priv FROM mysql.user WHERE USER=’root’;

   删除视图:

    DROP VIEW IF EXISTS worker_view1;

   删除多个:

    DROP VIEW IF EXISTS department_view1, department_view2;

关于视图更新的问题:

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

  中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更巨头的讲,如果视图包含下述结构的任意一种,那么它就是不可更新的:
    1.聚合函数(SUM(),MIN(),MAX(),COUNT(),等

    2.DISTINCT

    3.GROUP BY

    4.HAVING

    5.UNION或UNION
ALL
    6.位于选择列表的子查询

    7.JOIN

    8.FROM子句中的不可更新视图

    9.WHERE子句中的子查询,引用FROM子句中的表。

    10.仅引用文字值(在该情况下,没有要更新的基本表)

    11.ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。

 --视图更新
--原表
CREATE VIEW v_salaries
AS
SELECT emp_no,salary FROM salaries; UPDATE v_salaries SET salary=2500 WHERE emp_no =1001; --修改后
CREATE OR REPLACE ALGORITHM = TEMPTABLE VIEW v_salaries
AS
SELECT emp_no,salary FROM salaries; --更新不了,因为存在 ALGORITHM = TEMPTABLE,破坏了更新条件
UPDATE v_salaries SET salary=2500 WHERE emp_no =1001;

视图的更新测试

关于WITH CHECK OPTION的理解及应用:

  with check option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。

  with check option:更新视图的数据,那么必须先满足视图的条件,满足之后才能够更新到基表中。

 --对WITH CHECK OPTION的理解及应用
CREATE OR REPLACE VIEW v_salaries
AS
SELECT emp_no,salary FROM salaries WHERE emp_no=1001
WITH CHECK OPTION; --不能更新,因为1002不在视图条件内
UPDATE v_salaries SET salary=2000 WHERE emp_no =1002;
--可以跟新
UPDATE v_salaries SET salary=2000 WHERE emp_no =1001;

WITH CHECK OPTION的理解及应用测试

MYSQL进阶学习笔记六:MySQL视图的创建,理解及管理!(视频序号:进阶_14,15)的更多相关文章

  1. mysql的学习笔记(六)

    1.字符函数 (1).CONCAT(str1,str2,...)函数,将多列信息合并输出. SELECT CATCAT('hello','mysql') as test (2).CONCAT_WS(' ...

  2. MYSQL初级学习笔记六:子查询!(视频序号:初级_42 | 43)

    知识点八:子查询(42) 什么是子查询: 子查询是将一个查询语句嵌套在另一个查询语句中.内层查询语句的查询结果,可以作为外层查询语句提供条件. 引发子查询的情况: 使用[NOT] IN 的子查询 -- ...

  3. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  4. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  6. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  7. Mysql数据库学习笔记之数据库索引(index)

    什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...

  8. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

  9. mysql的学习笔记(一)

    前言 开发中经常用mysql和SQL server交替使用,自己都产生知识的混乱.在这里重新整理下mysql的知识,也是梳理自己知识点,因为是学习笔记,所以并不会使用到图形化管理工具.mysql的安装 ...

随机推荐

  1. 计算系数(codevs 1137)

    题目描述 Description 给定一个多项式(ax + by)^k,请求出多项式展开后x^n y^m项的系数. 输入描述 Input Description 共一行,包含 5 个整数,分别为a,b ...

  2. 转载自CSDN,结论:windows下按ENTER键应该是\r\n ascii码为 13 10

    记得在Windows下学X86汇编语言时,用0DH(\r)和0AH(\n)来输出回车(跳到下一行的开始处).问题来了,在Windows下是 先回车再换行呢还是先换行再回车呢?在Unix系统下换行只有\ ...

  3. Scrapy学习-4-Items类&Pipelines类

    items类使用 作用 能使得我们非常方便的操作字段名 在items.py中定制我们的类 class ArticleItem(scrapy.Item): title = scrapy.Field() ...

  4. android的系统学习

    先从Android的应用开发开始,等到对应用掌握的比较熟悉了,开始慢慢阅读一些Android 应用框架层的源代码,然后再渐渐往下去了解Android的JNI.Libraries.Dalvik虚拟机.H ...

  5. Angular Material & Hello World

    前言 Angular Material(下称Material)的组件样式至少是可以满足一般的个人开发需求(我真是毫无设计天赋),也是Angular官方推荐的组件.我们通过用这个UI库来快速实现自己的i ...

  6. 创建ROS工作空间和包

    一.创建工作空间 mkdir -p ~/openni_ws/src cd ~/openni_ws catkin_make        //在catkin工作空间(openni_ws)下catkin_ ...

  7. 10分钟学会前端工程化(webpack4.0)

    一.概要 1.1.前端工程化 随着前端的不断发展与壮大,前端变得越来越复杂,组件化.模块化.工程化.自动化成了前端发展中不可或缺的一部分,具体到前端工程化,面临的问题是如何提高编码->测试-&g ...

  8. [转] windows下Svn服务器之必须提交修改注释篇

    1. 强制添加注释信息 找到Respositories目录下对应项目里的hooks目录下建立pre-commit.bat文件,复制如下内容: @echo off set SVNLOOK="C ...

  9. Android 学习笔记---获取RadioGroup的选定值

    1,获取RadioGroup控件: RadioGroup radioGroup = (RadioGroup)findViewById(R.id.myRadioGroup); 2,获取RadioButt ...

  10. centos的python2.6.x升级到python2.7.x方法;python2.6.x的版本就不要用了

    python2.6.x的版本,现在使用的很多插件都不支持了.所以如果你的centos还是使用的2.6.x版本,不要犹豫,赶紧升级到2.7.x版本 1.所谓升级,就是再安装一个python2.7.x版本 ...