diff --git "a/47 \345\217\262\345\255\246\346\226\260/20231024 \346\200\273\347\254\224\350\256\260.md" "b/47 \345\217\262\345\255\246\346\226\260/20231024 \346\200\273\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..521bfe9bd43e7a9c4aa052322288a4962ec54e18 --- /dev/null +++ "b/47 \345\217\262\345\255\246\346\226\260/20231024 \346\200\273\347\254\224\350\256\260.md" @@ -0,0 +1,235 @@ +```sql +mysql高级 js spring springboot redis +vip解析 盘搜搜 转换想法去解决问题 + +表与表之间的关系 +1.一对一的关系:将其中任一表中的主键,放到另一表当外键 +2.一对多的关系:将一所在的表的主键,放到多的表中当外键 +3.多对多的关系:必须第三张表,将前面两张表的主键放进往外键 + +数据库设计方法: +1.直观设计法 +2.规范设计法 +3.计算机辅助设计法 + +E-R图 +实体:画矩形,写里面的实体的名称 +属性:椭圆或圆形,里面写属性名称,用线条与实体相连,如果是主属性名称下加下划线 +关系:用线条将两个实体相连,中间可以用菱形表示中间的关系 + +数据库设计的三大范式: + +1、第一范式:每个属性,也就是字段要求不可分割,也就要求有原子性。 + +2、第二范式:在满足第一范式的基础上,要求非主键字段要完全依赖主键(有联合主键时,非主键要同时完全依赖这两个主键,而不能部分依赖。 + +3、第三范式:在满足第二范式的基础上,要求非主键字段要直接依赖于主键。 + +PowerDesigner: +制作CDM,LDM,PDM,生产DDL +CDM 概念模型( Conceptual Data Model ) +LDM 逻辑模型 ( Logic Date Model ) +PDM 物理模型 ( Physical Date Model ) + +RBAC:基于角色的访问权限管制模型(Role-Base Access Contral) +RBAC中核心是角色,RBAC就是一种基调 +insert into 表名(字段名1,字段名2) select 数据1,字段名 from 表名 + +SPU : 标准化产品单元,是一组可重复用,易检索的标准化信息的集合; +SKU : 库存量单位,表示商品的编号,是代销商品和客户内部的货号 + +检查约束:check +视图是一种虚拟表,依赖于基础表生成,是向用户提供基表的另一种表现形式 +create view 视图名称 as 查询语句; +查询视图:show create view 视图名称; +删除视图:drop view if exists 视图名称; + +储存过程:procedure +1.定义定界符:delimiter $$ 或 // (定界符的符号可以自己定) +2.创建储存过程:create procedure 储存过程名称 () +3.begin +4.end $$ 或 // (与定界符的符号一样) +5把定界符的符号由 $$ 或 // 转变成 ; +6.调用储存过程:call 储存过程名称 (); (若括号内无参数,括号可省略) + +1.CURD 指程序中的增删改查,不同语言中有不同的语法 +2.mysql默认的定界符(结束符)是 ;号,而一个存储过程中有多行sql语句,所以需要事先将结束符改为其它的自定义符号 +3.查看所有系统变量:show global variables; +select @@global basedir mysql 安装目录; +@@ 用来标记一个系统变量 +4.带参数的存储过程:(in 入参,out 出参,inout 入参出参) +delimiter // +create procedure (in 自定义参数名 int) +... +delimiter; +call 名(自定义参数名); +5.定义局部变量:先定义局部变量,后写sql语句,局部变量只能写在 begin 与 end 之间 +declare 自定义参数名 varchar(10); +赋值方法: +1.直接赋值: set 自定义参数名 =' '; select 自定义参数名; +2.将查询结果赋值给变量: +select 字段 into 自定义参数名 from 表名 where 条件; +select 自定义参数名; +会话变量不需要定义直接使用 +@会话变量 +set @a = id; + +if不能用在select查询字段的位置 + 语法 if 条件 then SQL语句; + [elseif 条件2 then 语句2;] + [else 语句;] + end if; +case有两种结构,一种类似switch 某个值,另一种是复杂的if区间 +case 分支结构,可以用在select查询字段的位置,此时不需要;号 then 后面不带语句,不用;号 + 2.2 + case + when 条件1 then 结果或语句(语句后需要加;号) + [when 条件2 then 结果或语句] + else 结果或语句(语句后需要加;号) + end/end case;(用于语句) + +while +while 循环是有条件的循环控制语句。 +[while_label:] WHILE 循环条件 DO +循环体 +END WHILE [while_label]; + +repeat +repeat是有条件的循环控制语句, 当满足 until 声明的条件的时候,则退出循环 +先执行一次逻辑,然后判定until条件是否满足,如果满足,则退出。如果不满足,则继续下一次循环 +[repeat_label:] REPEAT +循环体的语句 +UNTIL 结束循环的条件表达式 +END REPEAT [repeat_label] + +loop +LOOP 实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环 +[loop_label:] LOOP +循环执行的语句 +END LOOP [loop_label] + +LEAVE :配合循环使用,退出循环。 +ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。 + +function +语法 +create function 函数名(参数名 参数类型) 函数没有模式 +begin + 函数体,当中肯定有return语句(可以写变量,循环,判断) +end + + +游标 +定义游标 declare ub cursor for ...... +打开游标 open ub +使用游标 fetch ub into xx; +从游标里取值赋值给变量,有几个值就要有几个变量 + +触发器 +创建触发器 +create trigger 触发器名称 +before/after(触发时机) insert/update/delete(触发类型) +on 表名 for each row -- 行级触发器 +begin + 触发的语句... +end; + +查看触发器 +show triggers; +删除触发器 +drop trigger 触发器名称; + +窗口函数的语法结构是: +函数 OVER([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]) +或者是: +函数 OVER 窗口名 … WINDOW 窗口名 AS ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]) +* OVER 关键字指定函数窗口的范围。 + * 如果省略后面括号中的内容,则窗口会包含满足WHERE条件的所有记录,窗口函数会基于所有满足WHERE条件的记录进行计算。 + * 如果OVER关键字后面的括号不为空,则可以使用如下语法设置窗口。 +* PARTITION BY子句:指定窗口函数按照哪些字段进行分组。分组后,窗口函数可以在每个分组中分别执行。 +* ORDER BY子句:指定窗口函数按照哪些字段进行排序。执行排序操作使窗口函数按照排序后的数据记录的顺序进行编号。 +* FRAME子句:为分区中的某个子集定义规则,可以用来作为滑动窗口使用。 + +序号函数 +row_number()、rank()、dense_rank() + +-- rows 启用窗口大小 +-- between ... and ... 范围区间 +-- unbounded preceding 起始行 +-- current row 当前行 + +1.普通公用表表达式 +WITH CTE名称 +AS (子查询) +SELECT|DELETE|UPDATE 语句; + +2.递归公用表表达式 +WITH RECURSIVE +CTE名称 AS (子查询) +SELECT|DELETE|UPDATE 语句; + +创建索引(普通索引) +1.直接在已有表中创建索引 +create index 索引名 on 表名(列名) -- 直接删除索引 drop index 索引名 on 表名; 这种不能用来创建主键索引 +2.修改表结构追加普通索引 +alter table 表名 add index 索引名(列名); -- 修改表结构删除索引 alter table 表名 drop index 索引名; +3.创建表的时候直接指定 +create table 表名( + aaa int primary key, + bbb varchar(20), + index 索引名 (列名) -- 以这种模式定义的索引,可以不指定索引名称。 + primary key(列名) +); + +查看表的索引 +show index from 表名; +删除索引 +drop index 索引名 on 表名; +唯一索引 +create unique index 索引名 on 表名(列名); +在已存在的表上追加唯一索引 +alter table 表名 add unique 索引名 (列名) +删除主键 +alter table 表名 drop primary key; +联合索引(执行最左原则) +create index 索引名 on 表名(列名1,列名2....) -- 普通的联合索引 +create unique index 索引名 on 表名(列名1,列名2....) -- 联合唯一索引 +笔记 +ACID属性: +原子性(Automicity) +原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 +一致性(Consistency) +事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 +隔离性(Isolation) +事务的隔离性是指一个事务的执行不能被其他事务干扰,执行的各个事务之间不能互相干扰。 + 隔离级别:读未提交、读已提交、可重复读、串行化 +持久性(Durability) +持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。 + +rollback:回滚操作,回滚具有附加确认的效果,一旦回滚事务就结束了。 +查看自动提交的状态: show variables like "autocommit"; +关闭自动提交: set autocommit = off; set autocommit = 0; +打开自动提交: set autocommit = on; set autocommit = 1; +autocommit = 0 隐式事务是开启状态,也就是事务的操作由系统自动操作。 +start transaction; 不管显式,隐式,都可以临时手动开启一次事务。 +savepoint 字段名:设置一个保存点 +start transaction read only; 只读的事务,手动开启 +``` + + + +| 函数 | 用法 | +| ------------------------------------------- | ----------------------------------------------------- | +| FLOOR(s) | 返回小于s的最小整数值 | +| RAND() | 返回0-1的随机值 | +| CONCAT(S1,S2,……Sn) | 连接S1,S2......Sn为一个字符串 | +| CONCAT_WS(s,S1,S2,……Sn) | 和CONCAT(S1,S2,……Sn)函数一样,但每个字符串之间要加上s | +| LENGTH(x) | 返回字符串s的字节数,和字符集有关(中文一个字3个字节) | +| LEFT(s,n) | 返回字符串s最左边的n个字符 | +| RIGHT(s,n) | 返回字符串s最右边的n个字符 | +| LTRIM(s) | 去掉字符串s左侧的空格 | +| RTRIM(s) | 去掉字符串s右侧的空格 | +| TRIM(s) | 去掉字符串s开始与结尾的空格 | +| REPLACE(str,a,b) | 用字符串b替换字符串str中所有出现的字符串a | +| CURDATE()或CURRENT_DATE() | 返回当前系统日期 | +| DATEDIFF(date1,date2)/TIMEDIFF(time1,time2) | 返回date1-date2的日期间隔/返回time1-time2的时间间隔 | \ No newline at end of file