目录
MySQL 表的增删查改(进阶篇)
// 内容有点多,咱就新开一篇,xdm点击链接自取哦
// 进阶: MySQL 表的查询进阶
Mysql 进阶篇
// 这篇是我们的进阶篇,0基础的xdm建议还是从基础篇开始学习哦
// 基础篇请看 MySQL基础篇
// 1. 数据库的语言是不区分大小写的哦(您自己设置的密码除外),所以我写的代码大多都是以小写形式写的,xdm自便就好;
// 2. 作者用的是MySQL5.7版本,有需要可以私信我哦;
// 3. 咱们这个版本MySQL中的语句以; 为结束标志,回车表示换行;
// 4. 在编写代码过程中如果出现报错不要慌,看看报错信息,及时改过来就好,MySQL语句很简单的,大多数时候报错都是因为步骤或者单词拼写错误;
// 5. 编程语言其实很简单,就是拿语言规定的语法将自己的想法表达出来,简单点说就是咋想的就咋写!
索引
// 若要创建索引,最好是在刚开始创建表的时候就创建, 如果后期再创建会涉及到很多数据内容的修改, 会占用很多资源(硬盘空间)和带宽,可能会出现数据库卡死等危险, 所以一定要谨慎操作
1. 概念
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。
2. 作用
// 数据库中的表, 数据, 索引之间的关系, 类似于书架上的图书, 书籍内容和书籍目录的关系
// 索引起的作用类似于书架上图书的书籍目录, 可快速定位, 检索数据
// 索引对于提高数据库的性能有很大的帮助
3. 使用场景
// 对数据库表的某列或某几列创建索引, 需要考虑一下几点:
(1). 数据量较大, 且经常对这些列进行条件查询;
(2). 该数据库表的插入操作, 及对这些列的修改操作频率较低;
(3). 索引会占用额外的磁盘空间.
// 满足以上条件时, 考虑创建索引来提高查询效率, 反之, 如果非条件查询列, 或经常做插入, 修改操作, 或磁盘空间不足时, 不考虑创建索引!!
4. 使用
// 创建主键约束(PRIMARY KEY), 唯一约束(UNIQUE), 外键约束(FOREIGN KEY)时, 会自动创建对应列的索引
4.1 查看索引:
语法:
show index from 表名;
案例:
// 查看学生表已有的索引
show index from student;
4.2 创建索引
// 对于非主键, 非唯一约束, 非外键的字段, 可以创建普通索引
语法:
create index 索引名 on 表名(字段名)
案例:
// 创建班级表中, name 字段的索引
create index idx_classes_name on classes(name);
-- 可以顺便查看一下我们创建的索引
show index from classes;
4.3 删除索引
语法:
drop index 索引名 on 表名;
案例:
// 删除刚刚创建的班级表中 name 字段的索引
drop index idx_classes_name on classes;
-- 删除完成后我们再查看一下现在 classes 表中的索引
show index from classes;
4.4 索引的数据结构
// 为数据库量身定制的数据结构: B+ 树
// B+ 树是我们针对 mysql innodb 这个存储引擎来讨论, 如果其他存储引擎可能会用到 hash 作为索引 => 只能应对这种精准匹配的情况了~
事务(初阶)
1. 为什么使用事务
// 假如有一条关于改变两个关联数据(数据A 和数据B) 的语句时, A数据 变化多少, B数据 反向变化多少, 但是在正在执行第一条数据A 减少的语句时是正常的, 但当开始执行第二条数据B 增加的语句时出现了网络错误或者数据库掉了, 导致前一条数据A 减少的同时后一条数据B 并未增加, 那么就会造成额外损失,这时候就需要事务来控制了
// 解决方案: 使用事务来控制, 保证之前例子中的两条语句要么都执行成功, 要么都执行失败
2. 事务的概念
事务是指逻辑上的一组操作, 组成这组操作的各个单元, 要么全部成功, 要么全部失败
// 在不同的环境中, 都可以存在事务, 在数据库中就是数据库事务
3. 使用
3.1 创建新的测试表:
drop table if exists accout;
create table accout(
id int primary key auto_increment,
name varchar(20) comment '账户名称',
money decimal(11,2) comment '金额'
);
insert into accout(name, money) values
('阿里巴巴', 5000),
('四十大盗', 1000);
3.2 开启事务:
start transaction;
3.3 执行多条SQL语句
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
3.4 回滚或提交:
rollback/ commit;
// rollback 即是全部失败, commit 即是全部成功
4.事务的基本特性(重要)
(1) 事务 => 原子性: 保证多个操作呗打包成一个整体, 要么能够全都执行正确, 要么就都不执行
(2) 事务 => 一致性: 事务执行前和事务执行后, 数据要能对上, 数据不能离谱(通过约束和回滚机制支撑)
(3) 事务 => 持久性: 事务这里执行的各种操作, 都是持久生效的(最终写入到硬盘中的)
// 一旦事务执行成功了, 这里的所以操作产生的修改都是写入到硬盘中的,会持久保存生效
// 计算机中, 谈到持久,一般都和硬盘脱不了干系, 因为硬盘中存储的数据就是持久话存储的
(4) 事务 => 隔离性: 并发执行事务的时候, 隔离性会在执行效率和数据可靠性之间做出权衡
// "隔离"描述的是同时执行的事务之间相互的影响
// 隔离性越高, 并发性就越低, 数据越可靠, 性能就越低
并发执行事务中常见的几种问题及解决方法(重要!!!)
① 脏读: 读取的数据是临时的, 并非是最终的准确结果
// 解决方法: 给 "写" 操作加锁, 一个事物A 写的时候, 其他事务B 不能读了, 直到 A事务写完数据, 提交事务, 其他的事务B 才能继续读取数据(我写的时候, 别人不能读, 除非我提交后才能读)
② 不可重复读: 在同一个读取数据的事务中, 可能会涉及到多次读操作, 多个读操作读到的数据不一样
// 解决方法: 给 "读" 操作加锁, 别人读的时候, 我不能写了
// 给 "读" 操作加锁意味着: 并发程度又进一步降低了, 隔离性进一步提高了, 也就是执行效率降低了, 但是数据可靠性提高了
③ 幻读: 我在写的时候不修改大家正在读的代码, 我创建一个新的类来编写, 导致一个事务在多次读的过程中, 虽然那个读到的数据的值是一样的, 但是结果集不同; 可以视为是 不可重复读 的特殊情况
// 解决方法: 串行化, 彻底放弃并发执行事务(一个事务执行完之后, 下一个事务才能执行)
// 串行: 所有的事务都是一个一个排队执行
// 此时: 并发性最低, 隔离性最高, 同时效率最低, 数据最可靠
MySQL 提供的四种隔离级别
① read uncommitted(RU): 允许读未提交的数据, (脏读, 不可重复读, 幻读) 隔离性最低, 并发程度最高, 数据可靠性最低, 效率最高;
② read committed(RC): 允许读取已经提交的数据(给写加锁了) 解决脏读, 存在不可重复读和幻读, 隔离性提高了, 并发性降低了, 数据可靠性提高了, 效率降低了
③ repeatable read(RR): 可以重复读取数据(给写操作和读操作都加锁) 解决了脏读和不可重复读, 存在幻读, 隔离性进一步提高, 并发性进一步降低, 数据可靠性更高了, 效率更低了
④ serializable: 事务彻底串行执行, 解决了脏读, 不可重复读, 幻读的问题, 隔离性最高, 并发性最低(没有), 数据最可靠, 执行效率也最低
// MySQL 可以配置自己的隔离级别, 咱们可以根据需要来决定使用哪种隔离级别
// 大部分情况下默认的隔离级别(repeatable read 简称 RR )就够用了
JDBC编程(初阶)
// 因为这个比较关键的一块内容,因为我们需要用 idea 来链接数据库进行操作,所以单独开一篇为xdm 讲解一下, 下面有链接,有需要的自己点击哦
尾言
爆肝不易, 希望xdm 留下个宝贵的三连, 帅哥总是这么懂得共情,美女总是人美心善,祝大家暴美暴富!!!