From c26672014681110e3fbbc247939edad41f06b371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=8C?= <280180014@qq.com> Date: Wed, 25 Oct 2023 15:18:13 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E6=96=B0=E5=BB=BA=2020231024?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "15 \345\220\264\346\226\214/20231024/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "15 \345\220\264\346\226\214/20231024/.keep" diff --git "a/15 \345\220\264\346\226\214/20231024/.keep" "b/15 \345\220\264\346\226\214/20231024/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 2c6c657f1dc2534b16fc5cb03b9d055471de000a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=96=8C?= <280180014@qq.com> Date: Wed, 25 Oct 2023 15:18:30 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=E5=90=B4=E6=96=8C=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: 吴斌 <280180014@qq.com> --- .../20231024 mysq\347\254\224\350\256\260.md" | 416 ++++++++++++++++++ 1 file changed, 416 insertions(+) create mode 100644 "15 \345\220\264\346\226\214/20231024/20231024 mysq\347\254\224\350\256\260.md" diff --git "a/15 \345\220\264\346\226\214/20231024/20231024 mysq\347\254\224\350\256\260.md" "b/15 \345\220\264\346\226\214/20231024/20231024 mysq\347\254\224\350\256\260.md" new file mode 100644 index 0000000..1b7fd68 --- /dev/null +++ "b/15 \345\220\264\346\226\214/20231024/20231024 mysq\347\254\224\350\256\260.md" @@ -0,0 +1,416 @@ +# RBAC + +RBAC(Role-Base Access Control):基于角色的访问权限管理模型 + +三大要素:用户、角色、权限 + +权限的使用情景有很多类 + +比如: + +菜单权限:不同的用户登录系统后,展示的菜单不一样 + +数据权限:不同用户查看同一个对象时,可见的数据不一样 + +操作权限:所有用户都能看到这个权限,但有点用户操作不了 + + + +# spu和sku + +SPU:是商品信息聚合的最小单位,属性值、特性相同的商品就可以称为一个SPU + +SKU:SKU是库存存贮的最小单位 + +# 视图 + + 介绍 +视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视 +图的查询中使用的表,并且是在使用视图时动态生成的。 +通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作 +就落在创建这条SQL查询语句上。 + +-- 创建视图 +create or replace view emp1 as select id,name from student where id <= 10; +-- 查询视图 +show create view emp1; +select * from emp1; +select * from emp1 where id < 3; +-- 修改视图 +create or replace view emp1 as select id,name,no from student where id <= 10; +alter view emp1 as select id,name from student where id <= 10; +-- 删除视图 +drop view if exists emp1; + + + +# 函数 + +字符串函数 +CONCAT(S1,S2,...Sn) 字符串拼接,将S1,S2,... Sn拼接成一个字符串 +LOWER(str) 将字符串str全部转为小写 +UPPER(str) 将字符串str全部转为大写 +LPAD(str,n,pad) +左填充,用字符串pad对str的左边进行填充,达到n个字符 +串长度 +RPAD(str,n,pad) +右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 +TRIM(str) 去掉字符串头部和尾部的空格 +SUBSTRING(str,start,len) 返回从字符串str从start位置起的len个长度的字符串 + + +数值函数 +CEIL(x) 向上取整 +FLOOR(x) 向下取整 +MOD(x,y) 返回x/y的模 +RAND() 返回0~1内的随机数 +ROUND(x,y) 求参数x的四舍五入的值,保留y位小数 + +日期函数 +CURDATE() 返回当前日期 +CURTIME() 返回当前时间 +NOW() 返回当前日期和时间 +YEAR(date) 获取指定date的年份 +MONTH(date) 获取指定date的月份 +DAY(date) 获取指定date的日期 +DATE_ADD(date, INTERVAL expr +type) +返回一个日期/时间值加上一个时间间隔expr后的 +时间值 +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 语句的集合,调用存储过程可以简化应用开发 +人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 +存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。 +特点: +封装,复用 -----------------------> 可以把某一业务SQL封装在存储过程中,需要用到 +的时候直接调用即可。 +可以接收参数,也可以返回数据 --------> 再存储过程中,可以传递参数,也可以接收返回 +值。 +减少网络交互,效率提升 -------------> 如果涉及到多条SQL,每执行一次都是一次网络传 +输。 而如果封装在存储过程中,我们只需要网络交互一次可能就可以了。 + +基本语法 + 创建 +CREATE PROCEDURE 存储过程名称 ([ 参数列表 ]) +BEGIN +-- SQL语句 +END ; +调用 +CALL 名称 ([ 参数 ]); + +查看 + SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx'; -- 查询指定数据库的存储过程及状态信息 +SHOW CREATE PROCEDURE 存储过程名称 ; -- 查询某个存储过程的定义 + +删除 + DROP PROCEDURE [ IF EXISTS ] 存储过程名称; + + + 注意: +在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的 +结束符。 + + -- 存储过程基本语法 +-- 创建 +create procedure p1() +begin +select count(*) from student; +end; +-- 调用 +call p1(); +-- 查看 +select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'it'; + +show create procedure p1; +-- 删除 +drop procedure if exists p1; + + + +# 变量 + +在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。 + +参数的类型,主要分为以下三种:IN、OUT、INOUT。 具体的含义如下: +IN 该类参数作为输入,也就是需要调用时传入值 默认 +OUT 该类参数作为输出,也就是该参数可以作为返回值 +INOUT 既可以作为输入参数,也可以作为输出参数 + +CREATE PROCEDURE 存储过程名称 ([ IN/OUT/INOUT 参数名 参数类型 ]) +BEGIN +-- SQL语句 +END ; + +全局变量(GLOBAL): 全局变量针对于所有的会话。 +会话变量(SESSION): 会话变量针对于单个会话,在另外一个会话窗口就不生效了。 + +局部变量 +DECLARE 变量名 变量类型 [DEFAULT ... ] ; +赋值 +SET 变量名 = 值 ; +SET 变量名 := 值 ; +SELECT 字段名 INTO 变量名 FROM 表名 ... ; + +# 流程控制 + +if +if: 用于做条件判断,具体的语法结构为: +IF 条件1 THEN +..... +ELSEIF 条件2 THEN -- 可选 +..... +ELSE -- 可选 +..... +END IF; +在if条件判断的结构中,ELSE IF 结构可以有多个,也可以没有。 ELSE结构可以有,也可以没有。 + +//CASE +case结构及作用,和我们在基础篇中所讲解的流程控制函数很类似。有两种语法格式: +语法1: +-- 含义: 当case_value的值为 when_value1时,执行statement_list1,当值为 when_value2时, +执行statement_list2, 否则就执行 statement_list +CASE case_value +WHEN when_value1 THEN statement_list1 +[ WHEN when_value2 THEN statement_list2] ... +[ ELSE statement_list ] +END CASE; + +语法2: +-- 含义: 当条件search_condition1成立时,执行statement_list1,当条件search_condition2成 +立时,执行statement_list2, 否则就执行 statement_list +CASE +WHEN search_condition1 THEN statement_list1 +[WHEN search_condition2 THEN statement_list2] ... +[ELSE statement_list] +END CASE; + +# 循环 + +while +while 循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为: +-- 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑 +WHILE 条件 DO +SQL逻辑... +END WHILE; + +repeat +repeat是有条件的循环控制语句, 当满足until声明的条件的时候,则退出循环 。具体语法为: + +-- 先执行一次逻辑,然后判定UNTIL条件是否满足,如果满足,则退出。如果不满足,则继续下一次循环 +REPEAT +SQL逻辑... +UNTIL 条件 +END REPEAT; + + +loop +LOOP 实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。 +LOOP可以配合一下两个语句使用: + +LEAVE :配合循环使用,退出循环。 +ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。 + + + +# 游标 + +游标(CURSOR)是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用游标对结果集进 +行循环的处理。游标的使用包括游标的声明、OPEN、FETCH 和 CLOSE,其语法分别如下。 +声明游标 +DECLARE 游标名称 CURSOR FOR 查询语句 ; +打开游标 +OPEN 游标名称 ; +获取游标记录 +FETCH 游标名称 INTO 变量 [, 变量 ] ; + +关闭游标 +CLOSE 游标名称 ; + +条件处理程序 +条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体 +语法为 +DECLARE handler_action HANDLER FOR condition_value [, condition_value] +... statement ; +handler_action 的取值: +CONTINUE: 继续执行当前程序 +EXIT: 终止执行当前程序 +condition_value 的取值: +SQLSTATE sqlstate_value: 状态码,如 02000 +SQLWARNING: 所有以01开头的SQLSTATE代码的简写 +NOT FOUND: 所有以02开头的SQLSTATE代码的简写 +SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND捕获的SQLSTATE代码的简写 + + + +# 存储函数 + +存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。具体语法如下: +CREATE FUNCTION 存储函数名称 ([ 参数列表 ]) +RETURNS type [characteristic ...] +BEGIN +-- SQL语句 +RETURN ...; +END ; + +characteristic说明: +DETERMINISTIC:相同的输入参数总是产生相同的结果 +DETERMINISTIC:相同的输入参数总是产生相同的结果 +READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句。 + +# 触发器 + +触发器(trigger)是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。 + +事件A 对user表新增一条数据 姓名name 年龄age 性别sex + +事件B 对userlogs记录一条user表的操作 new.name,new.age + +触发器类型 NEW和OLD +insert new代表将要新增或已新增的数据 +update old代表更新前的数据、new代表更新后的数据 +delete old代表将要删除或已删除的数据 + +创建触发器 +create trigger 触发器名称 +before/after(触发时机) insert/update/delete(触发类型) +on 表名 for each row -- 行级触发器 +begin + 触发的语句... +end; + +查看 +show triggers; + +删除 +drop trigger 触发器名称; + +​ + +# 窗口函数 + +非聚合窗口函数:是相对于聚合函数来说的,特性为非聚合。一次只处理一行数据。 + +窗口聚合函数:窗口聚合函数在单元行上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并且不会改变行数。 + +语法 +窗口函数名称(参数) over(partition by ... order by... 窗口大小) +partition by 分组,等价于group by +order by 排序 + + + 序号函数 +row_number()、rank()、dense_rank() + +开窗聚合函数 +sum()|avg()|min()|max()|count()| over (partition by ... order by...) + + + + 比例函数 返回<= 或 >= 当前行的所有数占总行数的比率 +cume_dist() over(order by 字段 desc) -- 大于 +分组函数 +ntile(组的数量) over(partition by 分组字段 order by 分组依据) + +前后函数 +lag(字段,n) over(partition by 分组字段 order by 排序字段) -- 前n行 +lead(字段,n) over(partition by 分组字段 order by 排序字段) -- 后n行 +窗口大小 +函数() over(partition by 字段 rows between 起始行 and 结束行) + -- rows 启用窗口大小 + -- between ... and ... 范围区间 + -- unbounded preceding 起始行 + -- n preceding 前n行 + -- current row 当前行 + -- n following 后n行 + -- unbounded following 最终行 + +指定差 +timestampdiff(返回日期类型,日期1,日期2); -- 后面的日期减前面的日期 + 返回日期类型:year:年,month:月,day:日 + +# 索引 + +建立索引 +create table student( +id int primary key AUTO_INCREMENT, +name varchar(10) not null, +phone char(11) not null, +index name_index(name) -- 1.可直接在建表时建立索引 +) + +create index name_index on student(name) -- 直接在已有表中创建索引 + +alter table student add index name_index(name); -- 修改表结构追加普通索引 + +查看索引 +show index from student; + +删除索引 +drop index name_index on student; + +修改表结构删除索引 +alter table student drop index name_index; + + +唯一索引 +create unique index name_index on student(name); -- 创建普通索引的基础上。多了unique关键字 + +alter table student add unique name_idnex (name); -- 在已存在的表上追加唯一索引 + +unique index name_index(name); -- 建表时可直接创建唯一索引 + +联合索引 +create index 索引名 on 表名(列名1,列名2....) -- 普通的联合索引 +create unique index 索引名 on 表名(列名1,列名2....) -- 联合唯一索引 + +# 事务 + +事务是一组操作的集合,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 + +开启事务: +START TRANSACTION 或 BEGIN TRANSACTION; + +提交事务: +COMMIT; + +回滚事务: +ROLLBACK; + +四大特性ACID + +原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败 +一致性(Consistency):事务完成时,必须使所有数据都保持一致状态 +隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行 +持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的 + +并发事务 +问题 描述 +脏读 一个事务读到另一个事务还没提交的数据 +不可重复读 一个事务先后读取同一条记录,但两次读取的数据不同 +幻读 一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在 \ No newline at end of file -- Gitee