数据库那点事(Mysql)-后续

本文详细介绍了MySQL中的视图概念、创建与使用,强调了视图在数据安全和复杂查询简化方面的作用。接着讲解了索引的基本原理和使用,包括创建与删除索引,并分析了其优缺点。此外,文章深入探讨了事务的四种隔离级别,通过实例展示了脏读、不可重复读和幻读的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

视图

什么是视图

视图是一个虚拟表,其内容由查询定义的。同真实的表一样,视图包含带名称的列和数据,但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

为什么要有视图呢

视图是存储在数据库中的查询的SQL 语句,主要由两个原因,一个是安全原因,另一个是可使复杂的查询易于理解和使用。

这时候你可能会觉得安全很奇怪?这里怎么涉及安全了?

有时候根据角色的不同,用户得到的信息也不同,比如说一个用户如果要查看另一个用户的信息,有些隐私信息是不能返回的,这时候如果我们只提供一个视图查询,视图里面的属性都是规定好的,那么隐私信息便不会泄漏。

视图的使用

1.查看当前数据中所有视图

/* 之前测试是插入过两个视图,实际上我只选取了两列信息哈 */
select * from information_schema.views where table_schema = 'simfg';

aksjaks

2.创建单表视图

create view view_member (user_id,user_name,descp) 
    as select user_id,user_name,descp from member ;

3.使用视图

select * from view_member;

kajdaksjd

4.创建多表视图

create view 
    view_member_group 
    (user_id,user_name,descp,
    group_name,group_type,group_desc)
    as select a.user_id,a.user_name,a.descp,
        b.name,b.type,b.description
         from member a,`group` b 
         where a.group_id = b.id;

laklakd

5.查看视图

desc view_member;

ajdlasjd

6.修改视图

/* 第1种 */
alter view view_membe (user_name,descp) 
    as select user_name,descp from member;

/* 第2种 */
create or replace view view_membe (user_name,descp) 
    as select user_name,descp from member;

kasjlajs

7.删除视图

drop view view_member;

视图最好只用于查询数据,当然也可以进行插入、修改、删除,但是不是所有的视图都可以进行这些操作,需要满足视图与基本数据保持一对一的关系才可以进行这些操作

索引

什么是索引

索引就想字典的目录一样,当你需要查询每条数据的时候不需要去查询所有数据就可以找到相应的数据。

比如说:你拿一本汉语词典来查某个字,你肯定不是把字典从前往后一直看,直到找到相应的字为止,肯定是先翻到目录找到首字母,然后在查这个字。显然后 面这种方法效率更好,花费时间更少。

基本使用

1.创建索引

/* member_id_index 索引名 */
/* member(user_id) 指定member这个表中user_id这一列 */
create index member_id_index on member(user_id);

laksdla

2.索引的删除

drop index member_id_index on member

由于本地没有那么多数据,所以这个无法演示效果

注意事项

1.优点:大大加快查询效率
2.缺点:维护索引需要耗费时间,且占部分物理空间
3.应该在需要频繁查询的列上加上索引

事务

什么是事务

有些时候,在系统中一连串的服务可能进行一系列的sql操作,如果失败一项则进行回滚,那么这一系列操作就是一个事务

基本命令

/* 设置事务事务 */
set tx_transcation = 'READ-UNCOMMITTED';

/* 开始事务 */
start transaction;

/* 提交事务 */
commit transaction;

/* 回滚事务 */
rollback;

Read Uncommitted

隐患:‘脏读‘,即读取到未提交的数据

absbabs

事务中读取到未提交的数据

如何操作的呢?

1.开启两个命令行,并都登陆mysql
2.然后都设置事务等级为READ-UNCOMMITTED,并都开启事务
3.A窗口进行查询
4.在B窗口中进行修改数据操作,但不提交也不回滚
5.再一次在A窗口查询(发现数据不一样了)
6.B窗口事务回滚
7.最后在A窗口查询

Read Committed

隐患:‘不可重复读‘,即在一个事务中多次读取数据,结果不一样

操作:
将上诉第六个步骤修改为事务提交即可

效果和上诉一样

Repeatable Read(默认)

隐患:‘幻读‘,多次查询所得到的数据量不一样

absbba

可以看到同一事务中多次查询所得到的结果数量不一样

(在这之前你可以先试下是否还会出现‘不可重复读‘的现象)
操作:
1.开启两个命令行,并都登陆mysql
2.然后都设置事务等级为REPEATABLE-READ,并都开启事务
3.A窗口进行查询
4.在B窗口中进行添加数据操作,但不提交也不回滚
5.再一次在A窗口查询(发现数据不一样了)
6.B窗口事务回滚
7.最后在A窗口查询

Serializable(最高等级)

不存在隐患,强制性使事务排序

同时有多个事务存在时,不能在事务中进行数据的添加修改删除

这个需要修改mysql中的配置文件,所以就不演示了


欢迎大家留言转载
如果你觉得该文章还可以,关注微信公众号:SimFG,随时随地看博客要点
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值