![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
mysql
文章平均质量分 78
小奶糕的笔记本
我的笔记本
展开
-
第24章:事务基础知识
在事务中某个操作失败,系统撤销当前的事务,返回事务之前的状态。事务B也过来更新,事务A覆盖了事务B更新的数据,这就是脏写。当一个事务进行多个操作,所有事务提交commit,修改永久保存下来。事务A在读取一条数据之后,事务B对该数据进行修改并提交,事务A再次读取数据,读取到的还是原来内容。事务的隔离性是指一个事务的执行不能被其他事务干扰,一个事务对数据进行操作,此时的数据对并发的其他事务是隔离的。有事务A对这行数据进行查询,此时事务B对这个数据进行了修改。如果一个事务B向数据库更新数据,事务还没提交或终止。原创 2023-07-12 21:19:11 · 540 阅读 · 1 评论 -
第23章:范式
关于数据表设计的基本原则,规则就是范式NF。原创 2023-07-10 10:38:39 · 101 阅读 · 0 评论 -
第22章:数据库的设计原则和日常SQL编写
⑾所有存储相同数据的 列名和列类型必须一致 (一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低)。④INSERT INTO…③主键的名称以 pk_ 开头,唯一键以 uni_ 或 uk_ 开头,普通索引以 idx_开头,一律使用小写格式,以字段的名称或缩写作为后缀。①表和列的名称必须控制在32个字符以内,表名只能使用英文字母、数字和下划线,建议以英文字母开头。①库的名称必须控制在32个字符以内,只能使用英文字母、数字和下划线,建议以英文字母开头。原创 2023-07-09 20:49:06 · 808 阅读 · 0 评论 -
第21章:索引优化与查询优化
①覆盖索引是一种数据查询方式,不是索引的类型。索引列+主键包括在select到from中②通过索引值可以直接找到查询字段的值,不需要回表操作就是覆盖索引如:name,age查询张三的年龄:selectname, age查询的字段name和age都在联合索引idx_name_age的索引树中,这样查询就是覆盖索引查询。原创 2023-07-07 14:46:45 · 177 阅读 · 0 评论 -
第20章:MySQL索引失效案例
当前优化器会选择跟where条件匹配最高的idx_age_classid_name索引,直接查询出对应的主键值然后回表查询,此时的效率最高。所以部分索引失效,因为使用的部分索引,会查询多个主键值还需要回表继续判断,效率低。MySQL可以为多个字段创建联合索引,where条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段无法使用。创建联合索引,把范围条件的字段放在索引的最后,idx_age_name_classId。只使用age_classId部分索引,name索引失效。原创 2023-06-25 14:38:27 · 1030 阅读 · 0 评论 -
第19章:索引的创建与设计原则
对某个字段进行去重,使用distinct,对这个字段创建索引,提升查询效率。如:学生表的学号是唯一的,为该字段创建唯一索引很快确定某个学生的信息,使用姓名查询会存在同名现象,降低查询速度。③优化器在优化查询的时候,通过索引进行评估,多个索引,增加优化器的执行计划时间,降低查询性能。表不要超过3张,对where条件创建索引,对连接字段创建索引类型要一致。数据类型越小,索引占用内存越少,一个数据页放下更多的记录,查询速度快。更新数据的时候,也要更新索引,索引提高了查询效率,但是降低了更新效率。原创 2023-06-15 11:47:30 · 1235 阅读 · 0 评论 -
第18章:逻辑架构
①MySQL是典形的C/S架构,服务器端使用mysqld②客户端进程向服务器进程发送SQL语句,服务器进程在向客户端进程发送处理结果。查询请求演示图查询请求详细图①客户端访问MySQL服务器前,第一件事是建立TCP连接。②经过三次握手建立连接成功后,MySQL服务器对TCP传输的账号和密码做认证。如果错误,客户端结束执行。如果正确,从权限表查出此账号的权限。③TCP连接收到请求会在线程池分配一个线程专门与这个客户端交互。每一个连接从线程池获取线程,省去了创建和销毁线程的开销。①SQL接口。原创 2023-06-14 14:49:44 · 1120 阅读 · 0 评论 -
第17章:存储引擎
1.InnoDB引擎:外键,事务,修改删除,高并发①MySQL版本5.5后默认InnoDB引擎②InnoDB引擎默认事务型引擎(要么全部成功,要么全部失败),可以确保事务的完整提交和回滚③优先考虑InnoDB引擎:修改,删除。因为底层是顺序的单链表④数据文件结构:表名.frm存储表结构,表名.ibd存储数据和索引⑤处理数据量大的表,有行锁适合高并发⑥索引就是数据,对内存要求高。InnoDB写的处理差一些,占用磁盘保存数据和索引2.MyISAM引擎:非事务,读写快。原创 2023-06-05 16:17:37 · 619 阅读 · 0 评论 -
第16章:InnoDB数据存储结构
页a,页b,页c这些页是双向链表连接,逻辑上是连续的。每个数据页根据页中记录按照主键值从小到大顺序组成单链表,每个数据页会为记录生成页目录,在通过主键查找记录的时候在页目录使用二分法快速定位对应的槽,然后遍历该槽对应分组的记录。原创 2023-06-05 16:11:45 · 706 阅读 · 0 评论 -
第15章:索引的数据结构
①索引是MySQL高效获取数据的数据结构②索引的本质:索引是数据结构,排好序的快速查找的数据结构③索引是在存储引擎实现的,每种存储引擎不一定支持所有的索引类型。存储引擎定义表的最大索引数和最大索引长度。原创 2023-05-30 09:15:15 · 1533 阅读 · 0 评论 -
第14章:触发器概述
1.开发场景有2个相互关联的表,商品信息和库存信息表。在添加一条新商品记录时,为了保证数据完整性,在库存表添加一条库存记录。把两个关联操作步骤写到程序里面,用事务包裹起来,确保两个操作成为一个原子操作,要么全部执行,要么全部不执行。除了事务,还可以创建一个触发器,让商品信息数据的插入操作自动触发库存数据的插入操作。2.触发器概述触发器是由事件来触发某个操作,这些事件包括insert,update,delete事件。所谓事件是用户的动作或者触发某项行为。原创 2023-05-24 09:58:01 · 677 阅读 · 0 评论 -
第13章:存储过程和存储函数
创建存储函数,名称为email_by_id(),参数传入emp_id,该函数查询emp_id的email,并返回,数据类型为字符串型。创建存储函数count_by_id(),参数传入dept_id,该函数查询dept_id部门的员工人数,并返回,数据类型为整型。创建存储函数,名称为email_by_name(),参数定义为空,该函数查询Abel的email,并返回,数据类型为字符串型。存储过程直接操作底层数据库,存储过程创建出来后,直接调用存储过程名就可以,存储过程没有返回值。MySQL默认结束是分号’;原创 2023-05-17 20:34:20 · 966 阅读 · 0 评论 -
第12章:视图
1.常见的数据库对象①表table:表是存储数据的逻辑单元,行和列形式存在。列是字段,行是记录。②数据字典:系统表,存放数据库相关信息的表。系统表的数据通常是数据库系统维护。③约束constraint:执行数据校验规则,用于保证数据完整性④视图view:一个或多个表里的数据的逻辑显示,视图不存储数据⑤索引index:用于提高查询性能,相当于书的目录。⑥存储过程procedure:完成一次完整的业务处理,没有返回值。但可以传出参数将多个值传给调用函数⑦存储函数:用于完成一次的特定计算,具有一个返回值⑧触发器:原创 2023-05-16 18:08:04 · 474 阅读 · 0 评论 -
第11章:约束
约束是表级的强制规定在创建表create table规定约束,创建表后alter table规定约束。原创 2023-05-15 20:12:57 · 454 阅读 · 0 评论 -
第10章:数据处理增删改
id int,a int,b int,插入。原创 2023-05-11 14:41:33 · 895 阅读 · 0 评论 -
第9章:创建和管理表
truncate table 比delete速度快,且使用的系统和事务日志资源少,但truncate无事务且不触发trigger,有可能造成事故。在同一个库中,表不重名。#9. 在表dept02和emp01中添加新列test_column,并检查所作的操作。# 6增加c_gender字段到c_name后面,数据类型为char(1)# 9、将表employees的名称修改为 employees_info。用字母开头,不要用数字。# 3将 c_contact 字段移动到 c_birth 字段后面。原创 2023-05-08 12:09:41 · 930 阅读 · 0 评论 -
第8章:聚合函数
count(*),count(1)直接读行数,复杂度是O(n), innodb真的要去数一遍。②如果使用的InnoDB的存储引擎,三个效率count(*) = count(1) > count(非空字段名)①如果使用的MyISAM的存储引擎,三者效率相同都是O(1) 引擎内部有一计数器在维护着行数。②count(*),count(1),count(字段名)的区别?②对于字符串来说,可以查找到首字母最大的名字,最小的名字。①查询员工表的平均工资以及员工表的总工资。①查询员工表的最高的工资和最低的工资。原创 2023-05-07 11:32:03 · 1420 阅读 · 0 评论 -
第7章:字符串函数
① 字符串从1开始后的前3个字符用***替换②字符串出现’a’用’*’代替①last_name全是大写,first_name全是小写,用’-’拼接在一起①②①trim去除的是前尾空格②去除字符串lol的开头和结尾的’l’③单独去除字符串开头的l和结尾的l①重复输出4次’hello’②返回5个空格③比较字符串的大小 1 0 -1④从hello字符串的第2个位置,取1个字符。得到e①返回’a’在last_name首次出现的位置②返回第一个字符串③返回字符串a出现的位置。原创 2023-05-05 17:59:37 · 57 阅读 · 0 评论 -
第7章:数值函数+流程控制函数
④练习:查询部门号是10,20,30的员工信息,若部门号是10,工资为1.1倍。部门号是20,工资是1.2倍。部门号是30,工资是1.3倍。1000-3000是E,3000-5000是D,5000-7000是C,7000-9000是B,大于9000是A。①在员工表中,工资大于等于6000的是高工资,低于6000的是低工资。③ 在员工表里统计出员工的工资等级。②计算员工的总工资,包括绩效。原创 2023-05-05 17:47:25 · 46 阅读 · 0 评论 -
第7章:日期和时间函数
①举例:当前日期转换为时间戳,时间戳转换为日期格式。③返回当前的月份,用月份英语返回。原创 2023-05-05 17:40:34 · 65 阅读 · 0 评论 -
第6章:多表查询
为什么出现2889条记录?每个员工和每个部分都匹配了一遍 107*27=2889缺少了多表连接的条件①两个表的连接条件②两个表的字段名相同(where 条件后面的),需要指明字段的表③sql优化:建议多表查询时,每个字段指明其所在的表④可以给表起别名,可以在select和where使用表的别名。起了别名不能使用原名。⑤n个表实现多表查询,至少n-1个连接条件。原创 2023-04-27 10:27:37 · 410 阅读 · 0 评论 -
第5章:排序与分页
①:使用order by 子句排序,order by 子句在select语句的结尾asc(ascend):升序desc(descend):降序②:按照salary从高到低的顺序显示员工信息③:查询根据年薪进行降序的结果集。可以使用列的别名,进行排序。③:查询部门号是50,60,70的员工按照工资从大到小排序④:显示员工信息,按照department_id降序排列,salary的升序排列。原创 2023-04-26 11:06:23 · 552 阅读 · 0 评论 -
第4章:运算符
②在sql中“+”没有连接作用,表示加法运算,字符串转换为数值(隐式转换)。非数值看作0处理③加法运算+NULL 结果是NULL【练习】查询员工id是偶数的员工信息。原创 2023-04-25 17:08:28 · 339 阅读 · 0 评论 -
第3章:select
【代码】第3章:select。原创 2023-04-24 10:25:22 · 892 阅读 · 0 评论