Mysql从0到1 —— CRUD/索引/事务

news2024/11/26 2:28:33

文章目录

  • 1 预备知识
    • 1.1 安装
    • 1.2 登录 & 退出
    • 1.3 配置文件`my.cnf`
  • 2 基础知识
    • 2.1 链接服务器
    • 2.2 什么是数据库
    • 2.3 基本使用
      • 2.3.1创建表
      • 2.3.2 插入数据
    • 2.4 服务器、数据库、表的关系
    • 2.5 SQL分类
    • 2.6 存储引擎
  • 3 Mysql数据库的操作
    • 3.1 创建和删除
    • 3.2 字符集和校验规则
    • 3.3 查看数据库
    • 3.4 修改数据库
    • 3.5 备份和恢复
    • 3.6 数据库的链接情况
  • 4 表的操作
    • 4.1 创建表
      • 4.1.1 复制表
    • 4.2 查看表
    • 4.3 修改表
      • 4.3.1重命名
      • 4.3.2 插入数据
      • 4.3.3 向表中新增一列
      • 4.3.4 修改某一列的属性
      • 4.3.5 删除某一列
    • 4.4 删除表
  • 5 数据类型
    • 5.1 数值类型
    • 5.2 bit类型
    • 5.3 浮点数类型
      • 5.3.1 `float` /`double`
      • 5.3.2 `decimal`
    • 5.4 字符类型
      • 5.4.1 `char`
      • 5.4.2 `varchar`
    • 5.5 日期类型
    • 5.6 enum 和 set 类型
      • 5.6.1 enum类型和set类型的选取 —— `find_in_set`
  • 6 表的约束
    • 6.1 空属性约束
    • 6.2 default约束
    • 6.3 comment约束
    • 6.4 zerofill
    • 6.5 主键 —— `primary key`
    • 6.6 auto_increment
    • 6.7 唯一键 —— `unique key`
      • 6.7.1 与主键的区别
    • 6.8 外键 —— `references`
  • 7 Mysql基本查询
    • 7.1 `insert` —— 增
      • 7.1.1 一次插入多行
      • 7.1.2 主键/唯一键冲突后修正
    • 7.2 `select` —— 查
      • 7.2.1基本查询
      • 7.2.2 `distinct` 查询去重
      • 7.2.3 `where`条件
      • 7.2.4 `order by`子句
      • 7.2.5 筛选分页结果 —— `limit`
    • 7.3 `update` —— 改
    • 7.4 `delete` —— 删
      • 7.4.1 截断表
    • 7.5 插入查询操作
  • 7.7 聚合函数
    • 7.8 `group by` 分组查询
      • 7.8.1 `having`
  • 8 复合查询
    • 8.1 多表查询
      • 8.1.1 合并两张表(内连接)
    • 8.2 自链接
    • 8.3 子查询
      • 8.3.1 单行子查询
      • 8.3.2 多行子查询
      • 8.3.3 多列子查询
      • 8.3.4 在`from`子句中使用子查询
    • 8.4 合并查询
  • 9 内置函数
    • 9.1 日期函数
    • 9.2 字符串函数
    • 9.3 数学函数
    • 9.4 其他函数
  • 10 表的内外链接
    • 10.1 内连接
    • 10.2 外连接
      • 10.2.1 左外连接
      • 10.2.2 右外连接
  • 11 索引
    • 11.1 存储
    • 11.2 聚簇索引和非聚簇索引
    • 11.3 索引操作
      • 11.3.1主键索引 —— primary key
      • 11.3.2 唯一索引 —— unique
      • 11.3.3 普通索引
      • 11.3.4 复合索引
      • 11.3.5 全文索引
    • 11.4 explain
  • 12 事务
    • 12.1 什么是事务?
      • 哪些存储引擎支持事务?
    • 12.2 事务的提交方式
    • 12.3 事务的基本操作
    • 12.4 事务异常
    • 12.5 事务的隔离级别
      • 12.5.1 理解 隔离性与隔离级别
      • 12.5.2 如何解决幻读问题
    • 12.6 查看与设置隔离级别
    • 12.7 理解RC与RR —— MVCC机制
      • RC与RR的本质区别
  • 13 视图
  • 14 用户管理
    • 14.1 用户操作
    • 14.2 用户权限
  • 15 C/C++引入MySQL客户端库
    • 15.1 C API

1 预备知识

1.1 安装

  • 获取yum源rz : http://repo.mysql.com/

  • 安装yum源:rpm -ivh mysql57-community-release-e17.rpm

  • 安装mysql:yum install -y mysql-community-server

    • 报错:

      image-20240111194015333

      rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

安装完后:

image-20240111194716623

  • 启动mysql: start mysqld

image-20240111195028586

  • 查服务端口号: netstat -nltp

image-20240111195239301

1.2 登录 & 退出

mysql -u root -p

quit

1.3 配置文件my.cnf

//免密码登录
--skip-grant-tables  

2 基础知识

2.1 链接服务器

