MySQL从删库到跑路_高级(三)——视图

作者:天山老妖S

链接:http://blog.51cto.com/9291927

一、视图简介

1、视图简介

视图是由SELECT查询语句所定义的一个虚拟表,是查看数据的一种非常有效的方式。视图包含一系列有名称的数据列和数据行,但视图中的数据并不真实在于数据库中,视图返回的是结果集。

2、创建视图的目的

视图是存储在数据中的查询的SQL语句,创建视图主要出于两种原因:

A、实现安全。视图可设置用户对视图的访问权限。

创建查询是JAVA班学生成绩的视图javaview、NET班学生成绩的视图netview,授权java能够访问javaview视图,授权net可以访问netview视图。

create view javaviewasselect a.StudentID,a.sname,email,c.subJectName,a.class,b.mark from TStudent a join TScore b on a.StudentID=b.StudentIDjoin TSubject c on b.subJectID=c.subJectID where a.class=‘JAVA‘;create view netviewasselect a.StudentID,a.sname,email,c.subJectName,a.class,b.mark 

授权java用户访问schoolDB.javaview视图

grant select on schoolDB.javaview to ‘java‘@‘%‘ identified by ‘123456‘;

授权net用户访问schoolDB.netview视图

grant select on schoolDB.netview to ‘net‘@‘%‘ identified by ‘123456‘;

使用SQL  Manager客户端连接数据库时,java、net用户分别可以访问javaview视图和netview视图。

B、隐藏数据复杂性。视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等。视图就像一个视口,从视口中只能看到过滤后的某些数据列。

3、视图的优点

A、视图能简化用户操作

视图机制使用户可以将注意力集中在所关心地数据上。如果数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的数据查询操作。例如,定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐藏。用户所作的只是对一个虚表的简单查询,而虚表是怎样来的,用户无需了解。

B、视图使用户能以多种角度看待同一数据

视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户共享同一数据库时。

C、视图对重构数据库提供了一定程度的逻辑独立性

数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全的支持。

在关系数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系student(sid,name,sex,age,dept,leader),分为studentinfo(sid,sname,sex,age) 和deptinfo(sid,dept)两个关系。原表student为studentinfo表和deptinfo表自然连接的结果。如果建立一个视图student:

CREATE VIEW student(sid,sname,sex,age,dept)
AS SELECT studentinfo.sid,studentinfo.sname,studentinfo.sex,studentinfo.age,
deptinfo.dept FROM studentinfo, deptinfo WHERE studentinfo.sid=deptinfo.sid;

尽管数据库的逻辑结构变为studentinfo和deptinfo两个表,但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。

视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。

D、视图能够对机密数据提供安全保护

在设计数据库应用系统时,可以对不同的用户定义不同的视图,使机密数据不出现在不应该看到机密数据的用户视图上。如student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本院系学生视图。

E、适当的利用视图可以更清晰地表达查询

例如经常需要执行这样的查询“对每个学生找出他获得最高成绩的课程号”。可以定义一个视图,求出每个同学获得的最高成绩。

4、创建视图的语法

CREATE VIEW viewname(列1,列2...) AS SELECT (列1,列2...) FROM ...;

创建学生信息的视图:

create view studentview as select studentID, sname, sex from TStudent;

二、视图的操作

1、视图的使用

视图的使用和普通表一样。

select * from studentview;

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

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

2、删除视图

drop view studentview;

3、通过视图修改数据

如果视图的基表是一张表。可以通过视图向基表插入记录,要求视图中的没有的列允许为空。

A、通过视图插入数据到表

insert into studentview(studentID,sname,sex) values(‘01001‘,‘孙悟空‘,‘男‘);

查询插入的记录,可以看到通过视图没有的列,值为空或默认值。

B、通过视图删除表中记录

视图的基表只能有一张表,如果有多张表,将不知道从哪一张表删除。

delete from studentview where studentid = ‘01001‘;

C、通过视图修改表中记录

只能修改视图中有的列。

update studentview set sname = ‘孙悟空‘ where studentid = ‘00001‘;

4、查看视图的信息

查看视图的信息

describe viewname; desc scoreview;

查看所有的表和视图

show tables;

查看视图的信息

show fields from scoreview;

5、修改视图

