From d05ab8d9c691251c727567f81989bfc03cff600d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=BA=86=E5=BC=BA?= Date: Wed, 25 Oct 2023 20:52:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=8D=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...24\346\200\273\345\244\215\344\271\240.md" | 301 ++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 "17 \350\221\243\345\272\206\345\274\272/20231024\346\200\273\345\244\215\344\271\240.md" diff --git "a/17 \350\221\243\345\272\206\345\274\272/20231024\346\200\273\345\244\215\344\271\240.md" "b/17 \350\221\243\345\272\206\345\274\272/20231024\346\200\273\345\244\215\344\271\240.md" new file mode 100644 index 0000000..403ec11 --- /dev/null +++ "b/17 \350\221\243\345\272\206\345\274\272/20231024\346\200\273\345\244\215\344\271\240.md" @@ -0,0 +1,301 @@ +```mysql +表的关系 +一对一,一对多,多对多 + +数据库设计的三大范式: + +范式一:每个属性字段要求不可分割,也就要求有原子性。 + +范式二:满足第一范式的基础上 要求非主键字段要完全依赖主键(有联合主时,非主键要同时完全依赖这两个主键),而且不能部分依赖。 + +范式三:在满足第二范式的基础上,要求非主键字段要直接依赖于主键。 +rebc是核心角色 + + +视图 +create view 视图名称 as select------ +create view 视图名称(3个字段) as select------ + +修改视图 +alter view 视图名称 as 查询语 +查询视图 +和普通一样 +删除 +drop view if EXISTS 视图名称 + + + +很多的函数 +LENGTH(?)返回?的字节,一个汉字有三个字节 +CONCAT(str1,str2,...) 连接 +CONCAT_WS(separator,str1,str2,...) 也是连接,但是每个连接都有自己弄的符号 +SELECT REPLACE("wwww","w","b") 把w该b + +UPPER(str) 变大写 +LOWER(str)变小写 + +SUBSTR(数据,第几位,取第几位) mid也可以 +TRIM() 去掉空格 +LTRIM(str)去掉左边空格 +RTRIM(str)去掉右边空格 + +DATEDIFF(expr1,expr2) 计算时间差 + +TRUNCATE(X,D) 保留几位 + +floor 向下取整 +CEIL(X)向上 + +LPAD(str,len,padstr) 补位, + + + + +存储过程 + + + +delimiter // +CREATE PROCEDURE test() +BEGIN 开始 +查询语句 +end // 结束 +delimiter; +call test; + + + +两大变量 + +会话 +delimiter // +create procedure test() +begin +declare name varchar(10); -- 创建局部变量(只能创建和生效在procedure过程里面) +set name = '张三'; -- 给局部变量赋值 +end // +delimiter; + + +delimiter // +create procedure test1(in a int) +begin +declare name int(10); -- 创建局部变量(只能创建和生效在procedure过程里面) +end // +set @a +call test1(100,@a) +delimiter; + +if 就是如果-----就 +if 条件 then 行为; +elseif 条件 then 行为; +else 行为; +end if; + +case when 条件 then 行为; +when 条件 then 行为; +else 行为; +end case; + + +循环 + +loop 是死循环,要出现终止循环条件 +drop procedure li; + +delimiter // +create procedure li(in num int) + begin + declare i int default 1; -- 创建一个名为i的变量,并赋值为1; + declare s int default 0; -- 创建一个名为s的变量,并赋值为0; + x:loop -- 开始loop循环 + if i<=num then + set s=s+i; + set i=i+1; + elseif i>num then + leave x; -- 跳出该循环 + end if; + end loop x; -- 结束循环 + select s; + end // +delimiter ; + +call li(10); + +-- 计算10以内数字之和 +drop procedure li; + +delimiter // +create procedure li(in num int) + begin + declare i int default 1; + declare s int default 0; + x:while i<=num do -- 开始while循环 + set s=s+i; + set i=i+1; + end while x; -- 结束while循环 + select s; + end // +delimiter ; + +call li(10); + + +-- 计算10以内数字之和 +drop procedure li; + +delimiter // +create procedure li(in num int) + begin + declare i int default 1; + declare s int default 0; + repeat -- 开始repeat循环 + if i<=num then + set s=s+i; + set i=i+1; + end if; + until i>num end repeat; -- 结束repeat循环 + select s; + end // +delimiter ; + +call li(10); + + + +declare ub cursor for 查询语句 -- 定义 +open ub -- 打开 +fetch ub into X -- 取值传入X,使用 +close ub -- 关闭 + +触发器 + +create trigger 名 +before / after -- 前/后 +insert / update / delete -- 监控行为 +on 受控表名 +for each row +begin +new.字段名,old.字段名 -- 获取新旧值 +end + + + + + +-- 创建触发器 +delimiter // +create trigger 触发器表 +before / after -- 前/后 +insert / update / delete -- 监控行为 +on 受控表名 +for each row +begin -- 在对表deliverylog进行新增数据前触发 +-- after 表示在对表操作之前触发 +-- before 表示在对表操作之前触发 +-- insert 表示在对表进行新增数据时,触发器进行记录 +-- update 表示在对表进行改动数据时,触发器进行记录 +-- delete 表示在对表进行删除数据时,触发器进行记录 + +end +delimiter ; + +-- 查看触发器 +show triggers; + +-- 删除触发器 +drop trigger 触发器表; + + +开窗函数 + +# 开窗范围 +# 获取各部门薪金总和(范围:初始行至当前行) +select ename,hiredate,deptno,sal, +sum(sal) over(partition by deptno rows between unbounded preceding and current row) 'sum' +from emp; + +-- rows 启用窗口大小 +-- between ... and ... 范围区间 +-- unbounded preceding 起始行 +-- current row 当前行 +1.函数 OVER([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]) +或 +2.函数 OVER 窗口名 … WINDOW 窗口名 AS ([PARTITION BY 字段名 ORDER BY 字段名 ASC|DESC]) + + + +索引 +组件自己有索引 +create index 索引名 on 表名(列名) -- 单列 +create unique index 索引名 on 表名(列名) -- 唯一 +create index 索引名 on 表名(列名1,列名2) -- 多列 +show index from 表 -- 查看该表拥有的索引 +drop index 索引名 on 表名 -- 删除索引 +explain -- 在select前,用于检查索引效果 + +添加 +alter TABLE 表名 add INDEX 索引名(列明) + +索引设计原则 :索引方便查询的,影响插入。更新,删除 + +1). 数据量较大,且查询比较频繁的表。 100w + +2). 常作为查询条件(where)、排序(order by)、分组(group by)操作的字段。 + +3). 尽量选择区分度高的列,尽量建立唯一索引,区分度越高,使用索引的效率越高。 + +4). 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。-- 分表 + +5). 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。 + +6). 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。 + +7). 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。 + + + +事务 +要嘛成功,要嘛全部失败,不会成功一部分 + +atomicity 原子性 +conistency 一致性 +isolation 隔离 +durability 持久性 +select * from employee; + +show variables like 'autocommit'; -- 查看事务状态 + +set autocommit =0; -- 事务关闭 +set autocommit =off; -- 事务关闭 + +set autocommit =1; -- 事务开启 +set autocommit =on; -- 事务开启 + +select * from employee; + +delete from employee ; + +rollback; -- 回滚 + +start transaction; -- 开始一次临时事务,将在第一次回滚的时候失效 + +delete from employee where id=1; +savepoint t_1; -- 设置一个存档点 +delete from employee where id=2; +savepoint t_2; +delete from employee where id=3; +savepoint t_3; +delete from employee where id=4; +savepoint t_4; +delete from employee where id=5; + +rollback to part1; -- 回滚到一个存档点 + +commit; -- 提交事务 + + + + + +``` -- Gitee