diff --git "a/19 \351\231\210\345\246\203/20231023 \345\244\215\344\271\240.md" "b/19 \351\231\210\345\246\203/20231023 \345\244\215\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..c85e7c8e23bbbcd02dd672632bc46c270ce8023f --- /dev/null +++ "b/19 \351\231\210\345\246\203/20231023 \345\244\215\344\271\240.md" @@ -0,0 +1,53 @@ +#### ER图: + +1.实体: + +矩形,里面写实体名称 + +2:属性: + +椭圆或圆形,里面写属性名称,永线条与实体连接,如果是主属性,名称下加下划线 + +3:关系: + +用线条将两个实体相连,中间用菱形来表示之间的联系。菱形也可以当实体来用,可以有自己的属性 + +#### CMD模型: + +一.先做需求分析 + +二. + +1. 概念模型COM,ER图。 +2. 逻辑模型LDM,计算机。 +3. 物理模型PDM,从具体数据系角度 +4. 生成DDL + +#### 数据库三大范式 + +1.第一范式:属性不可分割,即每个属性都是不可分割的原子项 + +2.第二范式:满足第一范式的基础上,要求非主键字段要完全依赖主键(有联合主键,非逐渐要完全同时依赖这2个主键,不能部份依赖) + +3.第三范式:在满足第二范式的基础上,要求非主键字段直接依赖于主键 + +#### 视图 + +视图的增删只影响本身,不影响对应基表,但对视图中的数据进行增删时,数据表中数据会相应发生变化 + +#### 函数 + +单行函数,字符串函数,日期时间函数,流程控制函数 + +#### 存储过程 + +```mysql +delimiter $$ -- 这是定义一个结束符$$ +create procedure [存储过程名称]([参数]) +begin +...... +end $$ +delimiter ; -- 重新定义结束符为 ; +-- 调用 +call 存储过程名(); +``` \ No newline at end of file diff --git "a/19 \351\231\210\345\246\203/20231024 \345\244\215\344\271\240.md" "b/19 \351\231\210\345\246\203/20231024 \345\244\215\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..3455046deff7a06fc3da1fa4c1b1354ae0138c61 --- /dev/null +++ "b/19 \351\231\210\345\246\203/20231024 \345\244\215\344\271\240.md" @@ -0,0 +1,547 @@ +### ER图 + +- 表之间关系 + + 1.一对一:一个学生(学号,编号,身份证号外键),只有一个身份证(身份证号) + + 将其中任意表中的主键,放到另一个表当外键 + + 2.一对多:一个班有N个学生 + + 将一所在的表的主键,放到多的表当外键 + + 3.多对多:一个学生可选修多门课程,一门课程可以被多个学生选修 + + 必须第三张表,把前两张表的主键当外键 + +- 要素:实体,属性,关系 + +1. 概念模型CDM,ER图。 + +2. 逻辑模型LDM,计算机。 + +3. 物理模型PDM,从具体数据系角度 + +4. 生成DDL + + +### RBAC + +基于角色的访问权限管制模型,一种数据库的设计思想。有3个基础组成部分,分别是:用户,角色,权限。 + +### spu: + +商品主图、商品标题 + +### sku + +规格(含颜色,内存等)每个sku都有自己对应的库存和价格 + +### 视图 + +可理解为存储起来的select语句。视图的增删只影响本身,不影响对应的基表。但当对视图中的数据进行增删改查时,数据表中的数据会相应发生变化。 + +1.创建视图,在create view语句中嵌入子查询 + +```mysql +create view 视图名称 as 查询语句 +``` + +2.添加别名 + +```mysql +create view 视图名称(别名) as 查询语句 -- 小括号内字段个数要与查询个数一样,不能加引号,查询语句可加可不加 +``` + +3.利用视图对数据格式化 + +```mysql +select concat(lase_name,'(',department_id,')') as 表名.... +``` + +4.修改或更新视图 + +```mysql +1.create or replace view 名 as .... +2.alter view 名... +``` + +5.在已有视图上创建第二个视图 + +```mysql +create view 名 as select * from 视图1 +``` + +6.查看视图结构 + +```mysql +desc 视图名 +``` + +7.删除视图 + +```mysql +drop view 视图1,视图2 +``` + +优点:操作简单,减少数据冗余,数据安全,适应灵活多变的需求,能分解复杂的查询逻辑 + +### 单行函数 + +#### 1.数值函数 + +基本函数 + +| 函数 | 用法 | +| ------------------- | ------------------------------------------------------------ | +| ABS(x) | 返回x的绝对值 | +| SIGN(X) | 单元格 | +| PI() | 返回圆周率的值 | +| CEIL(x),CEILING(x) | 返回大于或等于某个值的最小整数 | +| FLOOR(x) | 返回小于或等于某个值的最大整数 | +| LEAST(e1,e2,e3…) | 返回列表中的最小值 | +| GREATEST(e1,e2,e3…) | 返回列表中的最大值 | +| MOD(x,y) | 返回X除以Y后的余数 | +| RAND() | 返回0~1的随机值 | +| RAND(x) | 返回0~1的随机值,其中x的值用作种子值,相同的X值会产生相同的随机 数 | +| ROUND(x) | 返回一个对x的值进行四舍五入后,最接近于X的整数 | +| ROUND(x,y) | 返回一个对x的值进行四舍五入后最接近X的值,并保留到小数点后面Y位 | +| TRUNCATE(x,y) | 返回数字x截断为y位小数的结果 | +| SQRT(x) | 返回x的平方根。当X的值为负数时,返回NULL | + +#### 2.字符串函数 + +| 函数 | 用法 | +| --------------------------------- | ------------------------------------------------------------ | +| ASCII(S) | 返回字符串S中的第一个字符的ASCII码值 | +| CHAR_LENGTH(s) | 返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同 | +| LENGTH(s) | 返回字符串s的字节数,和字符集有关 utf8 一个汉字=3个字节 | +| CONCAT(s1,s2,......,sn) | 连接s1,s2,......,sn为一个字符串 | +| CONCAT_WS(x, s1,s2,......,sn) | 同CONCAT(s1,s2,...)函数,但是每个字符串之间要加上x | +| INSERT(str, idx, len, replacestr) | 将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestr | +| REPLACE(str, a, b) | 用字符串b替换字符串str中所有出现的字符串a | +| UPPER(s) 或 UCASE(s) | 将字符串s的所有字母转成大写字母 | +| LOWER(s) 或LCASE(s) | 将字符串s的所有字母转成小写字母 | +| LEFT(str,n) | 返回字符串str最左边的n个字符 | +| RIGHT(str,n) | 返回字符串str最右边的n个字符 | +| LPAD(str, len, pad) | 用字符串pad对str最左边进行填充,直到str的长度为len个字符 | +| RPAD(str ,len, pad) | 用字符串pad对str最右边进行填充,直到str的长度为len个字符 | +| LTRIM(s) | 去掉字符串s左侧的空格 | +| RTRIM(s) | 去掉字符串s右侧的空格 | +| TRIM(s) | 去掉字符串s开始与结尾的空格 | +| TRIM(s1 FROM s) | 去掉字符串s开始与结尾的s1 | +| TRIM(LEADING s1 FROM s) | 去掉字符串s开始处的s1 | +| TRIM(TRAILING s1 FROM s) | 去掉字符串s结尾处的s1 | +| REPEAT(str, n) | 返回str重复n次的结果 | +| SPACE(n) | 返回n个空格 | +| STRCMP(s1,s2) | 比较字符串s1,s2的ASCII码值的大小 | +| SUBSTR(s,index,len) | 返回从字符串s的index位置其len个字符,作用与SUBSTRING(s,n,len)、 MID(s,n,len)相同 | +| LOCATE(substr,str) | 返回字符串substr在字符串str中首次出现的位置,作用于POSITION(substr IN str)、INSTR(str,substr)相同。未找到,返回0 | +| ELT(m,s1,s2,…,sn) | 返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回sn | +| FIELD(s,s1,s2,…,sn) | 返回字符串s在字符串列表中第一次出现的位置 | +| FIND_IN_SET(s1,s2) | 返回字符串s1在字符串s2中出现的位置。其中,字符串s2是一个以逗号分隔的字符串 | +| REVERSE(s) | 返回s反转后的字符串 | +| NULLIF(value1,value2) | 比较两个字符串,如果value1与value2相等,则返回NULL,否则返回 value1 | +#### 3.日期和时间函数 + +##### 1).获取日期,时间 + +| 函数 | 用法 | +| ------------------------------------------------------------ | ------------------------------- | +| CURDATE() ,CURRENT_DATE() | 返回当前日期,只包含年、 月、日 | +| CURTIME() , CURRENT_TIME() | 返回当前时间,只包含时、 分、秒 | +| NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() / LOCALTIMESTAMP() | 返回当前系统日期和时间 | + +##### 2).获取月份,星期,星期数,天数等 + +| 函数 | 用法 | +| ---------------------------------------- | ------------------------------------------------ | +| YEAR(date) / MONTH(date) / DAY(date) | 返回具体的日期值 | +| HOUR(time) / MINUTE(time) / SECOND(time) | 返回具体的时间值 | +| FROM_UNIXTIME(timestamp) | 将UNIX时间戳的时间转换为普通格式的时间 | +| MONTHNAME(date) | 返回月份:January,... | +| DAYNAME(date) | 返回星期几:MONDAY,TUESDAY.....SUNDAY | +| WEEKDAY(date) | 返回周几,注意,周1是0,周2是1,。。。周日是6 | +| QUARTER(date) | 返回日期对应的季度,范围为1~4 | +| WEEK(date) , WEEKOFYEAR(date) | 返回一年中的第几周 | +| DAYOFYEAR(date) | 返回日期是一年中的第几天 | +| DAYOFMONTH(date) | 返回日期位于所在月份的第几天 | +| DAYOFWEEK(date) | 返回周几,注意:周日是1,周一是2,。。。周六是 7 | + +##### 3).日期格式化 + +| 函数 | 用法 | +| --------------------------------- | ------------------------------------------ | +| DATE_FORMAT(date,fmt) | 按照字符串fmt格式化日期date值 | +| TIME_FORMAT(time,fmt) | 按照字符串fmt格式化时间time值 | +| GET_FORMAT(date_type,format_type) | 返回日期字符串的显示格式 | +| STR_TO_DATE(str, fmt) | 按照字符串fmt对str进行解析,解析为一个日期 | + +### 存储过程 + +```mysql +-- 创建存储过程 +-- 临时将sql语句的结束标志,也就是定界符 +delimiter 自定义符号(不能是/) +-- 创建存储过程 +create procedure 存储过程名(in/out/inout 参数名 参数类型) -- 没参数也要有括号 +begin +真正执行的sql语句(可是查询,删除,插入语句,基本DDL,循环执行) +end 符号 +delimiter ; +-- 调用 +call 存储过程名()-- 若无参数,可省略括号 +``` + +### 变量 + +#### 1..系统变量 + +```mysql +-- 查看所有系统变量 +show global variables; +-- 查看指定系统变量 +select @@global.系统变量 别名; +``` + +#### 2.用户变量 + +1.会话变量(成员变量):不需定义,直接 @会话变量 赋值调用 + +2.局部变量:只能写在存储过程的begin/and之间。 + +```mysql +-- 定义一个局部变量 +begin +declare 变量名 数据类型 (default 值:设置默认值); +end +``` + +#### 3.给变量赋值(通用,会话,局部也一样) + +两种方法 + +```mysql +-- 直接赋值 +SET @变量名= 值; +-- 将查询结果赋值给变量 +select 结果 into 变量 from 表名 条件; +``` + +### 分支结构 + +存储过程中,支持if这种条件判断的分支结构,但不能用在select查询字段位置 + +#### IF + +1.if 语法: + +```mysql +IF 条件 THEN sql语句; +[ELSEIF 条件 THEN 语句2;] +…… +[ELSE 语句N;] +END IF; +``` + +#### CASE + +1.case 语法1: + +```mysql +#1:类似于switch +CASE 表达式 +WHEN 值1 THEN 结果1或语句1(如果是语句,需要加 ;) +WHEN 值2 THEN 结果2或语句2 +... +ELSE 结果n或语句n +END [case](如果是放在begin end中需要加上case,如果放在select后面不需要) +``` + +2.case 语法2: + +```mysql +#2:类似于多重if +CASE +WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加 ;) +WHEN 条件2 THEN 结果2或语句2 +... +ELSE 结果n或语句n +END [case](如果是放在begin end中需要加上case,如果放在select后面不需要) +``` + +### 循环 + +#### 1.LOOP + +不需要条件的死循环(里面要有终止循环的条件) + +语法: + +```mysql +LOOP +循环执行的语句 +END LOOP +``` + +#### 2.WHILE + +有条件的循环,必须满足条件,才会进入循环,里面要有改变条件变量的语句。WHILE在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。 + +语法: + +```mysql +WHILE 循环条件 DO +循环体 +END WHILE; +``` + +#### 3.REPEAT + +创建一个带条件判断的循环过程。与WHILE循环不同的是,REPEAT 循环首先会执行一次循环,然后在 UNTIL 中进行表达式的判断,如果满足条件就退出,即 END REPEAT;如果条件不满足,则会就继续执行循环,直到满足退出条件为止。 + +语法: + +```mysql +REPEAT +循环体的语句 +until 结束循环的条件表达式 +END REPEAT +``` + +#### 4.标识符 + +1.leave 相当于java break 中止循环,或中止存储过程执行 + +2.iterate 相当于java continue 跳出本次循环进入下一个 + +### 存储函数 + +```mysql +-- 创建存储函数 +create function 函数名(参数名 参数类型)-- 函数没有模式,默认in +returns 返回值类型 +[characteristics....] #有sql语句:ontains sql 没有sql:no sql +begin +函数体 return() -- 没有sql表达式或语句一般select 只能返回一个值,有返回值一定会申明它的数据类型 +end +-- 删除 +drop function 名; +-- 查询创建函数的语句 +show create function 名; +``` + +### 游标 + +```mysql +-- 定义变量要放在游标定义之前 +declare... +-- 定义游标 +declare 游标名 cursor for select..; +-- 打开游标 +open 游标名; +-- 使用游标,每次只取一行 +fetch 游标名 into 变量名 -- 从有游标里取值并赋值给变量,有几个值就要几个变量且数量位置类型要对得上 +-- 关闭游标 +close 游标名 +``` + +### 条件处理程序 + +条件处理程序(handler)可以来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。 + +```mysql +-- 语法 +declare 方式 handler for 错误 处理语句; + +-- 方式,分为两种 +continue 继续执行当前程序; +exit 中止程序当前执行 + +-- 错误,错误的状态码等 +直接写状态码 +sqlstate 状态码 -- 状态码,如02000 +sqlwarning -- 所有以01开头的sqlstate代码的简写 +not found -- 所有以02开头的sqlstate代码的简写 +sqlexception -- 所有没被sqlwarning或not found捕获的sqlstate代码的简写 +``` + +### 触发器 + +```mysql +-- 创建触发器 +create trigger 触发器名称 +before/after(触发时机) insert/update/delete(触发类型) +on 表名 for each row -- 行级触发器 +begin + 触发的语句... +end; +-- 查看 +drop trigger 触发器名称 +-- 普通公用表表达式 +with 表达式名称 as(子查询) +select/delete/update 语句; +``` + +### 窗口函数 + +```mysql +1.函数 OVER([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]) +或 +2.函数 OVER 窗口名 … WINDOW 窗口名 AS ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]) +``` + +#### 1.序号函数 + +```mysql +row_number() -- 123456 +rank() -- 113 +dense_rank() -- 1123456 +``` + +#### 2.开窗聚合函数 + +```sql +sum()|avg()|min()|max()|count()| over (partition by ... order by...) +``` + +#### 3.分布函数 + +```mysql +cume_dist() -- 分组内 <= 或 >= 当前值的行数占比(包含当前值本身) +``` + +#### 4.前后函数 + +```mysql +-- 返回当前行的前某一行的值,或者后某一行的值 +lag(列名,前第n行) +lead(列名,后第n行) +``` + +#### 5.头尾函数 + +```mysql +-- 返回第一个或最后一个列的值 +first_value(列名) +last_value(列名) +``` + +#### 6.其他函数 + +```mysql +nth_value(列名,n) -- 返回截止到当前行,该列的第n个值 +ntile(n) -- 将分区中的有序数据分为n个等级,记录等级数 +``` + +### 索引 + +#### 1.普通索引 + +```mysql +create index 索引名 on 表名(列名) -- 直接在已有表中创建索引 + drop index 索引名 on 表名; -- 直接删除索引, 这种不能用来创建主键索引 + alter table 表名 add index 索引名(列名); -- 修改表结构创建索引 + alter table 表名 drop index 索引名; -- 修改表删除索引create table 表名( + creat table asd( -- 创建表时直接创索引 + aaa int primary key, + bbb varchar(20), + index 索引名 (列名) -- 以这种模式定义的索引,可以不指定索引名称。 + primary key(列名) +); +``` + +#### 2.唯一索引 + +```mysql +create unique index 索引名 on 表名(列名); -- 创建普通索引的基础上。多了unique关键字 +alter table 表名 add unique 索引名 (列名) -- 在已存在的表上追加唯一索引 +create table tc_9( -- 创建表的时候直接指定 + aaa int primary key, + bbb varchar(20), + unique [INDEX] 索引名 (列名) -- 唯一索引,一定有索引名,index 可以省略 +); +``` + +#### 3.主键索引 + +一般是在建表的时候指定了主键,就会创建主键索引 + +```mysql +-- 删除主键 +alter table 表名 drop primary key; +``` + +#### 4.全文索引 + +```mysql +-- 创建表的适合添加全文索引 +create table t_article ( + id int primary key auto_increment , + title varchar(255) , + content varchar(1000) , + writing_date date -- , + -- fulltext (content) -- 创建全文检索 +); +``` + +#### 5.explain 执行计划 + +用于查看某个查询语句的执行详细情况 + +```mysql +explain select ... from ...... +``` + +### 事务 + +事务特性:原子性,一致性,隔离性(读已提交,读未提交,可重复读,串行化),持久性 + +事务操作: + +#### 1.隐式事务: + +事务自动开启、提交或回滚 + +```mysql +-- 查看变量autocommit是否开启了自动提交 +show variables like 'autocommit'; +``` + +#### 2.显式事务: + +事务需要手动开启、提交或回滚,由开发者自己控制 + +```mysql +两种方法: +1.-- 设置不自动提交事务 +set autocommit=0; set autocommit=off; +-- 执行事务操作 +commit|rollback; +-- 打开 +set autocommit=1; set autocommit=on; +2.start transaction;//开启事务 +//执行事务操作 +commit|rollback; +``` + +#### 3.savepoint + +设置一个保存点 + +```mysql +savepoint 名; +-- 回滚至保存点,因为有保存点的事务是分段执行的,所以回滚到某个保存点,事务并没有结束 +rollback to 名; +``` + +#### 4.只读事务 + +```mysql +-- 手动开始只读的事物,只能查询 +start transaction read only; +``` + +#### 5.事务中的一些问题: + +更新丢失,脏读,幻读,不可重复读 \ No newline at end of file