diff --git "a/\350\202\226\351\243\236\351\271\217/20241021\345\244\215\344\271\240\346\226\207\346\241\243.md" "b/\350\202\226\351\243\236\351\271\217/20241021\345\244\215\344\271\240\346\226\207\346\241\243.md" new file mode 100644 index 0000000000000000000000000000000000000000..c8ba18279ce692929fb49860ad51c59b7263c71a --- /dev/null +++ "b/\350\202\226\351\243\236\351\271\217/20241021\345\244\215\344\271\240\346\226\207\346\241\243.md" @@ -0,0 +1,268 @@ +# 数据库高级 + +数据库设计 + +使用powerdesign软件 + +三个模型 + +CDM 概念模型 + +LDM 逻辑模型 + +PDM 物理模型 + +RBAC 基于角色的权限控制模型,将权限给角色,将角色给用户。 + +SPU 标准产品单元 + +SKU 最小库存单位 + + + +视图 + +视图是一张虚拟的表数据库中只存放了视图的定义并没有视图的数据。 + +``` sql +创建视图 +create or replace view 视图名 select 查询语句; + +修改视图 +alter view 视图名 新的 select查询语句; +create or replace view 视图名 新的 select查询语句; + +查询视图 +select 字段 from 视图名; + +删除视图 +drop table if exists 视图名; + +``` + + + +存储过程 + +存储过程是事先经过编译并存储在数据库中的一段SQL语句集合。 + +``` SQL +# 创建存储过程 +-- 修改分隔符 +delimiter \\ +create procedure 存储过程名称() +BEGIN +-- sql语句集 +select * from ....; +end \\ +-- 还原分隔符 +delimiter ; +# 调用存储过程 +call 存储过程名(); +-- 若有参数则在()中添加参数,若无参数则可省略()。 +# 删除存储过程 +drop procedure 存储过程名; +``` + + + +循环分支 + +``` sql +# if 判断 +if(A,B,C)-- 如果A成立则输出B,否则输出C + +ifnull(A,B)-- 如果A为空将A替换为B,否则不改变A +-- 单值判断 + if 变量=? then select ''; + elseif 变量=? then select ''; + else select''; +end if; +-- 区域判断 + if 条件 then 执行语句; + else if 条件 then 执行语句; +end if; +# case 判断 +-- 单值判断 + case 变量 + when 值 then 执行语句; + when 值 then 执行语句; + else 执行语句; +end case; +-- 区域判断 + case + when 变量条件 then 执行语句; + else 执行语句; +end case; +# 循环 +# while 循环 +create procedure pro1(in x int) +begin +declare 变量 -- 声明一个变量用来存储循环次数 + while 条件 do + 执行语句; + set 变量=变量+1; +end while; +end; +# repeat 循环 +create procedure pro1(in x int) +begin +declare 变量 -- 声明一个变量用来存储循环次数 +repeat + 执行语句; + set 变量=变量+1; + until 什么条件结束循环 +end repeat; +end; +# loop 循环 +create procedure pro1(in x int) +begin +declare 变量 -- 声明一个变量用来存储循环次数 + test:loop + 执行语句; + set 变量=变量+1; + if判断使用 leave test; + end if; +end loop; +end; +``` + + + +存储函数 + +自定义函数,是有返回值的存储过程 + +``` sql +-- 创建存储函数 +create function 名称(参数 参数数据类型) returns 返回值数据类型 +三个特性 DETERMINISTIC/ no sql / reads sql +begin +return 返回值; +end; +-- 调用存储函数 +select 名称; +-- 删除存储函数 +drop function 名称; +``` + + + +常用函数 + +``` sql +-- 聚合函数 +sun(),count(),avg() 等 +-- 字符函数 +1.拼接字符串 concat(str,str) 2.截取字符串 substring(str,2) +-- 数字函数 +1.向下取整 floor() 2.向上取整 ceil() 3.四舍五入 round() +4.随机生成4位数 CEILING(RAND()*9000+1000) +-- 日期函数 +1.当前时间 now() 2. 日期格式化 DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s') +3.计算日期差 timestampdiff(year/month/day,第一时间,第二时间); +``` + + + +窗口函数 + +``` sql +-- 配合普通函数 over()子句 使用 +-- 窗口函数会保留原表数据结构 与 group分组不同 +``` + + + +游标 + +``` sql +# 游标 + +-- 1.声明游标 +declare 名称 cursor for select 字段1,字段2 from 表; +-- 2.打开游标 +open 名称; +-- 3.使用游标 +fetch 名称 into 变量1,变量2; +-- 4.关闭游标 +close 名称; +-- 异常 + DECLARE CONTINUE/ exit HANDLER FOR NOT FOUND SET done=1; +``` + + + +触发器 + +``` sql +-- 创建触发器 +create trigger 触发器名称 触发器时机 (after / before) on 监控的表 for each row +begin +触发器实体 +end; +-- 修改触发器 + 只能删了新建 + +-- 查看触发器 +show triggers; +-- 删除触发器 +drop trigger 触发器名称; +# 重点 +-- 抛出异常及处理 +signal sqlstate 'TX000' SET MESSAGE_TEXT = msg; +-- 错误编码可自定(数字或大写字母) +-- msg为提示信息不可写成表达式 +``` + + + +事务 + +``` sql +事务 +-- 开启事务 + start transaction; +-- 回滚 +rollback; +-- 提交 +commit; +-- 存档点 +savepoint 名称 +-- 配合rollback使用 +rollback to 名称 +事务的特性(ACID) +1.原子性:事务的整个过程如原子操作一样,最终要么全部成功,或者全部失败,这个原子性是从最终结果来看的,从最终结果来看这个过程是不可分割的。 + +2.一致性:一个事务必须使数据库从一个一致性状态变换到另一个一致性状态。所谓一致性,即,从实际的业务逻辑上来说,最终结果是对的、是跟程序员的所期望的结果完全符合的 + +3.隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 + +​ 读未提交:read uncommitted + +​ 读已提交:read committed + +​ 可重复读:repeatable read + +​ 串行化:serializable + +4.持久性:一个事务一旦提交,他对数据库中数据的改变就应该是永久性的。当事务提交之后,数据会持久化到硬盘,修改是永久性的。 +``` + + + +索引 + +``` sql +-- mysql索引是B+tree的数据结构 +-- 关键字 +index +-- 创建索引 +create index 名称 on 表名(字段); +-- 查看索引 +show index 名称 from 表名; +-- 删除索引 +drop index 名称 on 表名; +-- 最左原则,创建联合索引时(a,b,c)查询时总要带上a字段 +``` +