mysql -h 127.0.0.1 -P 3306 -u root -p
  • -h:指明登录部署了mysql服务的主机
  • -P:指明要访问的端口号
  • -u:指明登录用户
  • -p:指明需要输入密码

2.2 什么是数据库

  • mysql 是数据库服务的客户端,mysqld是数据库服务的服务器端
  • mysql本质是基于CS模式的一种网络服务
  • 数据库一般指的是再磁盘或内存存储的特定结构的数据

2.3 基本使用

2.3.1创建表

  • 查看数据库文件:

    • cd /var/lib/mysql
      

image-20240112141923131

2.3.2 插入数据

image-20240112142444837

2.4 服务器、数据库、表的关系

image-20240112143620855

2.5 SQL分类

  • DDL(data definition language)数据定义语言,用来维护存储数据的结构
    代表指令: create, drop, alter

  • DML(data manipulation language)数据操纵语言,用来对数据进行操作
    代表指令: insert,delete,update

    • DML中又单独分了一个DQL,数据查询语言,代表指令: select
  • DCL(data control language)数据控制语言,主要负责权限管理和事务
    代表指令: grant,revoke,commit

2.6 存储引擎

  • 什么是存储引擎:数据库管理系统如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法

  • MyISAMBDBMemoryinnoDB(最常用)、 ArchiveNDB

  • show engines \G;   #查看存储引擎
    

image-20240112145711744

3 Mysql数据库的操作

3.1 创建和删除

  • 创建 —— 本质是在 /var/lib/mysql创建一个目录

    • create [if not exists] database db_name;    #[]里面的是可选项	
      
  • 删除 —— 本质是在 /var/lib/mysql删除一个目录

    • drop [if exists] database db_name;
      

3.2 字符集和校验规则

查看编码集(写):

show variables like 'character_set_database';

image-20240112152034459

查看校验集(读):

show variables like 'collation_%';

