From 2dd4a81eb7967d988e7dde4114efc8cc3dcb493e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=AA=E9=94=A6=E6=B4=8B?= <19859791165> Date: Wed, 25 Oct 2023 22:59:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=8D=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Day1025 \345\244\215\344\271\240.md" | 329 ++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 "13 \346\264\252\351\224\246\346\264\213/Day1025 \345\244\215\344\271\240.md" diff --git "a/13 \346\264\252\351\224\246\346\264\213/Day1025 \345\244\215\344\271\240.md" "b/13 \346\264\252\351\224\246\346\264\213/Day1025 \345\244\215\344\271\240.md" new file mode 100644 index 0000000..30f5888 --- /dev/null +++ "b/13 \346\264\252\351\224\246\346\264\213/Day1025 \345\244\215\344\271\240.md" @@ -0,0 +1,329 @@ +# 日志 + +## 补充 + +``` +show variables -- 查看所有变量 +show variables like '...' -- 查看指定变量 +-- 只要一个操作数是null,那结果就是null +-- 当字符串参与数学运算时,若第一个字符为数字,则第一个字符参与数学运算 +concat_wa('拼接符','str','str',...) -- 会自动排除null +signal sqlstart '报错码' set '报错名' = '报错具体内容' +``` + +## 复习 + +```` +ER图 +三种情况 +1.一对一,任意一方的主键在对方当外键 +2.一对多,一的那一方的主键在多的一方当外键 +3.多对多,需要第三方表,双方的主键在第三方表当外键 + +三大范式:(可能会出现反范式) +1.每个字段不可分割,原子性 +2.在第一范式基础上,每个非主键字段必须完全依赖主键(若是组合主键,则要完全依赖两个主键,不可部分依赖) +2.在第二范式基础上,每个非主键字段必须直接依赖主键、 + +CDM:概念模型:ER图,以人类为角度 +LDM:逻辑模型:计算机角度 +PDM:物理模型:具体数据 +生成DDL语句 + +RBAC:一种基于角色的权限访问控制模型 +用户《————》角色《————》权限 + +SKU商品规格 +每件商品都有多种的规格,每个规格都有多种属性 + +视图:将查询结果封装到视图中,方便调用,格式化。视图本身是虚拟表,数据来源他的基表,对视图修改会影响基表数据,前提是基表与视图一一对应,不建议修改 +创建视图: +create view 视图名称 as select * from 表面; +修改视图:直接删除重建 +create or replace 视图名称 as select * from 表面 +删除视图: +drop view 视图名称 + +函数 +-- 语法:select 函数(参数) +### 数值函数 +rand() -- 随机0~1随机数 +floor() -- 向下取整 +ceil() -- 向上取整 +mod(x,y) -- 返回x/y的模 +round(x,y) -- 求参数x的四舍五入的值,保留y位小数 +### 字符串函数 +length() -- 返回字符串长度,注意:汉字字符串长度位3 +concat(x,y,...) -- 拼接字符串 +concat_ws('符号',x,y,...) -- 指定连接符来拼接字符串 +replace(str,x,y) -- 改字符串,将字符串str中的x改成y +-- 例: +replace('我不爱你','不爱','爱') -- 将‘我不爱你’改成‘我爱你’ +lower() -- 转小写 +upper() -- 转大写 +lpad/rpad(str,n,'pad') -- 左/右填充,用pad在字符串str左/右边填充,达到n个字符 +left/right(str,n) -- 从字符串str左/右边截取n个函数,注意:MySQL的索引并不是从0开始,而是从1开始 +trim(str) -- 去掉字符串str头尾的空格 +ltrim/rtrim(str) -- 去掉字符串str头/尾的空格,若要去除中间的空格,建议使用replace +substring(str,start,len) -- 返回字符串str从start位置起的len个长度字符串 +substring_index(str,'分界字符',len) -- 返回从字符串str截取到第len个分界符的字符串,当len大于1时从左到右,小于1时从右到左 +-- 例: +SELECT SUBSTRING_INDEX('日落飞锦秀长河','秀',1) -- 日落飞锦 +SELECT SUBSTRING_INDEX('日落飞锦秀长河','秀',-1) -- 长河 +### 日期函数 +curdate() -- 返回当前日期 +curtime() -- 返回当前时间 +now() -- 返回当前时间日期 +year(date) -- 获取指定date的年份 +month(date) -- 获取指定date的月份 +day(date) -- 获取指定date的日期 +timestampdiff(类型,date1,date2) -- 时间戳返回以xx类型,date2-date1的时间 +date_add(date,interval expr type) -- 返回一个日期/时间值加上一个时间间隔expr后的时间值 +-- 例: +SELECT DATE_ADD(NOW(), interval 20 day) -- 返回当前时间20天后的日期 +datediff(date1,date2) -- 返回起始时间date1和结束时间date2之间的天数 +### 流程函数 +if(value,t,f) -- 如果value为true,则返回t,否则返回f +ifnull(value1,value2) -- 如果value1不为空,则返回value1,否则返回value2 +case when [val1] then [res1]... else [default] end -- 如果val1为true,返回res1,否则返回default默认值 +case [expr] when [val1] then [res1] ...else [default] end -- 如果expr的值等于val1,返回res1,否则返回default默认值 +``` + +存储过程:提前存储封装的sql语句集合,方便复用 +定界符:delimiter // :由于在begin和end之间的sql语句用;结尾,为了防止提前结束报错,在存储过程开始前将定界符修改为其他符号,并且在过程结束后修改回来 +delimiter // +create procedure 过程名称(参数类型 参数名称 数据类型) +begin +sql集合 +end// +delimiter; +参数:in,out,inout 其中in用于传入数据,out用于传出数据,inout既可以传入也可以传出 +变量:分为系统变量和用户自定义变量 +系统变量:分为全局变量和会话变量。系统变量用 @@xx 表示。全局变量在重启sql服务器时会重置 +用户自定义变量:分为会话变量和局部变量。会话变量用 @xx 表示,不用声明,可赋值直接使用。局部变量只能在begin和end之间使用,语法: +declare 变量名 类型 [default ...] +declare 必须写在最前面,且定义变量上面不许有其他语句 + +判断:if case +if判断: +if 条件1 then 语句; +elseif 条件2 then 语句; +else 语句; +end if; +if判断不能在select中使用,且then后面只能接语句,结尾要加; +case判断: +case +when 条件1 then 值或语句; -- 若为值则不加分号 +when 条件2 then 值或语句; +end case; -- 若在select中,不加case; +case判断可以在select中做为字段使用 + +循环:while,repeat,loop +while循环:判断满足条件后进入循环 +while 条件 do +循环体 +条件变化语句 +end while; +repeat循环:先进入循环,满足条件后结束循环 +repeat +循环体 +条件变化语句 +until 条件 +end repeat; +loop:死循环,需要配合 leave,iterate 结束循环,在使用 leave 必须搭配标识符 +xx:loop +循环体 +end loop xx; +leave:退出,能够退出循环和退出存储过程,使用时必须搭配标识符 +iterate:跳过本轮循环进入下一轮循环,必须要有条件变化语句 + +存储函数:跟存储过程类似,多了个返回值 +delimiter // +create function 函数名(参数名称 数据类型) -- 由于存储函数参数类型固定是in,所以不写参数类型 +return 返回值类型 +deterministic no sql|contains sql -- 有无包含sql语句 +begin +sql集合 +return xx -- 必须有返回值,且必须放在最后 +end// +delimiter; + +游标:将查询的结果封装在游标,方便调用赋值等操作 +声明游标: +declare 游标名称 cursor for select * from 表名; +打开游标: +open cursor; +获取游标 +fetch 游标名称 in 变量,变量2..; -- 游标的值必须与变量数量一一对应 +关闭游标: +close 游标名称; + +程序处理语句:对报错进行处理,类似于Java的try,catch +declare 方式 handler for 错误码 解决方案 +方式: +exit 退出,continue 继续执行当前语句 + +触发器:在执行 insert|update|delete 之前或之后触发存储在begin和end之间的sql逻辑 +create trigger 触发器名称 +before|after insert|update|delete +on 表面 for each row +begin +sql逻辑 +end +insert 用now.xx来代指添加后的数据 +update 用now.xx来代指更新后的数据,用old.xx来代指更新之前的数据 +delete 用old.xx来代指删除之前的数据 + +公共表达式: +with +别名1 as (子查询), +别名2 as (子查询), +select * from 别名1,别名2; + +窗口函数: +-- 语法 +窗口函数名(expr) over(partition by 字段名 order by 字段名 窗口大小) + +-- 解析 + 其中,窗口函数名是函数的名称,expr是参数,有些函数需要加参数,而有些函数不需要加参数。 + over中的三个选项: + 分区(partition by):partition by 用来将数据分区,类似于 group by ,如果省略 partition by,那么所有数据将作为一个组来进行计算 + 排序(order by):order by 用来将数据排序,与MySQL基础查询中的 order by 用法一样; + 窗口大小:用于在当前窗口开一个限定范围的计算窗口,与当前行相关; + + + -- 范围 + unbounded preceding -- 从头开始 + n preceding -- 从当前行往上n行 + current row -- 当前行 + n following -- 从当前行往下n行 + unbounded following -- 到最后一行 + -- 语法 + 窗口函数名(expr) over( + partition by ... + order by ... + rows between ... and ... + ) as 别名 + + + -- 序号函数 + 序号函数有三个:row_number(),rank(),dense_rank(),可以用来实现分组排序,并添加序号 + row_number排名,出现并列情况分先后;rank()出现并列第x名,并跳过下一名次;dense_rank()并列第x名,不跳过下一名次 + -- 语法 + row_number()/rank()/dense_rank() over( + partition by... + order by... + ) as 别名 + + + -- 开窗聚合函数 + 在窗口中每条记录动态地应用聚合函数(sum(),avg(),max(),min()),可以动态计算在指定范围的窗口内操作各种聚合函数值 + -- 语法 + sum/avg/max/min(参数) over( + partition by... + order by... + ) as 别名 + -- 注意 + -- 如果没有order by排序语句,默认把分组内所有数据进行操作 + + +-- 分布函数 +cume_dist(),分组内小于等于当前rank值的行数/分组内总行数,可以用于查询小于等于当前薪资的比例等 +percent_rank(),每行按照公式(rank-1)/(rows-1)进行计算。其中rank为rank()函数产生的,不常用 +-- 语法 + cume_dist() over( + partition by... + order by... + ) as 别名 + + percent_rank() over( + partition by... + order by... + ) as 别名 + -- 注意 + -- 没有partition by语句,所有的数据位于一组 + + + -- 前后函数 + lag(expr,n[,def])/lead(expr,n[,def]),返回位于当前行的前/后n行的expr的值,可以设置默认值,可用于查询前n名或后n名的成绩等 + -- 语法 + lag(expr,n[,def])/lead(expr,n[,def]) over( + partition by... + order by... + ) as 别名 + + + -- 头尾函数 + first_value(expr)/last_value(expr),返回第一个或最后一个expr的值,可用于截止当前,按日期排序查询第一个或最后一个入职的工资等 + -- 语法 + first_value(expr)/last_value(expr) over( + partition by... + order by... + ) as 别名 + -- 注意 + -- 如果不指定order by,则进行排序会出现错误结果 + + + -- 其他函数 + nth_value(列名,n) -- 返回截止到当前行,该列的第n个值 + nth_value(列名,n) over( + partition by... + order by... + ) as 别名 + + ntile(n) -- 将分区中的有序数据分为n个等级,记录等级数(分组) + ntile(n) over( + partition by... + order by... + ) as 别名 + + 索引:提高查询速率,分为普通索引,唯一索引,主键索引,组合索引 + 普通索引: + 创建: + 1.建表时直接创建 index 索引名(字段名) + 2.create index 索引名 on 表名(字段); + 3.alter table 表明 add index 索引名(字段); + 删除: + 1.drop index 索引名 on 表明 + 2.alter table 表明 drop index 索引名 + 唯一索引:创建唯一约束时自带唯一索引 + 1.建表时直接创建 unique [index] 索引名(字段名) + 2.create unique index 索引名 on 表名(字段); + 3.alter table 表明 add unique index 索引名(字段); + 删除: + 1.drop index 索引名 on 表明 + 2.alter table 表明 drop index 索引名 + 主键索引:创建主键约束时自带主键索引,既是索引又是约束 + 1.建表时直接创建 primary key(字段名) + 2.alter table 表明 add primary key索引名(字段); + 删除:不用drop和create + alter table 表明 drop primary key -- 不加索引名称 + 组合索引:多个字段绑定的索引 + 建表时直接创建 index 索引名(字段1,字段2...) + create index 索引名 on 表(字段1,字段2..) + alter table 表明 add index 索引名(字段1,字段2..); + 组合索引遵循最左原则:即联合索引的多个字段,在查询时,必须带上组成联合索引的左边的字段才会触发索引,且不能跳过中间的字段,否则后面的索引会失效。 + + 事务:即;一组sql语句要么全部成功,要么全部失败,不存在部分成功或失败的情况 + 事务的四大特性: + 原子性,一致性,隔离性,持久性 + 事务的开启 +begin|start transaction; +提交事务 +commit; +回滚事务 +rollback; +事务默认是在执行 insert,update,delete自动开启和提交的(隐性) +关闭自动提交:set autocommit=off 或 set autocommit=0 (显形) +开启自动提交:set autocommit=on 或 set autocommit=1 (隐性) +事务部分回滚:将事务分为几个存档点 +savepoint 点名称; -- 设置存档点 +rollback to 点名称; -- 回滚到某个存档点 +当事务回滚到某个点时,此时事务还未结束,可继续回滚或者提交 +事务的问题:脏读,不可重复读,幻读 +脏读:读取到未提交的数据 +不可重复读:事务两次查询结果不一样 +幻读:查询不到,插入不进数据 +事务的隔离等级:读未提交,读已提交,可重复度,串行 +事务隔离等级越高效率越低 +```` \ No newline at end of file -- Gitee