From 3ff1f32711b4ba6ced529dfbc1e30e949445e569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=99=93=E7=81=BF?= <2447149492@qq.com> Date: Wed, 25 Oct 2023 15:30:41 +0000 Subject: [PATCH] =?UTF-8?q?=E9=99=88=E6=99=93=E7=81=BF=E7=9A=84=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈晓灿 <2447149492@qq.com> --- .../20231024 \345\244\215\344\271\240.md" | 335 ++++++++++++++++++ 1 file changed, 335 insertions(+) create mode 100644 "26\351\231\210\346\231\223\347\201\277/20231024 \345\244\215\344\271\240.md" diff --git "a/26\351\231\210\346\231\223\347\201\277/20231024 \345\244\215\344\271\240.md" "b/26\351\231\210\346\231\223\347\201\277/20231024 \345\244\215\344\271\240.md" new file mode 100644 index 0000000..e0124ff --- /dev/null +++ "b/26\351\231\210\346\231\223\347\201\277/20231024 \345\244\215\344\271\240.md" @@ -0,0 +1,335 @@ +# 笔记总结 + +## 1 视图 + +```mysql +视图:是一种虚拟的表,本身是不占任何内存,在此表中删除或者修改都不会影响到主表 + +视图保存着mysql中的查询语句,涉及的表被称为基表 + +针对不同的人,不同的场景可以使用视图来展示 +### 创建视图: +create view 视图名 +as +查询语句 + +### 删除视图: +drop view 视图名 + +### 修改视图: + + +alter view 视图名 +as +查询语句 + + +### 查看视图结构: +desc 视图名 + + +### 修改视图数据: +update 视图名 set 条件 + + +### 删除视图数据: +delect from 视图名 where 条件 + + +``` + +## 2 存储过程 + +```mysql +存储过程: +将mysql的语言封装与使用 +存储过程的参数: +in(输入参数)调用者向过程传入值(值可以是变量也可以是字面量) +out(输出参数)过程将数据传回调用者(值只能是变量) +inout(输入输出参数)既可以调用者向过程传入值,也可以过程将数据传回调用者(值只能是变量) +存储过程可以分为以下四种: +1 没有参数的过程 +2 只有输入参数的过程 +3 只有输出参数的过程 +4 有输入和输出参数的过程 + +创建过程: +delimiter// +create procedure 存储过程名称(类型) +begin +条件 +end// +delimiter; + +删除 +drop procedure 存储过程名称; + +调用 +call 存储过程名称() +循环 +if case + +``` + +## 3 单行函数 + +```mysql +生成随机数:select rand(); 返回0~1的随机数 + select floor( rand());向下取整 + +返回字节数:select length("a") 字母返回1 + +拼接字符串:select concat(123,456); 返回123456 + select concat_ws('-',123,456); 返回123-456 + +修改字母大小:改大写:select upper('abc'); 返回ABC + 改小写:select lower('ABC'); 返回abc + +截取:从左取:select left(123456,3); 返回123 + 从右取:select right(123456,3); 返回456 + +截取:substr() substring() mid() +select substr/substring/mid(123456781234567812,7,8); 返回781234 + + 去空格: 去两边:select trim() + 只去左边:select ltrim() + 只去右边:select rtrim() + +分割:subtring_index(原字符串,'分界字符',一个数) + +``` + +## 4 事务 + +```mysql +事务是指数据库执行一批操作,同一批事务要么全部成功,要么全部失败,不可能出现一部分成功,一部分失败的情况 +事务的四个特效(ACID) +一致性:一个事务必须使数据库从一个一致性状态换到另一个一致性状态 +原子性:整个过程就像原子一样,要么都成功,要么都失败 +隔离性:一个事务不能被其他事务干扰 +持久性:一个事务一旦提交,他对数据库的修改就是永久性 +事务又分为 +隐式事务:事务自动回滚或者提交 +显式事务:事务需要自己手动开启 提交 回滚 + +查看事务是否回滚: +show variables like 'autocommit'; +设置不自动提交事务 +set autocommit=0; +设置自动提交事务 +set autocommit =1; +执行事务操作 +commit/rollback; +只读事务 +start transaction read only; +回滚操作 +rollback +``` + +## 5 索引 + +```mysql +索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 +一种能帮助mysql提高了查询效率的数据结构:索引数据结构 +索引分为普通索引,唯一索引,主键索引,组合索引 + 普通索引: + 创建: + 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..); + 组合索引遵循最左原则:即联合索引的多个字段,在查询时,必须带上组成联合索引的左边的字段才会触发索引,且不能跳过中间的字段,否则后面的索引会失效。 + +``` + +## 6 ER图 + +```mysql +ER图分为三种关系 +一对一,任意一方的主键在对方当外键 +一对多,一的那一方的主键在多的一方当外键 +多对多,需要第三方表,双方的主键在第三方表当外键 + +三大范式:(可能会出现反范式) +1.每个字段不可分割,原子性 +2.在第一范式基础上,每个非主键字段必须完全依赖主键(若是组合主键,则要完全依赖两个主键,不可部分依赖) +2.在第二范式基础上,每个非主键字段必须直接依赖主键、 + +CDM:概念模型:ER图,以人类为角度 +LDM:逻辑模型:计算机角度 +PDM:物理模型:具体数据 +生成DDL语句 + +RBAC:一种基于角色的权限访问控制模型 +用户《————》角色《————》权限 + +SKU商品规格 +每件商品都有多种的规格,每个规格都有多种属性 +``` + +## 7 函数 + +```mysql +函数 +-- 语法: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时从右到左 +### 日期函数 +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 + +``` + +## 8 循环 + +```mysql +判断: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:跳过本轮循环进入下一轮循环,必须要有条件变化语句 + +``` + +## 9 游标 + +```mysql +游标:数据按照指定要求提取出相应的数据集,然后逐条进行数据处理 + +使用方式: +1、声明游标 +declare 游标名称 cursor for select * from 表名; +2、游标OPEN语句 +open cursor; +3、游标FETCH语句 +fetch 游标名称 in 变量,变量2..; -- 游标的值必须与变量数量一一对应 +4、游标CLOSE语句 +close 游标名称; + +``` + +## 10 触发器 + +~~~mysql +触发器:当我们对一个表进行数据操作时,需要同步对其它的表执行相应的操作,正常情况下,如果我们使用sql语句进行更新,将需要执行多条操作语句! + +触发器(TRIGGER)是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。MySQL从5.0.2版本开始支持触发 +CREATE TRIGGER 触发器名称 +{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 +FOR EACH ROW +触发器执行的语句块; +查看当前数据库的所有触发器的定义 +SHOW TRIGGERS; + +查看当前数据库中某个触发器的定义 +SHOW CREATE TRIGGER salary_check_trigger; + + +删除触发器 +DROP TRIGGER IF EXISTS after_insert_test_tri; +``` +insert 用now.xx来代指添加后的数据 +update 用now.xx来代指更新后的数据,用old.xx来代指更新之前的数据 +delete 用old.xx来代指删除之前的数据 + +公共表达式: +with +别名1 as (子查询), +别名2 as (子查询), +select * from 别名1,别名2; + +~~~ + +## 11 窗口函数 + +```mysql + 1、专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。 2、 聚合函数,如sum. avg, count, max, min等因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中 + -- 范围 + unbounded preceding -- 从头开始 + n preceding -- 从当前行往上n行 + current row -- 当前行 + n following -- 从当前行往下n行 + unbounded following -- 到最后一行 + -- 语法 + 窗口函数名(expr) over( + partition by ... + order by ... + rows between ... and ... + ) as 别名 + +``` + -- Gitee