image-20240112152151872

  • 创建一个使用utf-8字符集、并带校对规则的数据库(如果没有写,默认为utf-8
create database dp_name charset=utf8 collate=utf8_general_ci;
create database dp_name character set utf8 collate utf8_general_ci;   #与  charset=utf8  一样

3.3 查看数据库

  • 查看当前在哪一个数据库中
select database();
  • 查看所有数据库
show databases;

3.4 修改数据库

alter database db_name charset=utf8   #对编码格式修改

3.5 备份和恢复

  • 备份
mysqldump -P3306 -u root -B [数据库名1] [数据库名2] > [数据库备份存储的文件路径]  
mysqldump -P3306 -u root -B [数据库名] [表名1] [表名2] > [数据库备份存储的文件路径]    #备份同一个数据库中的不同表
  • 恢复
source [数据库备份存储的文件路径]

3.6 数据库的链接情况

show processlist

4 表的操作

4.1 创建表

CREATE TABLE [if not exists] table_name (
	field1 datatype comment [文字说明],
	field2 datatype,
	field3 datatype  
)character set [字符集] collate [校验规则] engine [存储引擎];

image-20240112163627454

image-20240112164028571

4.1.1 复制表

create table [new_table] like [old_table]; 

4.2 查看表

desc [表名]
show create table [表名] \G

image-20240112164545462

4.3 修改表

image-202401121657538771

4.3.1重命名

  • 改表名
alter table [表名] rename to [新表名] ;   #或者下面一种
rename table [] to [];  
  • 改表中某一列的名字
alter table [表名] change [old_name] [new_name] [属性];

image-20240112174008991

4.3.2 插入数据

insert into user values (1, 'yy', '1234', '2003-8-26');

4.3.3 向表中新增一列

alter table [表名] add [新增列名] [列属性] comment [说明] after [列名];

image-20240112170300472

4.3.4 修改某一列的属性

alter table [表名] modify [列名] [列属性] comment [说明]; 

image-20240112172518036

4.3.5 删除某一列

alter table [表名] drop [要删除的列名];   

image-20240112172357233

4.4 删除表

drop table [表名]   

5 数据类型

5.1 数值类型

tinyint、 smallint、 mediumint、 int、 bigint 分别占1、2、3、4、8个字节, 默认为有符号整数(无符号:tinyint unsignedsmallint unsigned…)

  • 和C/C++不同的是,Mysql中,值超出某一类型的数据范围,会直接报错(mysql中,数据类型是一种约束

image-20240113115726261

5.2 bit类型

[type_name] bit(M)    # M表示位数,范围[1,64], 默认为1

5.3 浮点数类型

5.3.1 float /double

[type_name] float(m, d)   
# m表示数字总个数(与是有符号或无符号无关),d表示小数位数
# 默认有符号 (m - d 表示整数的位数)
# 

image-202401131215236592

image-202401131218240433

5.3.2 decimal

  • 基本用法与float类似,精度比float

image-20240113125439515

5.4 字符类型

5.4.1 char

type_name char(L)  
# L为字符的固定长度(一个汉字/字母视为一个字符)
# 最大长度为255

5.4.2 varchar

type_name varchar(L) 
# L表示字符长度
# 最大长度为65535字节(65535/3个字符, utf-8一个字符占3个字节)
  • varchar中用1-3个字节表示内容总长度(“用多少给多少”),所以实际用于数据存储的字节最大有65532
实际存储char(4)varchar(4)char占用字节varchar占用字节
AAA4 * 3 = 121 * 3 + 1 = 4

5.5 日期类型

image-20240113133713185

image-20240113141351919

  • 当表被更新时,timestamp自动更新成当前时间

5.6 enum 和 set 类型

  • enum: 多选一,插入时只能写枚举的常量或者下标(从1开始)
  • set : 多选多,用n个位表示是否选取,1表示选,全0表示空串

image-20240113144413136建表

3表示二进制的011,即插入basketball和football

image-20240113144500659

image-20240113144507499

5.6.1 enum类型和set类型的选取 —— find_in_set

image-20240113145429969

上述语句选取的是只包含’football‘的,而不是含有’football‘的

  • find_in_set
select find_in_set('a', 'a,b,c');    # 0为false 非0为true(下标)

image-202401131454519014

  • 若要查询包含多项,可用and链接find_in_set

6 表的约束

  • 通过约束,使插入数据库表中的数据如何符合预期

6.1 空属性约束

[type_name] [type] not null
  • null(默认)或 not null
  • 约束 not null 表示当插入数据时,该列不能为空

image-20240113172930753

image-202401131731384865

image-202401131734019656

6.2 default约束

  • 如果同时约束了 not nulldefault ,在插入数据时可以忽略该列,即填入默认值
  • 没有写默认值,那么默认值默认为NULL(没有not null 约束时)
[type_name] [type] default [defualt_value]   # 设置默认值

image-20240113174236444

6.3 comment约束

  • comment没有实际含义,用来描述字段,类似于注释
[type_name] [type] comment [描述]

6.4 zerofill

  • 将数字剩余的宽度填充0

image-202401131815429277

6.5 主键 —— primary key

  • primary key 用来约束该字段里面的数据不能重复不能为空, 一张表中最多只能有一个主键(不代表只能有一列为主键),主键所在的列通常是整数类型

image-20240113225918430image-20240113230255081

  • 去除主键
alter table [table_name] drop primary key; 
  • 添加主键
alter table [table_name] add primary key([某一字段名])
  • 复合主键(当多个字段值均相同时才报错)

image-20240113232251799

6.6 auto_increment

  • 自增长,每次插入后加一
  • 一张表最多只能有一个自增长,必须配合主键使用
create table [table_name] (
	  id int primary key auto_increment,
    #...
) AUTO_INCREMENT=1000;  #默认为1
  • 获取上一次auto_increment的值
select last_insert_id();

6.7 唯一键 —— unique key

create table [table_name] (
    id int unique key,
    #...
);

6.7.1 与主键的区别

  • 唯一键可以为NULL,且可以多个为空
  • 主键更多是标识唯一性;唯一键更多是保证不重复(配合primary key使用,保证主键之外的唯一性)

6.8 外键 —— references

  • 外键约束主要定义在从表上,主表必须有主键或唯一键约束,定义外键后,要求外键列数据必须在主表的主键列存在或者为NULL

  • 约束主表(master_table)与从表(slave_table)的关系

    • 例如主表为班级,从表为学生,通过外键将从表的某一列与主表建立联系
 foreign key([从表的某一列]) references [主表名]([主表某一列])

image-20240116173610607

7 Mysql基本查询

7.1 insert —— 增

7.1.1 一次插入多行

insert into [table_name] values(/*...*/), (/*...*/), (/*...*/);

7.1.2 主键/唯一键冲突后修正

#若存在冲突,则更新
#若没有冲突,则插入values括号内的值
insert into [table_name] values() on duplicate key update []=[], []=[];

  1. replace
#如果有冲突,删除之前的,新增一条
replace into [table_name] () values ();

7.2 select —— 查

7.2.1基本查询

#全列查询
select * from [table_name];
#选列查询
select [/*可以写表达式, 通过as重命名列*/] from [table_name];   

image-20240116201554077image-20240116201642756

7.2.2 distinct 查询去重

select distinct [列名] from [table_name]

7.2.3 where条件

  • 比较运算符
运算符说明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL
<=>等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1)
!=, <>不等于
BETWEEN a0 AND a1范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1)
IN (option, …)如果是 option 中的任意一个,返回 TRUE(1)
IS NULL是 NULL
IS NOT NULL不是 NULL
LIKE / not like模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符

image-20240116222650952

  • 逻辑运算符
    • 可以用括号将多个逻辑条件分组
运算符说明
AND多个条件必须都为 TRUE(1),结果才是 TRUE(1)
OR任意一个条件为 TRUE(1), 结果为 TRUE(1)
NOT条件为 TRUE(1),结果为 FALSE(0)

7.2.4 order by子句

  • NULL表示最小值
  • 默认升序
  • 执行顺序是先筛选数据,最后排序