CREATE OR REPLACE VIEW viewname AS SELECT [...] FROM [...];alter view studentview
as select studentID as 学号, sname as 姓名, sex as 性别 from TStudent;

6、WITH CHECK OPTION

如果在创建视图的时候指定了“WITH CHECK OPTION”,更新数据时不能插入或更新不符合视图限制条件的记录。

三、视图实例

1、使用视图创建视图

创建视图的查询的表称为基表,基表可以是视图和表。

create view sview as select studentID, sname, sex from studentview where studentID>990 and sex=‘男‘;

2、创建学生成绩表的视图

创建一个视图,视图包含学生 学号、姓名、学科和成绩。

create view view1 as select a.StudentID, a.Sname, c.subJectName, b.mark from TStudent a join TScore b on a.StudentID = b.StudentID join TSubject c on b.subJectID = c.subJectID;

创建成绩视图,包含学号、姓名、计算机网络课程成绩、数据结构成绩、JAVA开发成绩。

create view scoreview as select stduentid 学号, sname 姓名, AVG(case subjectname when ‘计算机网络‘ then mark END) 计算机网络,AVG(case subjectname when ‘数据结构‘ then mark END) 数据结构,AVG(case subjectname when ‘Java开发‘ then mark END) JAVA开发 from view1 group by 学号;

喜欢的小伙伴们可以搜索我们个人的微信公众号“程序员的成长之路”点击关注或扫描下方二维码

原文地址:https://www.cnblogs.com/cxydczzl/p/9908728.html

时间: 2024-08-04 11:40:47

MySQL从删库到跑路_高级(三)——视图的相关文章

MySQL从删库到跑路_高级(一)——数据完整性

作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.数据完整性简介 1.数据完整性简介 数据冗余是指数据库中存在一些重复的数据,数据完整性是指数据库中的数据能够正确反应实际情况.数据的完整性是指数据的可靠性和准确性,数据完整性类型有四种:A.实体完整性:实体的完整性强制表的标识符列或主键的完整性(通过唯一约束,主键约束或标识列属性).B.域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则)

DBA:多方式删库不跑路

语法;drop database 'DBname'; 说明:普通mysql用户需要root用户赋特定删除或者创建的权限 温馨提醒:删除数据库请多次确认是否要删除,删除数据库是不可逆的操作. 一.MySQL内置删库 [[email protected] ~]# mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 2

理解Linux文档的默认安全机制、隐藏属性、特殊权限,妈妈在也不用担心你从删库到跑路!!!

写在前面 前面的章节 详解Linux文档属性.拥有者.群组.权限.差异,介绍了文档的基本权限,包括读写执行(r,w,x),还有若干的属性,包括是否为目录(d).文件(-).链接文件(l).拥有者.所属群组.容量大小(字节数).最后修改时间等等,可以通过chown.chgrp.chmod来变更这些属性和权限. 默认安全机制 首先,我们使用管理员root账户分别创建文件file001和目录dir001: 从上图可以看到, 文件file001的默认权限为rw-r--r--,即拥有者可读写,同群组下账户

mysql数据库从删库到跑路之mysql数据类型

一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-types.html http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html mysql数据类型概览 1 数字(默认都是有符号,宽度指的是显示宽度,与存储无关) tinyint int bigint:个数,年龄,id,qq号,手

mysql数据库从删库到跑路之mysql多表查询

一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 准备表 company.employeecompany.department #建表 create table department( id int, name varchar(20) ); create table employee( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male

mysql数据库从删库到跑路之mysq索引

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到索引了. 什么是索引? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引优化应该是对查询性能优化最有效的手段了.索引能够轻易

mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用

mysql数据库从删库到跑路之mysql表操作

表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 内容: 1 创建表 2 查看表结构 3 数据类型 4 表完整性约束 5 修改表 6 复制表 7 删除表

Redis勒索事件爆发,如何避免从删库到跑路?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 9月10日下午,又一起规模化利用Redis未授权访问漏洞×××数据库的事件发生,此次×××以勒索钱财作为第一目的,猖狂至极,×××者赤裸裸威胁,直接删除数据库数据.腾讯云安全系统在×××开始不到30s就启动全网拦截. ? 早在2017年,腾讯云就针对该高危漏洞发布过预警,但是仍有不少用户未进行安全加固.腾讯云安全专家提醒用户参考文末方法,尽快安全漏洞修复或部署防御.避免因被×××