数据库视图
什么是视图?
视图就是数据库中的一个对象,是一张虚拟表.视图只具有表结构却不具备表数据.
所以视图不能脱离表存在,否则将没有任何意义.
简而言之,视图就是基于一张已经存在的表,将表中某些字段结构 数据按我们想要的条件呈现出来,是一张具备字段结构,但是却没有数据的表,他的数据全部基于已经存在的表查询.
创建了一张视图就相当于在数据库中内置一条sql查询语句,数据库自动执行,并将结果用表结构的形式呈现.
为什么用视图
简化程序中对SQL语句的编写,更好保证数据的安全。
这句话怎么理解?
前半句就是本来没有视图,直接写查询语句可能需要嵌套联接等等,套啊套,联啊联,复杂而且容易出错,查询效率也不高.那么创建视图之后就是说,有一部分的嵌套条件可以事先查询好以视图的形式存在数据库,而我们编写的sql代码只需要简单的sql查询语句,直接从视图中查询就行了.
那么也正是这种操作,使得程序中的sql比较简单,数据库的操作因此有了隐蔽性,对数据库用户而言,他们只需要知道视图是什么,有这张视图,怎么用这张视图,而不需要知道视图是哪来的.这样就能在一定程度上保证数据安全.当然也只是一定程度上,重要的依然是前半句.众所周知,程序员都是懒鬼,什么技术都逃不过俩字,方便!
视图基本操作
创建视图
create view emp_view as
select e.first_name,d.department_name,l.city
from employees e join departments d on e.department_id = d.department_id
join locations l on d.location_id = l.location_id;
如代码段中所写,运行后就已经创建了一张名为emp_view的视图,这张视图的内容也就是下面这段select语句的结果.
select e.first_name,d.department_name,l.city
from employees e join departments d on e.department_id = d.department_id
join locations l on d.location_id = l.location_id
这时候想要查询员工姓名和部门以及部门地址就再不需要上面那样那么长一串sql语句,而只需要下面这样
select first_name,department_name,city from emp_view;
所以由此可以看出,我们应该为自己的数据库表,存在关联的表,提前设计好视图,专门针对查询频率比较高的多表联查,或者嵌套查询.
如何删除视图
drop view if exists emp_view;
这个没什么好说的,和表差不多,实际上视图创建好了之后用法也和一张表一样,基本上莫得啥子区别!
可以通过视图反向修改表数据吗?
上文说了,视图实际上就是将一个sql查询语句结果存储下来而已,数据其实还是存储在原始表中,修改其实是改动同一个数据,与直接修改原始表数据一模一样,所以答案当然是可以的.
但是!我们并不推荐这么干!首先逻辑就不对,反向修改,通过结果修改,就很扯!第二如果是单表的视图那还好,那如果是10张表联查的视图呢?一个视图里面同时有10张表里面的数据,之间还有联接关系
,怎么改,改的明白吗?
所以这种反向修改,操作上可行,逻辑上不同,而且有难度,容易出错,执意要干的,三思后行,出错后果自行承担.
数据库事务(简单聊聊)
什么是事务?
是一个逻辑上的工作单元,这个工作单元中的所有操作,要么都成功,要么都失败。如同java的原子操作,理解为原子性,即不能执行一半,停掉,或者由于异常中断.实际上原子性也是事务四大特性中的一个.但是简单理解什么是事务,就当他是原子性好了,比较易于理解.
为什么需要事务
很简单嘛!理解什么是事务了,为什么也就显而易见!就是为了保证数据库安全,数据安全正确.保证增删改是一次做完的,而不是做了一半的.
事务如何保证数据库数据正确性?
通过事务的四大特性(ACID):原子性,一致性,隔离性,持久性。
-
Atomicity(原子性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
-
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。比如转账,A转给B,规则就是A扣钱,B加钱.一致性即保证事务执行前后,这个规则是没有被破坏的,即没有发生A扣了钱,B没有加,或者是B加了而A没有扣.
-
Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。这个下面说隔离级别的时候会深入说.
-
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。这个也没有什么好解释的,顾名思义.
事务的隔离级别
隔离级别有哪些?
隔离级别从小到大依次为read uncommitted(读未提交)<read committed(读提交)<repeatable read(可重复读)<Serializable(串行化) ,隔离级别越高,并发性能越差,数据的安全性越好。也就是说,串行化的隔离级别是最高的,但是并发性能是最差的.字面意思也不难理解嘛,串行了,事务必须一个一个来了.
如何查看当前会话使用的事务隔离级别?
select @@tx_isolation;
所谓当前会话就是当前操作的这个窗口,比如当前这个cmd命令行,navicat里面现在在编写的这个新建查询,idea数据库插件里面当前这个console终端.一个就是一个会话,两个会话怎么整?那就打开俩cmd窗口,俩查询,俩console,以此类推.
如何修改当前会话隔离级别?
//修改为读未提交
set session transaction isolation level read uncommitted;
//修改为读已提交
set session transaction isolation level read committed;
//修改为可重复读
set session transaction isolation level repeatable read;
//修改为串行化
set session transaction isolation level serializable;
语句也特别简单,就逐字逐句翻译,set 设置,session会话,transaction事务,isolation隔离性,level级别
也可以简写为下面的语句
//修改为读未提交
set tx_isolation='read-uncommitted';
//修改为读已提交
set tx_isolation='read-committed';
//修改为可重复读
set tx_isolation='repeatable-read';
//修改为串行化
set tx_isolation='serializable';
也很好理解嘛!tx是transaction的意思,外国人喜欢把sac,类似发音简写为x. isolation隔离性嘛,后面跟个等于.这种写法更好记,也更好看!写java习惯的人来说,这个比较舒服.
如何更改全局事务隔离级别?
直接更改整个数据库的事务隔离级别!
set global transaction isolation level read uncommitted; set global transaction isolation level read committed; set global transaction isolation level repeatable read; set global transaction isolation level serializable;set global tx_isolation='read-uncommitted'; set global tx_isolation='read-committed'; set global tx_isolation='repeatable-read'; set global tx_isolation='serializable';
这个没什么好解释的,跟之前的一样就加个global表示全局....
关于事务的更多更深的东西,下一篇专门拿来将,不然要分两篇,麻烦!