select [] from [table_name] order by [column_name1] [asc/desc], [column_name2] [asc/desc], ...
#多个排序,当第一个相同时,再通过第二个排...

7.2.5 筛选分页结果 —— limit

#筛选前n条
select [] from [table_name] where ... limit n;   #[0,n)  ,表的每一行数据下标从0开始
#筛选第s到n条
select [] from [table_name] where ... limit s, n;     	  #[s, n)
select [] from [table_name] where ... limit n offset s;   #[s, n)

image-20240117133040344

7.3 update —— 改

  • 对查询到的结果进行列值更新
update [table_name] set [column_name]=[expr] [where ...] ...;

image-20240117132721923

7.4 delete —— 删

delete from [table_name];  #删除表内所有数据
delete from [table_name] where [column_name]=[expr]...;   #删除指定数据

delete from [table_name] order by [column] asc limit n;   #删除表内排序后的前n行数据

7.4.1 截断表

  • 清空后会重置auto_increment
  • 速度比delete快,因为它不走事务,不记录日志
truncate table_name;     #与delete from [table_name]类似,都是清空表的数据

7.5 插入查询操作

insert into [table_name] select [column] from [table_name] ...;

7.7 聚合函数

  • count
  • sum
  • avg
  • max / min

7.8 group by 分组查询

  • 分组之后便于聚合统计
  • group by 按照后一列的值进行分组,分成不同行
image-20240117175209396

