diff --git "a/57 \345\210\230\346\263\260\346\261\237/20232023\345\244\215\344\271\240\357\274\210\344\270\212\357\274\211.md" "b/57 \345\210\230\346\263\260\346\261\237/20232023\345\244\215\344\271\240\357\274\210\344\270\212\357\274\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..541b36cd1847a5de9896fb83c26af77da3694fb9 --- /dev/null +++ "b/57 \345\210\230\346\263\260\346\261\237/20232023\345\244\215\344\271\240\357\274\210\344\270\212\357\274\211.md" @@ -0,0 +1,84 @@ +## 存储过程 + +```mysql +delimiter && -- 将分界符从;改为&& +create procedure one() -- 创建存储过程 +begin -- 开始语句 +select * from ljy; -- 准备执行的代码 +end && -- 结束存储过程 +delimiter; -- 将分界符从&&改为; + +call one; -- 调用过程 +``` + + + +## 数值函数 + +```mysql +-- 随机数 +select rand(); -- 返回一个0-1之间的浮点数 +select floor(rand()); -- 将返回值向下取整 +select ceil(rand()); -- 将返回值向上取整 + +-- 求余 +select mod(5,2); -- 求10/5的余数 + +-- 四舍五入 +select round(3.1415926); -- 四舍五入变整数 +select round(3.1415926,3); -- 保留3位小数(四舍五入) + +``` + + + +## 字符串函数 + +```mysql +select length('apple'); -- 返回该字符串长度 + +select concat('黎','俊','杨'); -- 拼接括号内所有字符串 + +select replace('我是你爸爸','爸爸','儿子'); -- 替代文字,将爸爸替换成儿子 + +select lower('ABC'); -- 转小写 +select upper('abc'); -- 转大写 + +select lpad('apple',63,'x'); -- 在字符串前面填充x达到63个字符 +select rpad('apple',63,'x'); -- 在字符串后面填充x达到63个字符 + +select left('apple',2); -- 提取字符串前两位字符 +select right('apple',2); -- 提取字符串后两位字符 + +select trim(' apple '); -- 去除字符串所有空格 +select ltrim(' apple ') -- 去除字符串前面的空格 +select rtrim(' apple ') -- 去除字符串后面的空格 + +select substring('apple',3,2) -- 从字符串第三位向后取值两个字符(下位从1开始) + +SELECT SUBSTRING_INDEX("www.w3schools.com", ".", 2); -- 返回第二个.之前的字符 + +``` + + + +## 日期函数 + +```mysql +select curdate(); -- 返回当前日期 +select curtime(); -- 返回当前时间 +select now(); -- 返回当前日期和时间 + +select year('2012-12-2'); -- 提取当前年份(需保证时间准确性) +select month('2012-12-2'); -- 提取当前月份(需保证时间准确性) +select day('2012-12-2'); -- 提取当前日期(需保证时间准确性) + +SELECT DATE_ADD(NOW(), interval 20 your/month/day); -- 返回当前时间经过20年/月/日的时间 + +select datediff('2022-12-2','2022-1-2'); -- 返回两个时间之间的天数 + +``` + + + + diff --git "a/57 \345\210\230\346\263\260\346\261\237/20232023\345\244\215\344\271\240\357\274\210\344\270\213\357\274\211.md" "b/57 \345\210\230\346\263\260\346\261\237/20232023\345\244\215\344\271\240\357\274\210\344\270\213\357\274\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..4e0a45832676b22c36b52c84ef980a6c4f1bd0bf --- /dev/null +++ "b/57 \345\210\230\346\263\260\346\261\237/20232023\345\244\215\344\271\240\357\274\210\344\270\213\357\274\211.md" @@ -0,0 +1,210 @@ +## 函数 + +```sql +substring_index(str,'分界字符',n) -- 返回从字符串str截取到第n个分界符的字符串,当n大于1从左到右,小于1从右到左 +curdate() -- 返回当前日期 +curtime() -- 返回当前时间 +now() -- 返回当前时间日期 +year(date) -- 获取指定date的年份 +month(date) -- 获取指定date的月份 +day(date) -- 获取指定date的日期 +``` + +## 存储过程 + +```sql +概念: +用于完成一次完整的业务处理,没有返回值,可通过传出参数给多个值 + +基本语法: +存储过程分为有参、无参存储过程 + +delimiter // -- 修改定界符为//(符号可以自定义,只要不是 \ ) +CREATE PROCEDURE 存储过程名称 ([ in/out/inout 参数名 参数数据类型 ]) +BEGIN +-- 真正要执行的sql语句集合(集合的意思是sql语句可以是N条,可以是查询、插入、修改、删除语句,基本DDL)每句sql语句都用 ; 结束 +END // +delimiter ; -- 将定界符还原为 ; +调用 +call 名称 ([ 参数 ]); -- 如果()里没有参数,可以把()省略 +查看 +SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx'; +-- 查询指定数据库的存储过程及状态信息 +SHOW CREATE PROCEDURE 存储过程名称 ; +-- 查询某个存储过程的定义 +-- 删除 + + DROP PROCEDURE [ IF EXISTS ] 存储过程名称; + -- 存储过程不支持直接修改过程的语法,需要先删除原有的过程,再重新建一个同名的,删除时不需要加() +注意: 在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的结束符。 + +(4)定义一个参数的语法包括参数模式、参数名称、参数数据类型 + +IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量) +OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量) +INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量) +存储过程可以有0个或多个参数,用于存储过程的定义。 + + +delimiter // +create procedure 存储过程名称(in myid int,out myname varchar(20)) -- 传入编号传出名称 +begin +select first_name into myname from employees where employee_id=myid; +end // +delimiter ; +call 存储过程名称 (100,@newname); +select @newname; +③ inout 入参出参 + +delimiter // +create procedure 存储过程名称(inout myname varchar(20)) -- 传入含有空格的名字传出去除空格的名字 +begin +set myname=trim(myname); +end // +delimiter ; +set @name1=' 李小龙 ' +call 存储过程名称 (@name1); +select @name1; +``` + + + +## RBAC + +```sql +基于角色的权限访问控制 + +通过将用户分配到不同的角色,从而赋予用户相应的权限。 + +RBAC模型的核心是角色,而不是用户,角色扮演者可以是用户、组织机构、应用程序等,而权限则是分配给角色,而非用户。 + +一个商品有多种规格 + +由不同属性构成了一个规格,不同的商品属性组合而成的最小单位 + +表与表之间的关系 +1.一对一的关系:将其中任一表中的主键,放到另一表当外键 +2.一对多的关系:将一所在的表的主键,放到多的表中当外键 +3.多对多的关系:必须第三张表,将前面两张表的主键放进往外键 + +数据库设计方法: +1.直观设计法 +2.规范设计法 +3.计算机辅助设计法 + +E-R图 +实体:画矩形,写里面的实体的名称 +属性:椭圆或圆形,里面写属性名称,用线条与实体相连,如果是主属性名称下加下划线 +关系:用线条将两个实体相连,中间可以用菱形表示中间的关系 + +数据库设计的三大范式: + +1、第一范式:每个属性,也就是字段要求不可分割,也就要求有原子性。 + +2、第二范式:在满足第一范式的基础上,要求非主键字段要完全依赖主键(有联合主键时,非主键要同时完全依赖这两个主键,而不能部分依赖。 + +3、第三范式:在满足第二范式的基础上,要求非主键字段要直接依赖于主键。 + + + + +``` + +## 触发器 + +```sql +创建触发器 +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子句:为分区中的某个子集定义规则,可以用来作为滑动窗口使用。 +``` + +## 索引 + +```sql +创建索引(普通索引) +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....) -- 联合唯一索引 +``` + +## 事务 + +```sql +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; 只读的事务,手动开启 +``` + +## 公共表达式 + +```sql +1.普通公用表表达式 +WITH CTE名称 +AS (子查询) +SELECT|DELETE|UPDATE 语句; + +2.递归公用表表达式 +WITH RECURSIVE +CTE名称 AS (子查询) +SELECT|DELETE|UPDATE 语句; +``` + +