diff --git "a/12 \345\217\266\344\277\212\350\275\266/20231025\346\200\273\345\244\215\344\271\240 \346\227\245\345\277\227 .md" "b/12 \345\217\266\344\277\212\350\275\266/20231025\346\200\273\345\244\215\344\271\240 \346\227\245\345\277\227 .md" new file mode 100644 index 0000000000000000000000000000000000000000..302cde3112f0481a0641e096a9171c7df4be2b80 --- /dev/null +++ "b/12 \345\217\266\344\277\212\350\275\266/20231025\346\200\273\345\244\215\344\271\240 \346\227\245\345\277\227 .md" @@ -0,0 +1,388 @@ +2023年10月25日 + +周二 + +天气:晴 + +心情:不好 + +# ER图 + +1对1:任意一个表主键当外建 + +1对n:1的表主键当外建 + +n对n:建立中间表 拥有两个以上外键 + +RABC:基于角色 + +# 视图view + +create view 视图名称 as select * from 表名 + +修改create or replace view 视图名称 as select from 表名 + +# 函数 + +截取 + +substring() + +substr() + +mid() + +ltrim()去左边 + +rtrim()去右边 + +随机数: rand() [0,1] 小数 + +向下取整 : floor (rand()) + +向上取整: ceil(rand() ) + +合并字符串:select concat() + +字符串长度: length() turncate 1、截取 2、保留几位小数。 + +替换字符串 : replace : select replace (@a ,'软件','信息')。 + +填充补位: select ipat(8,8,0) 0.0000008。 + +# 存储过程procedure + +delimiter// +-- 创建存储过程 +create procedure pro_tb1() --IN OUT INOUT +begin +select * from t11; +select * from t12; +end // +delimiter ; +-- 调用 +call pro_tb1; + +# 循环 + +loop死循环 + +while条件循环 + +repeat至少执行一次的循环 + +iterate跳过循环进入下一循环 + +leave终止 + +# 储存函数function + +``` +create function func_name([ name type)]) +returns varchar +[characteristic] +begin + routine_body +end; +``` + +# 触发器tiggeers + + create trigger 触发器名称 + before/after(触发时机) insert/update/delete(触发类型) + on 表名 for each row -- 行级触发器 + begin + 触发的语句 + end; +查看show triggers 删除drop trigger 触发器名称 + +# 游标 + +```sql +游标概念:游标可以用来依次取出查询结果集中的每一条数据(逐条读取,结果集中的每一条记录)。 + +1、声明邮标:declare 游标名称 cursor for sql查询语句 + + declare score cursor for select score_id; + +2、打开游标: open 游标名称 + + open score + +3:使用游标的语法 + + -- 使用游标结合循环语句一起使用 + -- 使用游标(提取游标当前指向的数据)之后往下移动 + -- FETCH 游标名称 INTO 变量1,变量2...; + FETCH socre INTO id , name ,chji; + + + +4、获取记录 + +fetch 游标名称 into 变量[,变量] + +5、关闭游标 + +close 游标名称 + + close score + +条件处理程序:关键字 handler + +可以用来定义在流程控制结构执行过程中所遇到的问题是相应的处理步骤 + +具体语句: + + declare handler_action handler for condition_value [, condition_value ] + +handler_action :取值 + +continue :继续执行当前的程序 + +exit : 终止执行当前程序 + +condition_value :取值 + +SQLSTATE sqlstate_value: 状态码 02000; + +SQLWARNING:所有01开头的sqlstate 代码简写 + +not found :所有02开头的 sqlstate 代码简写 + +SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND捕获的SQLSTATE代码的简写 +``` + +# 窗口函数 + +```sql + +非聚合窗口函数:是相对于聚合函数来说的,特性为非聚合。一次只处理一行数据。 + +窗口聚合函数:窗口聚合函数在单元行上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并且不会改变行数。 + +### 窗口函数的语法结构: + +关键字 : over 指定函数窗口的范围 + +语法 + + 窗口函数名称(参数) over (partition by 。。。 order by ...窗口大小) + +parttiton by 分组 等价于 group by + +order by 排序 + +## 序号函数 + +row_number():它为结果集的分区中的每一行分配一个连续的整数。 行号以每个分区中第一行的行号开头。row_number函数:对于4,4,4,8,也就是如果有并列名次的行,排序结果是:1,2,3,4 + +rank():rank函数:对于4,4,4,8,也就是如果有并列名次的行,排序结果是:1,1,1,4 + +dense_rank():dense_rank函数:对于4,4,4,8,也就是如果有并列名次的行,排序结果是:1,1,1,2 +``` + +# 索引 + +```sql +关键字:index 帮助MySQL 高效获取数据的数据结构 + +## 普通索引: + +直接在原有的表上创建索引: + + create index 索引名 on 表明(列名) + +修改表的结构追加普通索引: + + Alter table 表名 add index 索引名(列表名) + +如何查看已有的索引 + + show index from 表名 + +删除索引: 直接删除 + + drop index 索引名 on 表名 + + alter table 表名 drop index 索引名 + +## 唯一索引: + +关键字:unique + +创建唯一索引: + + create unique index 索引名 on 表名 (列名) + +在已存在的表上追加唯一索引: + + alter table 表名 add unique 索引名(列名) + +删除唯一索引的方法与删除普通索引相同 + +## 主键索引: + +特殊的唯一索引 不允许有空值 ,一般创建表时会 创建索引 + +删除主键索引 不能用 drop index: + + alter table 表名 drop primary key + +## 联合索引: + + create index 索引名 on 表名(列名1,列名2....) -- 普通的联合索引 + create unique index 索引名 on 表名(列名1,列名2....) -- 联合唯一索引 + +*执行原则:最左前缀法则 + +最左前缀法则(联合索引) + +如果使用了联合索引,要遵守最左前缀法则。 + +最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,后面的字段索引失效。 +``` + +# 事物 + +```sql +事务 + +一组SQL 语句,要么全部成功,要么全部失败 ,不存在半失败半成功 + +## 事务特性: ACID + +1、原子性:(Atomicity) ,事务的整个过程如[原子操作](https://so.csdn.net/so/search?q=%E5%8E%9F%E5%AD%90%E6%93%8D%E4%BD%9C&spm=1001.2101.3001.7020)一样,最终要么全部成功,或者全部失败,这个原子性是从最终结果来看的,从最终结果来看这个过程是不可分割的。 + +2、一致性:(Consistency) ,一个事务必须使数据库从一个一致性状态变换到另一个一致性状态。 + +3、 隔离性(Isolation) 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 + +隔离级别: + +读未提交:read uncommitted + +读已提交:read committed + +可重复读:repeatable read + +串行化:serializable + +4、持久性: (Durability):一个事务一旦提交,他对数据库中数据的改变就应该是永久性的。当事务提交之后,数据会持久化到硬盘,修改是永久性的。 + +## MYSQL中的事务操作: + +分为隐式操作和显式操作 + +其中MYSQL中事务的默认为隐式事务,执行insert、update、delete 操作的时候,数据库自动开启事务、提交或回滚事务。 + +是否开启隐式事务是由变量autocommit控制的。 + +### 两种开启手动控制事务的操作: + +#### 方法一、 + + -- 设置不自动提交事务 + set autocommit =0; + set autocommit = off; + + // 执行事务操作 + commit(确认) / rollback(回滚) + + -- 开启自动 提交(开启隐式事务) + set autocommit = 1; + set autocommit = on ; + + +#### 方法二、 + + start transaction // 开启事务 + // 执行事务操作 + commit(提交)/ rollback (回滚) + +## 保存点:关键字 savepoint + +我们可以将一大批操作分为几个部分,然后指定回滚某个部分。 + + -- 执行sql删除语句 + delete from emp where id =1 ; + -- 保存点(分段回滚点) + savepoint tb1; + -- 执行回滚到保存点 + rollback to tb1; + +## 只读事务 + +表示在事务中执行的是一些只读操作,如查询,但是不会做insert、update、delete操作,数据库内部对只读事务可能会有一些性能上的优化。 + + start transaction read only; + + +## 事务中的一些问题(重点) + +**这些问题主要是基于数据在多个事务中的可见性来说的。也是并发事务产生的问题。** + +### 1、 更新丢失 + +丢失更新就是两个不同的事务(或者Java程序线程)在某一时刻对同一数据进行读取后,先后进行修改。导致第一次操作数据丢失。 + +1、第一类丢失更新 :A,B 事务同时操作同一数据,A先对改数据进行了更改,B再次更改时失败然后回滚,把A更新的数据也回滚了。(事务撤销造成的撤销丢失) + +2、第二类丢失更新:A,B 事务同时操作同一数据,A先对改数据进行了更改,B再次更改并且提交,把A提交的数据给覆盖了。(事务提交造成的覆盖丢失) + +### 2、 脏读 + +一个事务在执行的过程中读取到了其他事务还没有提交的数据。 这个还是比较好理解的。 + +两个事务同时操作同一数据,A事务对该数据进行了修改还没提交的时候,B事务访问了该条事务,并且使用了该数据,此时A事务回滚,那么B事务读到的就是脏数据。 + +比如事务1,修改了某个数据 事务2,刚好访问了事务1修改后的数据 + +此时事务1,回滚了操作 事务2,读到还是回滚前的数据 + +### 3、 读已提交 + +从字面上我们就可以理解,即一个事务操作过程中可以读取到其他事务已经提交的数据。 + +事务中的每次读取操作,读取到的都是数据库中其他事务已提交的最新的数据(相当于当前读) + +### 4、不可重复读 + +在同一事务中,多次读取同一数据返回的结果有所不同,换句话说,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读” 在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据。 + +这种情况发生 在一个事务内多次读同一数据。A事务查询某条数据,该事务未结束时,B事务也访问同一数据并进行了修改。那么在A事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。 + +事务1,查询某个数据 事务2,修改了某个数据,提交 + +事务1,再次查询这个数据 + +这样事务1两次查询的数据不一样,称为不可重复读 + +### 5、 可重复读 + +一个事务操作中对于一个读取操作不管多少次,读取到的结果都是一样的 + +### 6、幻读 + +## 事务的隔离级别 + +事务隔离级别主要是解决了上面多个事务之间数据可见性及数据正确性的问题。(或者说为了解决并发控制可能产生的异常问题,数据库定义了四种事务的隔离级别) + +隔离级别分为4种: + +读未提交:READ-UNCOMMITTED读已提交:READ-COMMITTED可重复读:REPEATABLE-READ串行:SERIALIZABLE + +查看隔离级别: + + show variables like 'transaction_isolation'; + + +### 各种隔离级别中会出现的问题 + +| 隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | +| --- | --- | --- | --- | +| READ-UNCOMMITTED | 有 | 有 | 有 | +| READ-COMMITTED | 无 | 有 | 有 | +| REPEATABLE-READ | 无 | 无 | 有 | +| SERIALIZABLE | 无 | 无 | 无 | +```