7.8.1 having

  • 对分组聚合统计之后的数据进行筛选(类似于where
#显示平均工资低于2000的部门及它的平均工资 
select department_no, avg(salary) department_avg_salary from employee group by department_no having department_avg_salary<2000; 
  • having于where的区别?执行顺序?
    • where对任意列进行筛选,having对聚合之后的结果进行筛选
    • where先,having在group by之后

8 复合查询

8.1 多表查询

以下两张表为例

image-20240119165147722

8.1.1 合并两张表(内连接)

#通过deptno相同合并两张表
select * from emp, dept where emp.deptno=dept.deptno;

8.2 自链接

#默认自链接方式
select * from emp as t1, emp as t1;
# 查找员工FORM的领导的名字和编号
# 1. 通过子查询
select ename, empno from emp where empno=(select mgr from emp where enmae='FORM');

# 2. 通过自链接表
select e2.ename, e2.empno from emp e1, emp e2 where e1.ename='FORM' and e1.mgr=e2.empno;

8.3 子查询

select [] from [] where ()(select [] from [] where ...);

8.3.1 单行子查询

# 显示SMITH同一部门的员工
select * from emp where deptno=(select deptno from emp where ename='SMITH');

8.3.2 多行子查询

三个关键字:

  1. in:筛选在一个集合中的列
# 查询与10号部门的工作岗位相同的员工的名字、岗位、工资、部门号,但是不包含10好部门自己的
select enmae, job, sal, deptno from emp where job in (select distinct job from emp where deptno=10) and deptno<>10;
  1. all:所有
# 显示工资比30号部门的所有员工的工资高的员工的名字、工资、部门号
select ename, sal, deptno from emp where sal > all (select distinct sal from emp where deptno=30);
  1. any:任意
# 显示工资比30号部门的任意一个员工的工资高的员工的名字、工资、部门号
select ename, sal, deptno from emp where sal > any (select distinct sal from emp where deptno=30);

8.3.3 多列子查询

# 与员工SMITH的部门和工作相同的其他员工的数据
select * from emp where (deptno, job)=(select deptno, job from emp where enmae='SMITH');

8.3.4 在from子句中使用子查询

上述子查询在where语句之后,充当判断条件;以下子查询出现在from子句中,将查询结果作为一张新的表

# 显示每个高于自己部门平均工资的员工的信息
select * from emp, (select deptno, avg(sal) avg_sal  from emp group by deptno) as tmp where emp.deptno=tmp.deptno and emp.sal>tmp.avg_sal;
 显示每个部门的信息和人员数量
select * from dept t1, (select deptno, count(*) dept_num from emp group by deptno) t2 where t1.deptno=t2.deptno;

8.4 合并查询

  • union:求两个表的并集
  • union all:直接拼接两个表

9 内置函数

9.1 日期函数

image-20240119150423284

 #查看当前时间
select current_time();   

#想表中插入时间数据 (birthday 类型为date)
insert into [] (birthday) value (date(current_date()));   

#统计两分钟以内插入的数据
select content msg_time from [] where msg_time > date_sub(now(), interval 2 minute);

9.2 字符串函数

charset(str)查看字符串字符集
concat(str, [])链接
instr(str, substr)查找返回下标,没有则返回0
ucase() , lcase转大写,转小写
left(str, length)str左边起长度为length的子串
length(str)str的长度, 字节长度, 一个汉字utf-8占三个字节
replace(str, search_str, replace_str)str中的search_str替换成repalce_str
strcmp(str1, str2)比较两字符串
substring(str, position, length)str[positon, posiron + length]
ltrim(str), rtrim(str)trim(str)去除字符串左侧/右侧/两侧空格
#用concat链接多列信息
select concat('姓名: ', name, '总分:', chinese + english, '语文成绩: ', chinese, '英语成绩', english) msg from exam_score;

9.3 数学函数

abs()
bin(), hex()十进制转二进制/十六进制
conv(number, from_base, to_base)将任意数进行进制转换
ceiling(), floor()上取整/下取整
rand()返回随机浮点数[0.0, 1.0]
mod(number, denominator)取模求余
format(number, n)对浮点数保留n位小数

9.4 其他函数

user()查询当前用户
md5()将一个字符串进行MD5摘要,得到一个32位字符串
database()查询当前使用的数据库
password()mysql内置的加密函数
ifnull(x, y)if x ? x : y

10 表的内外链接

10.1 内连接

select 字段 from table1 inner join table2 on 连接条件 and 其他条件;
# 显示SMITH的名字和部门名称
# 之前合并表的写法
select ename, dname from emp, dept where emp.deptno=dept.deptno and ename='SMITH';

#标准的内连接写法
select ename, dname from emp inner join dept on emp.deptno=dept.deptno and ename='SIMTH';

10.2 外连接

10.2.1 左外连接

  • 链接两张表,左侧表完全显示称为左外连接
select 字段 from table1 left join table2 on 链接条件; 

image-20240121172034992

10.2.2 右外连接

select 字段 from table1 right join table2 on 连接条件;

11 索引

11.1 存储

  • 在linux中,表结构在磁盘中就是文件 ,找到文件就是定位到对应的扇区(磁头->柱面->扇区)
  • Mysql进行IO的基本单位为16KB(page)
  • 页目录
  • B+树:叶子节点保留数据,非叶子节点不要数 据,只保存目录项,叶子节点全部用双向链表连起来

11.2 聚簇索引和非聚簇索引

  • innoDBMyISAM都采用B+树

  • MyISAM最大的特点是将索引page和数据page分离,也就是叶子节点没有数据,而存储数据地址 ,称为非聚簇索引

  • innoDB叶子节点存放数据,称为聚簇索引

  • 一张表可能对应多个B+树

11.3 索引操作

  • 查看索引结构
show index from [tablename]\G

11.3.1主键索引 —— primary key

  1. 创建主键索引
#其他创建主键索引的方法写在表的约束中
alter table [] add primary key([]);
  1. 删除主键索引
slter table [] drop paimary key;

11.3.2 唯一索引 —— unique

  1. 其他索引的删除
alter table [] drop index []
drop index [索引名] on [表名]
  1. 其他操作在表的约束中

11.3.3 普通索引

  1. 创建
#1.在创建表时添加
#2.alter,以某一列为普通索引
alter table [] add index([]);
#3.创建索引并给索引起名
create index [index _name] on [表名](列名);
  1. 删除与唯一键索引相同

11.3.4 复合索引

image-20240203002842879

image-20240203002915143

11.3.5 全文索引

  • 当文章字段或有大量文字的字段进行检索时,使用全文索引
create table articles (
	id int unsigned auto_increment not null primary key,
    title varchar(200),
    body text,
    fulltext(title, body)
)engine=MyISAM;


11.4 explain

  • 一条查询语句所用的索引
expliain select * from ...;

12 事务

12.1 什么是事务?

  • mysql是网络服务,多个客户端请求访问数据,mysql内部采用多线程 -> 事务锁?
  • 事务是一组DML语句,这些语句在逻辑上具有相关性,要么全部成功,要么全部失败
  • 一个完整的事务满足以下四个属性
    • 原子性(Atomicity):对于所有操作保证原子性,一次性全部完成
    • 一致性(Consistency):写入数据必须完全符合所有的预设规则,保证数据的精确度,可预期
    • 隔离性(Isolation):未提交、读提交、可重复读、串行化?
    • 持久性(Durability):保证数据的修改是永久的

哪些存储引擎支持事务?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 设置隔离级别为:读未提交
set global transaction isolation level READ UNCOMMITTED;
  • 查看链接mysql服务的用户
show processlist;

12.2 事务的提交方式

事 物的提交方式有两种:自动提交、手动提交

#查看提交方式
show variables like 'autocommit';
#修改提交方式
set autocommit=0;

12.3 事务的基本操作

create table if not exists account (
	id int primary key,
    name varchar(20) not null default'',
    balance decimal(10,2) not null default 0.0
)engine=InnoDB default charset=utf8;

#1. 启动事务
start transaction;  
#或
begin;

#2. 设置保存点s1
savepoint s1;

#3. 插入
insert into account values(1, 'xx', 1234);

#4. 回滚,事务提交之后无法回滚
rollback to s1;

#5. 结束
commit;

12.4 事务异常

  • 只要输入begin或者start transaction,事务便需要通过commit提交之后才会持久化,与是否开启自动提交无关
  • 当操作异常时,mysql会自动回滚
  • 单独一句sql会被打包成事务,当自动提交打开时,mysql异常退出后,该sql语句会自动提交,关掉之后,需要手动commit

12.5 事务的隔离级别

12.5.1 理解 隔离性与隔离级别

  • 隔离性:数据库中,为了保证事务执行过程中尽量不受干扰,区分事务谁先执行,谁在执行,一个执行的事务时原子的,相互隔离

  • 隔离级别:数据库中,允许事务受不同程度的干扰

    • 读未提交(read uncommitted):两个事务,当一个事务对数据进行修改但未提交,第二个事务立马能看见修改(隔离级别最低)

      • dirty read:一个事务在执行中读到另一个执行中事务的更新(或其他操作)但是未commit的数据的现象

      图片

    • 读提交(read committed ):一端提交之后,另一端才能看见修改

      • 不可重复读(non repeatable read):用一个事务内,在不同时间段独到的数据不同

      图片

      • 幻读:当同一个查询在不同的时间产生不同的结果集时,事务中就会出现所谓的幻象问题。例如,如果 SELECT 执行了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。

        图片

    • 可重复读(repeatable read):一端提交之后,另一端需要也提交或者结束才能看见修改(默认隔离级别)

    • 串行化(serializable):在每个读的数据行上加上共享锁,强制事务排序,使之不可能互相冲突(隔离级别最高)

12.5.2 如何解决幻读问题

12.6 查看与设置隔离级别

  1. 查看隔离级别
select @@global.tx_isolation;  #全局

select @@session.tx_isolation;  #仅该会话(局部)

  1. 设置
#[]内可不写, {}内四选一
set [session|global] transaction isolation level {read uncommitted | read committed | repeatable read | serializable};

#设置完全局之后,重新登录之后,局部和默认的隔离级别通过全局初始化

12.7 理解RC与RR —— MVCC机制

多版本并发控制(MVCC)是一种用来解决读写冲突的无锁并发控制

  • 每个事务都有一个事务ID,根据事务ID决定事务的先后顺序

  • 隐藏字段

    image-20240206001645601

  • undo log

MySQL以服务进程的方式在内存中运行,一些机制例如:索引、事务、隔离性、日志等都是在内存中完成的,即在MySQL内部的相关缓冲区中,保存相关数据据,在合适时间写入磁盘中

先简单理解成一个内存缓冲区,用来保存日志数据

  • Read View

Read View本质是用来进行可见性判断的,当某个事务执行快照读时,会对该记录创建一个Read View读视图

  • 事务中快照读的结果非常依赖该事务首次出现快照读的地方,决定了该事务后续快照读结果的能力

RC与RR的本质区别

  • RC级别下,事务中每次快照读都会新生成一个Read View
  • RR级别下,同一个事务下的第一次快照才会创建Read View

13 视图

视图是一个虚拟表,其内容由表查询定义。

#语法
create view [view_name] as [基表];


#E.G.
create view ename_dname as select ename, dname from emp inner join dept on emp.deptno=dept.deptno;
  • 修改基表,同样也会影响视图的数据

14 用户管理

  • root初始化密码

image-20240211222326692

root:Youyang@826826

Dusong:Dusong@041008

14.1 用户操作

use musql;
#查看主机、用户、密码
select host, user, authentication_string from user;

#创建一个在本地登录的用户,不能远程登陆,Dusong 密码:123456
create user 'Dusong'@'localhost' identified by '123456';   

#刷新
flush privileges;

#删除用户
drop user '用户名'@'主机名';

#创建可以远端登录的用户
create user 'Dusong'@'%' identified by '123456';

#自己该自己的密码
set password=password('xxxx');

#root用户改别人的密码 
#1.
set password for '用户名'@'主机名'=password('xxxx');
#2.
update user set authentication_string=password('xxx') where user='用户名';

14.2 用户权限

#给某用户权限
grant 权限列表 on 库.表名 to '用户名'@'主机名'

# 给某用户所有权限
grant all [privileges] on ...;

#查看某个用户的权限
show grant for ''@'';

#去掉用户的某个权限
revoke [] on 库.表名 from ''@''      
#eg. revoke delete,insert on rootDB.user from 'Dusong'@'%';

15 C/C++引入MySQL客户端库

#mysql动静态库
ls /usr/lib64/mysql/
#mysql头文件
ls /usr/include/mysql/
//查看客户端版本
mysql_get_client_info()

15.1 C API

  • 初始化
#include <mysql/mysql.h>
#include <iostream>

int main() {
    //初始化
	MYSQL *myfd = mysql_init(nullptr);
    
    //链接, 返回nullptr则链接失败
    mysql_real_connect(myfd, "127.0.0.1", "Dusong", "123456", "test_db", 3306, nullptr, 0); 
    
    //设置字符集
    mysql_set_character_set(myfd, "utf8"); 
    
    //sql
    mysql_query(myfd, "select * from user");  //查询user表
    
    //获取结果
    MYSQL_RES *res = mysql_store_result(myfd);
        
    //关闭连接 
    mysql_close(myfd);
}
  • 链接数据库

image-20240208143738984

  • 设置字符集,默认时latin1,而mysqld使用的utf8
mysql_set_character_set(myfd, "utf8");
  • 下发mysql命令

image-20240208152527463

  • 获取查询结果集 (select)

    image-20240208154044350

    • 获取行数:my_ulonglong mysql_num_rows(MYSQL_RES *res)
    • 获取列数:my_ulonglong mysql_num_fields(MYSQL_RES *res)
  • 打印结果

my_ulonglong row = mysql_num_rows(res);
my_ulonglong col = mysql_num_fields(res);

//属性
MYSQL_FIELD *fields = mysql_fetch_fields(res);
for (int i = 0; i < col; i++) {
    cout << fields[i].name << '\t';
}
cout << '\n';


//内容
for (int i = 0; i < row; i++) {
    MYSQL_RES row_res = mysql_fetch_row(res);
    for (int j = 0; j < col; j++) {
        cout << row_res[j] << '\t';
    }
    cout << '\n';
}
  • 释放结果集的空间

image-20240210221818901

image-20240212135852934

yfd = mysql_init(nullptr);

//链接, 返回nullptr则链接失败
mysql_real_connect(myfd, "127.0.0.1", "Dusong", "123456", "test_db", 3306, nullptr, 0); 

//设置字符集
mysql_set_character_set(myfd, "utf8"); 

//sql
mysql_query(myfd, "select * from user");  //查询user表

//获取结果
MYSQL_RES *res = mysql_store_result(myfd);
    
//关闭连接 
mysql_close(myfd);

}


