From 85e2ab08dd355e9471ce8c8df47b8268c6a40f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=97=AD=E4=B8=9C?= <1875779940@qq.com> Date: Thu, 19 Oct 2023 22:16:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=9D=A8=E6=97=AD=E4=B8=9C=E7=9A=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20231019\350\257\273\345\217\226.md" | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 "55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" diff --git "a/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" "b/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" new file mode 100644 index 0000000..82a9457 --- /dev/null +++ "b/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" @@ -0,0 +1,165 @@ +~~~MySQL +笔记 + +```mysql +索引 +是对表的一列或者多列值进行排序的一种结构,可以大大提高MySQL的检索速度 + +但是创建索引和为维护索引需要耗费时间,这种时间回随着数据量的增加而增加,且需要额外占用物理空间 + +在对表的数据进行增删改时也要动态的维护,大大降低了整体的维护速度 + +创建的准则 +最好创建在经常搜索的列,主键列,连接列(外键),经常需要 根据范围 或者 排序 或者 where条件的列 + +不要创建在很少使用,很少数据或者数据高度重复的列,定义为text, image和bit数据类型的列,修改性能要求远远高于检索性能 + +索引类型 +主键索引(Primary Key Index):用于唯一标识表中的每一行数据。 +唯一索引(Unique Index):确保索引列中的值是唯一的。 +普通索引(Normal Index):基本的索引类型,没有唯一性约束。 +全文索引(Full-Text Index):用于全文搜索,支持对文本内容进行快速搜索。 +多列索引(Composite Index):由多个列组成的索引,用于优化多列查询的性能。 +空间索引(Spatial Index):用于支持地理位置数据的查询操作 * +创建格式 +create + +-- 单列普通索引 +create index 索引名 on 表(列名); +-- 所有类型通用索引 +create (unique)index 索引名 on 表(列名,多个用,隔开); +alter + +-- 单列普通索引 +alter table 表 add index 索引名 on 表(列名); +-- 所有类型通用索引 +alter table 表 add (unique)index 索引名 (列名,多个用,隔开); +建表时创建 + +CREATE TABLE table_name ( + a1 datatype, + a2 datatype, + ..., + (UNIQUE) INDEX 索引名 (a1, a2, ...) +) + +CREATE TABLE 表 ( + id int PRIMARY KEY, + b1 int, + b2 varchar(50), + ... + UNIQUE (b1), + +); +在这个表中因为给id添加了primary key 所以会自动添加一条id的主键约束 + +创建时若索引名省去,部分索引将会自动添加一个索引名 + +主键索引的补充 +严格来说不能算是索引,不能create,删除和添加的格式也和主键约束是一样的 + +效果就是在唯一约束的基础上加了一个非空 + +创建主键约束时默认创建一个主键索引 + +联合索引 +是由多个列组成的索引。与单列索引相比,联合索引可以在多列查询中提高查询性能。 + +创建联合索引时,需要根据实际情况选择适当的列,并考虑查询的频率和关联性。如果一个表中有多个常用的查询操作,可以创建多个不同的联合索引来满足不同的查询需求。 + +需要注意的是,创建联合索引时需要考虑列的顺序(遵循最左原则)。一般来说,应该将使用频率较高的列放在前面,这样可以减少索引的扫描次数,并提高查询效率。 + +最左原则 +创建联合索引后调用该索引时必须带上创建该索引时最左的那个字段,并且不能跳过中间的字段 + +如果select中where是 XX and YY 且 XX 和 YY 有联合索引,则只要有该索引的最左条件即可调用 + +explain +查看select的执行计划过程 + +explain select语句 +在这里插入图片描述 + +索引失效 +索引列运算 字符串不加引号 + +模糊查询没有固定界就不能调用 + +必须 like'X...' or like'...X' +or + +如果or前面字段有索引后面字段没有也不会调用索引 + +数据分布影响(如果直接跑比索引开优先直接跑) + +ues/ignore/force +ues/ignore/force index 建议/忽略/强制 使用索引 + + +``` + +```mysql +CREATE DATABASE text charset utf8; +USE text; + +CREATE TABLE worker( + id INT PRIMARY KEY auto_increment, + `name` VARCHAR(3) NOT NULL +); + + + +delimiter $$ +CREATE PROCEDURE mil_pro() +BEGIN + DECLARE `name` CHAR(3); + DECLARE i INT DEFAULT(0); + + WHILE i<100000 DO + SELECT CONCAT( + SUBSTRING('赵钱孙李周吴郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方',RAND()*32+1,1), + SUBSTRING('伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博',RAND()*70+1,1), + SUBSTRING('伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博',RAND()*70+1,1) + ) INTO `name`; + INSERT INTO worker VALUES (NULL,`name`); + SET i=i+1; +END WHILE; + +END$$ +delimiter ; + +CALL mil_pro(); + + +SELECT * FROM worker WHERE id=800; + +-- 创建索引 +create unique index ind_id on worker(id); + +-- 调用 +select * from worker; + +-- 查看select的执行计划过程 +EXPLAIN select id from worker; +create database Ok; +create database school charset utf8; +use school; +create table stu( + id int primary key auto_increment, + name varchar(12), + phone char(11) +); +delimiter // +create procedure a(in x int) +begin + declare i int default 0; + while i Date: Fri, 20 Oct 2023 10:10:41 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=9D=A8=E6=97=AD=E4=B8=9C=E7=9A=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20231019\350\257\273\345\217\226.md" | 292 ++++++++---------- 1 file changed, 130 insertions(+), 162 deletions(-) diff --git "a/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" "b/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" index 82a9457..30143c1 100644 --- "a/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" +++ "b/55 \346\235\250\346\227\255\344\270\234/20231019\350\257\273\345\217\226.md" @@ -1,165 +1,133 @@ -~~~MySQL -笔记 - -```mysql -索引 -是对表的一列或者多列值进行排序的一种结构,可以大大提高MySQL的检索速度 - -但是创建索引和为维护索引需要耗费时间,这种时间回随着数据量的增加而增加,且需要额外占用物理空间 - -在对表的数据进行增删改时也要动态的维护,大大降低了整体的维护速度 - -创建的准则 -最好创建在经常搜索的列,主键列,连接列(外键),经常需要 根据范围 或者 排序 或者 where条件的列 - -不要创建在很少使用,很少数据或者数据高度重复的列,定义为text, image和bit数据类型的列,修改性能要求远远高于检索性能 - -索引类型 -主键索引(Primary Key Index):用于唯一标识表中的每一行数据。 -唯一索引(Unique Index):确保索引列中的值是唯一的。 -普通索引(Normal Index):基本的索引类型,没有唯一性约束。 -全文索引(Full-Text Index):用于全文搜索,支持对文本内容进行快速搜索。 -多列索引(Composite Index):由多个列组成的索引,用于优化多列查询的性能。 -空间索引(Spatial Index):用于支持地理位置数据的查询操作 * -创建格式 -create - --- 单列普通索引 -create index 索引名 on 表(列名); --- 所有类型通用索引 -create (unique)index 索引名 on 表(列名,多个用,隔开); -alter - --- 单列普通索引 -alter table 表 add index 索引名 on 表(列名); --- 所有类型通用索引 -alter table 表 add (unique)index 索引名 (列名,多个用,隔开); -建表时创建 - -CREATE TABLE table_name ( - a1 datatype, - a2 datatype, - ..., - (UNIQUE) INDEX 索引名 (a1, a2, ...) -) - -CREATE TABLE 表 ( - id int PRIMARY KEY, - b1 int, - b2 varchar(50), - ... - UNIQUE (b1), - -); -在这个表中因为给id添加了primary key 所以会自动添加一条id的主键约束 - -创建时若索引名省去,部分索引将会自动添加一个索引名 - -主键索引的补充 -严格来说不能算是索引,不能create,删除和添加的格式也和主键约束是一样的 - -效果就是在唯一约束的基础上加了一个非空 - -创建主键约束时默认创建一个主键索引 - -联合索引 -是由多个列组成的索引。与单列索引相比,联合索引可以在多列查询中提高查询性能。 - -创建联合索引时,需要根据实际情况选择适当的列,并考虑查询的频率和关联性。如果一个表中有多个常用的查询操作,可以创建多个不同的联合索引来满足不同的查询需求。 - -需要注意的是,创建联合索引时需要考虑列的顺序(遵循最左原则)。一般来说,应该将使用频率较高的列放在前面,这样可以减少索引的扫描次数,并提高查询效率。 - -最左原则 -创建联合索引后调用该索引时必须带上创建该索引时最左的那个字段,并且不能跳过中间的字段 - -如果select中where是 XX and YY 且 XX 和 YY 有联合索引,则只要有该索引的最左条件即可调用 - -explain -查看select的执行计划过程 - -explain select语句 -在这里插入图片描述 - -索引失效 -索引列运算 字符串不加引号 - -模糊查询没有固定界就不能调用 - -必须 like'X...' or like'...X' -or - -如果or前面字段有索引后面字段没有也不会调用索引 - -数据分布影响(如果直接跑比索引开优先直接跑) - -ues/ignore/force -ues/ignore/force index 建议/忽略/强制 使用索引 - - +# 笔记 + +```sql +事务 概念 + +> 是指对数据库进行的一批操作 +> +> 在同一个事务中,这些操作要么同时成功,要么全部失败. + + 四个特性(ACID) + 原子性:整个过程如原子操作一样,最终要么全部失败,是一个不可分割的最小执行单位,可以由一条或者多条MySQL语句组成 + 一致性:事务完成是,必须使所有数据保持一致状态,即从实际的业务逻辑上来讲,最终结果是对的,且效果和程序员所想的完全符合 + 隔离性:一个事务的执行不能被其他的事务干扰,保证事务在不受外部并发操作的影响的独立环境下运转 + 持久性:事务一旦提交或回滚对数据库的数据改变是永久的 + + 事务操作 + + 隐性事务 +> +> MySQL默认事务是是隐性事务,执行增删改会自动提交,无法回滚 +> +> 查看是否开启自动提交 +> +> ```mysql +> show variables like 'autocommit'; +> ``` +> auto commit显示on表示为开启了自动提交 +> #### 显式提交 +> 开发者手动使用事务来开启,提交,回滚 +> 第一种 +> 设置提交方式,变成手动提交 +> +> SELECT@@autocommit; 查询当前务参数 +> SET @@autocommit=0; 修改当前事务参数,将自动提交变为手动提交 +> 然后执行增删改的操作时, +> 要加 COMMIT 才能将指令反应到数据库中,执行指令, +> 如果出现异常,也可以使用 ROLLBACK 来回滚数据防止数据库出错 +> 第二种 +> ```MySQL +> 手动开启事务 +> START TRANSACTION 或者 BEGIN 开启事务 +> 然后执行增删改的操作时, +> 要加 COMMIT 才能将指令反应到数据库中,执行指令 +> 如果出现异常,也可以使用 ROLLBACK 来回滚数据防止数据库出错 +> 第二种相比于第一种更方便 +> 只要不提交事务,不回滚事务,事务就会一直存在,数据库就不会发生真正的变化。 +> #### savepoint +> 假设在事务里面执行了一大批操作但是只想回滚部分数据,how do? +> 可以用savepoint,创建一个节点,配合rollback使用 +> ```MySQL +> savepoint 名 -- 创建节点 +> rollback to 节点名 -- 回滚至节点处,且不会确定事务 +> 效果类似于游戏存档读档 +> #### rollback +> 回滚,会直接提交事务且将数据还原到初始状态 +> #### 只读事务 +> 效果字如其名,在此事务中只能查看不能增删改 +> ```mysql +> start transaction read only;-- 创建只读事务 ``` -```mysql -CREATE DATABASE text charset utf8; -USE text; - -CREATE TABLE worker( - id INT PRIMARY KEY auto_increment, - `name` VARCHAR(3) NOT NULL +# 作业 + +```sql +create table dept( + deptno int primary key auto_increment, -- 部门编号 + dname varchar(14) , -- 部门名字 + loc varchar(13) -- 地址 +) ; +-- 员工表 +create table emp( + empno int primary key auto_increment,-- 员工编号 + ename varchar(10), -- 员工姓名 - + job varchar(9), -- 岗位 + mgr int, -- 直接领导编号 + hiredate date, -- 雇佣日期,入职日期 + sal int, -- 薪水 + comm int, -- 提成 + deptno int not null, -- 部门编号 + foreign key (deptno) references dept(deptno) ); - - - -delimiter $$ -CREATE PROCEDURE mil_pro() -BEGIN - DECLARE `name` CHAR(3); - DECLARE i INT DEFAULT(0); - - WHILE i<100000 DO - SELECT CONCAT( - SUBSTRING('赵钱孙李周吴郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方',RAND()*32+1,1), - SUBSTRING('伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博',RAND()*70+1,1), - SUBSTRING('伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博',RAND()*70+1,1) - ) INTO `name`; - INSERT INTO worker VALUES (NULL,`name`); - SET i=i+1; -END WHILE; - -END$$ -delimiter ; - -CALL mil_pro(); - - -SELECT * FROM worker WHERE id=800; - --- 创建索引 -create unique index ind_id on worker(id); - --- 调用 -select * from worker; - --- 查看select的执行计划过程 -EXPLAIN select id from worker; -create database Ok; -create database school charset utf8; -use school; -create table stu( - id int primary key auto_increment, - name varchar(12), - phone char(11) -); -delimiter // -create procedure a(in x int) -begin - declare i int default 0; - while i1500 ; +select job,max(sal) from emp group by job having max(sal)>1500; +# 2、列出在部门 "销售部" 工作的员工的姓名,假定不知道销售部的部门编号。 +select ename,deptno from emp where deptno=(select deptno from dept where dname='销售部'); +# 3、列出薪金高于公司平均薪金的所有员工。 +select ename,sal from emp where sal>2073; +select avg(sal) from emp; +SELECT ename FROM ( +SELECT ename,sal>avg(sal) over() AS high FROM emp) a WHERE high=1; +# 4、列出与"周八"从事相同工作的所有员工。 +select * from emp where job=( +select job from emp where ename='周八'); +#5、列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。 +select ename,sal from emp inner join dept d on emp.deptno = d.deptno where d.deptno=30; + +# 6、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。 +SELECT ename,sal FROM emp WHERE sal >( +SELECT max(sal) FROM emp WHERE deptno=30 GROUP BY deptno); +# 7、列出在每个部门工作的员工数量、平均工资、平均服务年限。 +select d.dname 部门,count(e.ename) 员工数量,avg(e.sal) 平均工资,avg(year(now())-year(hiredate)) 平均服务年限 from emp e RIGHT JOIN dept d ON e.deptno=d.deptno GROUP BY d.dname; +# 8、列出所有员工的姓名、部门名称和工资。 +SELECT e.ename 姓名,d.dname 部门名称,e.sal 工资 FROM emp e INNER JOIN dept d on e.deptno=d.deptno; +# 9、列出所有部门的详细信息和部门人数。 +SELECT distinct d.*,COUNT(e.deptno) over (PARTITION BY e.deptno) 员工数量 FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno; +# 10、列出各种工作的最低工资。 +select distinct job,min(sal) over (partition by job) from emp; +# 11、列出各个部门的 经理 的最低薪金。 +select distinct d.* ,min(e.sal) over (partition by sal) from emp e right join dept d on d.deptno = e.deptno where job='经理'; +# 12、列出所有员工的年工资,按年薪从低到高排序。 +SELECT ename,sal*12+IFNULL(comm,0) FROM emp ORDER BY sal*12+IFNULL(comm,0); +``` \ No newline at end of file -- Gitee