- 链接数据库

[外链图片转存中...(img-AQJEj5cy-1711710514039)]



- 设置字符集,默认时`latin1`,而`mysqld`使用的`utf8`

```cpp
mysql_set_character_set(myfd, "utf8");
  • 下发mysql命令

[外链图片转存中…(img-APSfUMvL-1711710514039)]

  • 获取查询结果集 (select)

    [外链图片转存中…(img-m0nKT7hq-1711710514039)]

    • 获取行数:my_ulonglong mysql_num_rows(MYSQL_RES *res)
    • 获取列数:my_ulonglong mysql_num_fields(MYSQL_RES *res)
  • 打印结果

my_ulonglong row = mysql_num_rows(res);
my_ulonglong col = mysql_num_fields(res);

//属性
MYSQL_FIELD *fields = mysql_fetch_fields(res);
for (int i = 0; i < col; i++) {
    cout << fields[i].name << '\t';
}
cout << '\n';


//内容
for (int i = 0; i < row; i++) {
    MYSQL_RES row_res = mysql_fetch_row(res);
    for (int j = 0; j < col; j++) {
        cout << row_res[j] << '\t';
    }
    cout << '\n';
}
  • 释放结果集的空间

[外链图片转存中…(img-mBm3QdXp-1711710514039)]

[外链图片转存中…(img-N9Xe9sDv-1711710514040)]


  1. 下述以该表为例 ↩︎

  2. 四舍五入之后超出范围 ↩︎

  3. 四舍五入之后在合法范围之内 ↩︎

  4. 查找hobby中包含football的数据 ↩︎

  5. address没有默认值 ↩︎

  6. address不能为null ↩︎

  7. int(10) unsigned中的10,表示因为该无符号整数最大值2^32总共有10位数字(有符号11位,有一位表示符号) ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1554457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv8全网独家改进:红外小目标 | 注意力机制改进 | 维度感知选择性集成模块DASI,红外小目标暴力涨点| 2024年3月最新成果

💡💡💡本文独家改进:维度感知选择性集成模块DASI,解决目标的大小微小以及红外图像中通常具有复杂的背景的问题点,2024年3月最新成果 💡💡💡红外小目标实现暴力涨点,只有几个像素的小目标识别率大幅度提升 改进结构图如下: 收录 YOLOv8原创自研 https://blo…

Challenging BIG-Bench tasks and whether chain-of-thought can solve them阅读笔记

不是新文章哈&#xff0c;就是最近要看下思维链&#xff08;chain of thought&#xff0c;CoT&#xff09;这块&#xff0c;然后做点review。 文章链接&#xff08;2022年&#xff09;&#xff1a;https://arxiv.org/pdf/2210.09261.pdf GitHub链接&#xff1a;GitHub - suzg…

100个AI Agent应用场景合集

人工智能代理&#xff08;AI Agent&#xff09;的发展正在以前所未有的速度改变我们的生活和工作方式。从日常生活的小事到企业级的复杂决策&#xff0c;AI Agent 的应用场景广泛且多样。 100个AI Agent应用场景合集 以下是 100 个 AI Agent 的创新应用场景&#xff0c;它们展示…

代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯 509. 斐波那契数题目解法 70. 爬楼梯题目解法 746. 使用最小花费爬楼梯题目解法 感悟 509. 斐波那契数 题目 解法 使用动态规划 class Solution { public:int fib(int n) {if(n <…

书生浦语训练营2期-第一节课笔记

笔记总结: 了解大模型的发展方向、本质、以及新一代数据清洗过滤技术、从模型到应用的典型流程、获取数据集的网站、不同微调方式的使用场景和训练数据是什么&#xff0c;以及预训练和微调在训练优势、通信/计算调度、显存管理上的区别。 收获&#xff1a; 理清了预训练和微调…

unity学习(77)--多玩家信息交互--不同类型的数据包

明白各个数据包的作用&#xff0c;以及是否正确的发挥作用 1.“120包”&#xff0c;客户端登录时发给服务器的&#xff0c;服务器处理后返回“121包”。 2.“121包” &#xff0c;服务器返回给客户端的&#xff0c;包含登录时所有在线玩家的信息。 客户端也通过createPlayer函…

故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型是一种深度学习模型,结合了卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM)的优点…

缺省和重载.引用——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 C输入&输出cout 和cin<<>> 缺省参数全缺省半缺省应用场景声明和定义分离的情况 函数重载1.参数的类型不同2.参数的个数不同3.参数的顺…

速成软件书是神器还是焦虑?

一、背景 "速成软件书"通常是指那些宣称能帮助读者在短时间内掌握某种软件操作或编程技能的书籍。这类书籍往往以其高效、快捷的学习路径吸引读者&#xff0c;尤其适合有一定基础或者急需短期内提升特定技能的人群。 然而&#xff0c;“神器”之称则带有主观性和一…

Python:执行py命令,提示: Can‘t find a default Python.

1.Python运行环境罢工 今天&#xff0c;要运行一个前年用python编写的爬虫程序&#xff0c;先检测python运行环境是否正常&#xff1a; D:\Python38-32\works>c:\windows\py.exe Cant find a default Python. 再试&#xff1a; D:\Python38-32\works>py --list Installe…

电子版各大主流报纸查看方法

2024-03-22 更新到V1.1.01.修复科技日报下载后都是第1页的bug2.增加“中国旅游报”“中国文物报”两个报种3.设置自动保存勾选结果若干说明&#xff1a; 1.本工具是提供提供数字报阅读的报种的下载&#xff0c;一般来说只有能看&#xff0c;才有所谓的下载2.如果朋友们有什么好…

python3将exe 转支持库错误 AssertionError: None does not smell like code

exe -> pyc包(*.exe_extracted) 安装反编译工具 exe反编译工具&#xff1a;pyinstxtractor.py下载&#xff1a;https://sourceforge.net/projects/pyinstallerextractor/ python pyinstxtractor.py hello.exe包反编译 懒的写&#xff01;&#xff01;&#xff01; 这有详…

【项目技术介绍篇】若依开源项目RuoYi-Cloud后端技术介绍

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

Matlab|电动汽车充放电V2G模型

目录 1 主要内容 1.1 模型背景 1.2 目标函数 1.3 约束条件 2 部分代码 3 效果图 4 下载链接 1 主要内容 本程序主要建立电动汽车充放电V2G模型&#xff0c;采用粒子群算法&#xff0c;在保证电动汽车用户出行需求的前提下&#xff0c;为了使工作区域电动汽车尽可能多的消…

跳跃游戏-java

题目描述: 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题思想: …

【MySQL】事务日志

事务的隔离性由锁机制实现&#xff0c;事务的原子性、一致性和持久性由redo日志和undo日志实现。 一、redo日志 1.1、为什么需要redo日志 一方面&#xff0c;由于数据从内存写回磁盘需要一定的时间&#xff0c;假如在事务提交后&#xff0c;还没有写回磁盘&#xff0c;数据库…

中小型集群部署,Docker Swarm(集群)使用及部署应用介绍

1、Docker Swarm简介 说到集群&#xff0c;第一个想到的就是k8s&#xff0c;但docker官方也提供了集群和编排解决方案&#xff0c;它允许你将多个 Docker 主机连接在一起&#xff0c;形成一个“群集”&#xff08;Swarm&#xff09;&#xff0c;并可以在这个 Swarm 上运行和管…

unity3d for web

时光噶然 一晃好多年过去了&#xff08;干了5年的u3d游戏&#xff09;&#xff0c;记得最后一次使用的版本好像是 unity 2017。 那个是 unity3d for webgl 还需要装个插件。用起来很蛋疼。 最近做一个小项目 在选择是用 Layabox 还是 cocosCreate 的时候 我想起了老战友 Uni…

你管这破玩意叫网络

你是一台电脑&#xff0c;你的名字叫 A 很久很久之前&#xff0c;你不与任何其他电脑相连接&#xff0c;孤苦伶仃。 直到有一天&#xff0c;你希望与另一台电脑 B 建立通信&#xff0c;于是你们各开了一个网口&#xff0c;用一根网线连接了起来。 用一根网线连接起来怎么就能…

开始时间大于结束时间

1.dom中代码&#xff0c;监听所选日期值的变化&#xff0c;并把需要比较的时间字段作为参数传到监听方法中&#xff0c; <el-form-item label"起始日期" prop"startTime"><el-date-picker clearable size"small":disabled"isDisa…