数据和数据库
数据和信息
信息: 信息就是事物包含的意义(可以有不同的理解)如:
对于杯水,属性是无限多的,体积、温度、密度这些属性是客观存在的,就是说如果这杯水的温度是33度,就算没有人去观察这杯水,它的温度也还是33度,而“水的温度是33度”只是这杯水的众多信息之一。(这个概念对于学过哲学唯物内容的同学来说,是比较好理解的。)
数据: 数据是信息的
具体表现形式
,是记录信息可识别的符号.
如: 数字,文字,图像,视频等数据和信息的联系: 数据是信息的
表示或者载体
,信息是数据的内涵和意义
,是对数据的语义解释.
数据库
- 数据库: 数据库
DB
(database),长期储存
在计算机内、有组织
的、可共享
的大量数据的集合
.数据库就是一个存放数据
的仓库
如: 二维表,电话簿等 - 数据库管理系统
DBMS
(database management system):DBMS是软件
,位于用户与操作系统
之间。DBMS能够组织和存储数据、获取和维护数据。 - 数据库系统
DBS
(database system): 数据库系统由数据库
、数据库管理系统
(及其应用开发工具)、应用程序
、数据库管理员
四部分构成。 - 数据库管理员
DBA
(Database Administrator): 俗称运维,负责
和控制
数据库系统,是数据库系统中最重要的人
数据库体系结构
模式:
实例: 模式的一个具体值
,如Student(1,张三,18)
三层模式
- 逻辑模式/模式(Schema):对数据库中
全体
数据(实体)的逻辑结构
和特征的描述
,不涉及具体值
.如Student(id,name,age).- 一个数据库只有一个逻辑模式
- 外模式/子模式/用户模式: 是用户能看见和使用的
局部
数据的逻辑模式和特征的描述- 一个数据库有多个外模式
- 是模式的子集
- 是用户的数据视图
- 内模式/存储模式: 是对数据的物理结构与存储方式的描述,数据在数据库内部的组织方式
- 一个数据库只有一个内模式
两级映像
- 外模式/模式映像: 定义外模式与逻辑模式之间的
对应关系
,当模式改变时,改变映像可以使外模式不变,应用程序不变,保证数据的逻辑独立性.- 每一个外模式都对应一个 外模式/模式映像
- 映像的定义通常在各自外模式的描述中
- 内模式/模式映像: 定义了
全局逻辑结构和存储结构的对应关系
,当存储结构改变时,改变映像,可是模式不变,应用程序不变,保证数据的物理独立性作用
- 应用程序与数据之间互相独立
- 逻辑独立性
- 物理独立性
数据模型
什么是数据模型
数据模型是对现实世界的模拟表述,数据模型应该满足三方面要求:
- 网状模型-网状结构
- 层次模型-树形结构
- XML-树形结构
- JSON-树形结构
关系数据模型
关系模型建立在集合代数
的基础上
关系数据结构
域(Domain)/列: 是一组具有相同
数据类型
的值
的集合
,在二维表中就是列
.例如- 整数
1,2,3,4,5,6,7,8,9,10,...
- 实数
1.1,2.2,3.3,...
- 其它…
- 整数
笛卡尔积(Cartesian Product): 就是两个
集合相乘
,例如
假设现在有三个表学生
,专业
,老师
.他们的结构图下学生表 专业表 老师表
计算方式就是每个学生都与其它两个表的元组相乘,计算出所有可能的结果.
最终结算结果如下- 关系/二维表: 关系也是一个
二维表
- 表的每一行就是
元组
- 表的每一列的取值范围就是
域
- 列的名字称为
属性
(Attribute)- 码(Key)/键:
- 候选码(Candidate Key)/主键: 在关系中能
唯一标识
属性或属性集 - 主属性(Prime Attribute): 候选码的各个属性
- 主码(Primary Key)/唯一主键: 候选码其中的一个,
一个表必须有一个主码
- 全码:
所有属性``都是
这个关系的候选码
- 外码/外键(Foreign Key): 如果一个关系R中的一个属性F对应着另一关系S的主码K那么F在关系R中称为外码.
- 候选码(Candidate Key)/主键: 在关系中能
- 码(Key)/键:
- 表的每一行就是
- 关系的基本性质
- 列是同质的-数据类型/域相同
- 列和行的顺序无所谓
- 元组不能完全相同
- 分量必须取原子值-即元组的某一个属性不能再往下分,比如性别
关系操作
- 关系模式(Relation Schema): 是对关系的描述
- 关系模式是
型
,关系是值
,列如:
其中关系是学生
,关系模式是学生(学号,姓名,年龄,性别,籍贯)
- 关系模式通常写为
R(U)
,其中R是关系,U是属性集合 - 和关系的区别: 是对关系的描述,他是
静态的稳定的
.关系是整个二维表其中的值会发生变化,而关系模式是属性,不会经常变化
- 关系模式是
- 关系数据库: 是
实体之间的关系集合
,列如
假设有关系:教师关系(T),课程关系(C),学生关系(S),那么该关系数据库可以描述为有三个关系模式:T(TID,TNAME,TITLE) S(SID,SNAME) C(CID,CNAME)
- 关系操作
- 常用关系操作: 插入,查询,删除,修改
- 关系操作特点: 集合操作方式
- 关系数据语言种类:
关系代数
语言,关系演算
语言(SQL具有以上两种特点)
完整性约束
- 实体完整性: 实体和实体之间保证不重复
主码唯一
且不能为空主属性
不能取空值
- 参照完整性: 外码和主码之间的引用规则
- 外码取值暂时为
空值
或者是被参照表中的元组中的主码值
- 外码取值暂时为
- 用户定义的完整性: 是用户工具实际情况自己定义的约束条件.例如XXX属性必须唯一等.
关系代数
- 关系数据语言: 对数据库进行操作的语言
- 关系代数/关系演算:
早期的
原理性的,不用于现在商用的DBMS中 - SQL: 是讲SQL语言
转换成关系代数
或者类似的表现形式
- 关系代数/关系演算:
- 运算规则
- 用对
关系
的运算来表达查询 - 运算对象:
关系
- 运算符: (并:∪,交:∩,差:-),(选择:σ,投影:π,笛卡尔积:×,连接:∞,重命名:ρ),(比较运算符:< > <= >= = <>),(非:¬,与:∧,或:∨)
- 运算结果:
关系
- 用对
- 并,差,交
- 进行运算的条件是两个集合的
属性个数
必须相同
- 并和差属于高中集合知识,不细讲
- 差: 由属于R而不属于S的所有集合组成,如下图为红色部分
- 进行运算的条件是两个集合的
- 投影,选择
- 投影: 从R关系中选择若干满足条件属性组成新的关系.假设有以下算式:
π
表示投影运算符L
表示要从R中取那些属性,可以是属性名,或者属性的列号R
表示从R中取- 结果要去掉重复元组
- 选择: 在R关系中选择
满足条件的元组
组成新的关系.假设有以下算式:σ
表示选择运算符c
表示条件,格式为列名 运算符 值.R
表示从R中取- 结果要去掉重复元组
- 投影: 从R关系中选择若干满足条件属性组成新的关系.假设有以下算式:
- 笛卡尔积,连接
- 笛卡尔积: 就是将两个集合的元组进行匹配连接
- 列数: n+m
- 行数: k1xk2(如果属性重名,就采用R.S和S.A分别命名)
- 连接: 将集合进行笛卡尔积后在进行选择操作.
- A和B:分别是R和S上相同长度且可以进行比较的属性组合
- θ:比较的条件
- 运算方法: 从R和S的笛卡尔集中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较条件的元组.概括就先笛卡尔再选择
- 等值连接: 其实就是θ为
=
运算符,从两个关系中选择相同的属性值的元组
- 自然连接:
等值连接
运算后去掉重复属性- 两个关系必须具有公共属性
- 结果要去掉重复属性
- 笛卡尔积: 就是将两个集合的元组进行匹配连接
- 重命名: 给一个关系或者关系中的属性起一个代号.
- ρ: 重命名运算符
- s: 被重命名后的名字
- A1…An: 重命名的属性名
- R: 被重命名的关系
- 等价运算:
- 运算符优先级:
范式
关系数据库中的关系满足一定要求的,满足不同程度要求的为不同的范式。满足最低要求的叫第一范式
,简称1NF;在第一范式的基础上满足进一步要求的称为第二范式,简称2NF,其余范式以此类推。对于各种范式之间有如下关系:
- 函数依赖: 在一个关系中,有属性A能知道属性B,称为A为决定因素.
- 完全函数依赖: 在一个关系中,想要知道一个属性必须需要
两个及以上
的属性才能推出该属性,就称该属性完全依赖另外两个属性x,y,...
. - 部分函数依赖: 只需要关系所有属性中的子集属性,此时称该属性部分函数依赖于关系。
- 完全函数依赖: 在一个关系中,想要知道一个属性必须需要
- 1NF: 所有属性都
不可再分
- 2NF:
消除
了非主属性
对主属性
的部分函数依赖
- 3NF: 在2NF的基础上
消除
了传递
函数依赖.传递函数依赖指的是,如果存在:A->B->C的决定关系,则C传递函数依赖于A - 4NF: 消除主属性对主键的部分与传递依赖
- 5NF: 消除表中的多值依赖
SQL 创建与删除数据库
创建数据库
在与数据进行任何其他操作之前,需要创建一个数据库。要在MySQL中创建数据库,请使用CREATE DATABASE
语句,如下:
CREATE DATABASE [IF NOT EXISTS] database_name;
我们来更详细地看看CREATE DATABASE语句:
CREATE DATABASE
语句的后面是要创建的数据库名称。IF NOT EXISTS
是语句的可选子句。用于检测是否存在重名的数据库
例如,要创建一个名称为mytestdb
数据库
CREATE DATABASE IF NOT EXISTS mytestdb;
查看数据库安装路径
任意一个命令都可以
select @@basedir as basePath from dual ;
show variables like '%basedir%';
查看数据库存放路径
任意一个命令都可以
select @@datadir as dataPath from dual ;
show variables Like '%datadir%';
删除数据库
删除数据库意味着数据库中的所有数据和关联对象将被永久删除,并且无法撤消。
要删除数据库,请使用DROP DATABASE
语句,如下所示:
DROP DATABASE [IF EXISTS] database_name;
与CREATE DATABASE语句类似
,IF EXISTS是该语句的可选部分,以防止您删除数据库服务器中不存在的数据库。
展示数据库列表
如果要查看当前 MySQL 服务器有哪些数据库,可以使用 SHOW DATABASES
; 命令
选择数据库
使用 USE
SQL命令来选择指定的数据库
USE 数据库名称;
数据类型
数字数据类型
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 Bytes | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 Bytes | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度 |
DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215 bytes | 中等长度文本数据 |
日期和时间类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ | YYYY-MM-DD hh:mm:ss | 混合日期和时间值 |
TIMESTAMP | 4 | ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYY-MM-DD hh:mm:ss | 混合日期和时间值,时间戳 |
MySQL 列出数据表
输入 SHOW TABLES
; 命令就可以查看当前选择的数据库有哪些表
SHOW TABLES;
MySQL 创建数据表
面的 SQL 语句为创建 MySQL
数据表的通用语法
CREATE TABLE table_name (列名 column_type other,...);
MySQL 删除表
使用 DROP TABLE
SQL 语句删除数据表的通用语法如下
DROP TABLE table_name ;
字段(属性)插入/添加数据
使用 INSERT INTO
SQL 语句往表中插入数据的语法格式如下
INSERT INTO table_name ( 属性1, 属性2,...属性N ) VALUES ( value1, value2,...valueN );
或者Msql独有的语句
INSERT INTO table_name SET 属性1=值1[,属性2=值2]
如果数据是字符型,必须使用单引号''
或者双引号""
,如 “value”
如果值包含了全部字段
,且按照属性的顺序,那么可以用下面的简写语法
INSERT INTO table_name VALUES ( value1, value2,...valueN );
如果是多条语句,可以用 逗号,
分隔每条数据.例如:
INSERT INTO `tbl_language` VALUES
(1,'Python','https://www.twle.cn','1991-2-20'),
(2,'PHP','http://www.php.net','1994-1-1'),
(3,'Ruby','https://www.ruby-lang.org/','1996-12-25')
Mysql 修改表名
- rename
rename table 旧表名 to 新表名;
rename table 旧表名1 to 新表名1[,旧表名2 to 新表名2...];
- alter
alter table 旧表名 to 新表名
修改表编码
ALTER TABLE `table_name` DEFAULT CHARACTER SET utf8;
修改属性/字段名
ALTER TABLE `table_name` CHANGE 旧字段名 新字段名 类型;
修改字段的类型
ALTER TABLE `table_name` MODIFY 字段名 类型;
查询数据
select 属性1[,属性2..属性N] from `table_name`
条件查询
select 属性1[,属性2..属性N] from `table_name` where 属性=值
修改/更新数据
update `table_name` set 属性1=值1[,属性2=值2...属性N=值N] [where 条件表达式]
删除数据
delete from `table_name` [where 条件表达式]
关键字
limit
: 相当于Access的top关键字,用于截取前n条记录行
多表查询
UNION联合查询
使用UNION的前提是select后查询的列的数量
必须一样.类型必须相似, SELECT 语句中的列的顺序必须相同,虽然不报错但是查询结果会乱.UNION可以连续使用
UNION语法
SELECT 列名(s) FROM table1
UNION
SELECT 列名(s) FROM table2;
UNION ALL 语法
默认UNION选取不同的值,如果允许重复
就使用UNION ALL
SELECT 列名(s) FROM table1
UNION ALL
SELECT 列名(s) FROM table2;
连接查询
CROSS JOIN交叉连接
交叉连接返回的是被连接的两个表中所有数据行的笛卡尔积
CROSS JOIN语法结构
语法一
SELECT table1.column1, table2.column2...
FROM table1 CROSS JOIN table2
语法二
SELECT table1.column1, table2.column2...
FROM table1, table2
内连接
内连接两个表处于对等关系,内连接通过设置连接条件
的方式,来消除交叉连接查询结果中某些数据集中
的问题.
语法结构:
select 列名1,...,列名n from 表1 inner join 表2 [on子句]
内连接通过关键字inner join连接两张表,使用on设置连接条件,如果不设置
连接条件则表达式和交叉查询等价
.
由于内连接是默认连接方式,所以可以忽略inner关键字,只使用关键字join,例如:
select 列名1,...,列名n from 表1 join 表2 [on子句]
至于为什么用on不用where,on本来就是用于定义连接表的条件,用on可以优化阅读符合规范.另外where在性能上较差.
外连接
外连接是由某一个表主,两个表再进行左外连接右连接和全外连接
左外连接
就是以左表为主,根据条件将右表添加到左表,语法格式为:
select 属性1,...,属性n from 表1 left 表2 on 条件
这个表达式即查询表1的所有记录和满足条件的表2的记录
右外连接
就是以右表为主,根据条件将左表添加到右表,语法格式为:
select 属性1,...,属性n from 表1 right 表2 on 条件
这个表达式即查询表2的所有记录和满足条件的表1的记录
全外连接
全外连接就是符合条件的记录和左右两表都不符合
条件的记录.但是Mysql并不支持全外连接,实现方式就是将左右连接合并。
子查询
子查询也叫内部查询
或嵌套查询
,是将一个select查询的结果作为另一个sql语句的数据来源或判断条件。
子查询常用在 WHERE 子句和 FROM 子句后边:
- 当用于
WHERE
子句时,根据不同的运算符,子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为
WHERE 子句查询条件
的值
。 - 当用于
FROM
子句时,一般返回多行多列数据,相当于返回一张临时表
,这样才符合 FROM 后面是表的规则。这种做法能够实现多表联合查询。
语法结构
- 用于 WHERE 子句的子查询的基本语法如下:
子查询需要放在SELECT 列名 [, 列名 ] FROM table1 [, table2 ] WHERE 列名 OPERATOR (SELECT 列名 [, 列名 ] FROM table1 [, table2 ] [WHERE])
()
内,OPERATOR 表示用于 WHERE 子句的运算符。 - 用于 FROM 子句的子查询的基本语法如下:
用于from子查询的结果相当于一张临时表,所以使用SELECT column_name [, column_name ] FROM (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE]) AS temp_table_name WHERE condition
as
为临时表起一个名字。
权限
用户
创建用户,主机影响着登录.0.0.0.0或%表示任何ip都可以登录,localhost表示只能本机登录.如果指明具体的ip则只有该ip能登录
create user 用户名@主机
创建用户且添加密码
create user 用户名@主机 identified by "密码"
删除用户
drop user 用户名@主机
授权
基本权限
sql中有5种基本权限
| 查询权限 | select |
|———|————-|
| 插入权限 | insert |
| 更新权限 | update |
| 删除权限 | delete |
| 创建权限 | create |
授权
授权使用grant
,格式如下:
GRANT <权限> [, <权限>]
[ON <对象类型> <对象名>]
TO <用户> [, <用户>]
[WITH GRANT OPTION][AS 用户]
其中,WITH GRANT OPTION
设置接收权限的用户拥有向其他用户授予权限的能力。
示例如下
GRANT COMMAND ON DATABASE.TABLE TO 用户名@主机
授予基本权限
grant select,insert,delete,update,create on 库名.表名 to '用户'@'主机';
例如赋予某一个表某一列修改权限
GRANT UPDATE(UnitPrice) ON 表名.列名 TO '用户名'@'主机';
USAGE
表示无任何权限
查询权限
SHOW GRAMTS FOT 用户名@主机;
回收权限
回收权限是指回收用户
对每一个数据库
的指定权限
.回收权限使用REVOKE
关键字,格式如下:
REVOKE [GRANT OPTION FOR] <权限> [, <权限>]
[ON <对象类型> <对象名>]
FROM <用户> [, <用户>]
[CASCADE] [AS 用户]
其中,CASCADE
选项是指当前正在撤销的权限也将从其他被主体授权的主体中撤销。使用CASCADE参数时,还必须同时
指定 GRANT OPTION FOR
参数,表示对授予 WITH GRANT OPTION 权限的权限执行联级撤销。
例如删除delete权限
REVOKE delete ON *.* FROM '用户名'@'主机';
拒权
拒权是指拒绝
为指定用户对某个数据库对象使用
某种权限。防止该主体通过组或角色成员身份继承权限。用DENY
语句。
DENY <权限> [, <权限>]
[ON <对象类型> <对象名>]
TO <用户> [, <用户>]
刷新权限
添加新用户或更改用户的旧密码后,需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问!
flush privileges
视图
什么是视图
从SQL的角度
来看,视图就是一张表
,存在表名、字段列。在SQL语句中,也并不区分实体表和视图。
视图本身是一个不含
任何数据的虚拟表
,数据库中存放视图的定义
(保存好的SELECT语句
),而不存放视图对应的数据。
视图和实体表的区别就在与:是否保存了实际数据
。
实体表中保存实际数据,使用表创建视图后,表
中的数据发生变化
,视图查询出的数据就会发生变化。
从视图中读取数据时,视图会在内部执行对应的SELECT语句,并创建出一张临时表。
为什么要用视图-简化用户操作,提高复用性
- 简单性-将频繁使用的
查询
语句保存成视图
,这样就不用每次都重新写。在创建好视图后,可以将视图和其他实体表一样,在SELECT语句中进行调用
。 - 安全性-通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。
- 逻辑数据独立性-视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
视图和表的关系
视图
一般都是建立在表的基础之上的,它的所有内容全部都来自
于表,可能是一个表
,也可能是多个表
,视图是基本表
的抽象
和在逻辑
意义上建立的新关系
。
视图的用法
视图的用法
创建视图的语句,就是在完整的SELECT语句前,增加CREATE VIEW 视图名 AS
。
CREATE VIEW 视图名 [DEFINER="指定拥有视图的账户"]
AS
SELECT <接上sql语句就行>
查看有哪些视图
SHOW tables;
SELECT * FROM information_schema.VIEWS;
查看视图结构
desc 视图名;
使用视图
对于已经创建的视图,可以在其他查询语句中使用.
SELECT * FROM [数据库名].视图名
使用视图时,同其他表的用法一致。只是表中是真实的数据,视图代表SELECT查询语句。
删除视图
DROP VIEW 视图名
视图数据增和改
视图也可以使用INSERT,UPDATE进行数据的增和改,在对视图新增和修改数据后,视图对应表中的数据同步
修改,但是需要符合以下条件:
- 视图FROM子句
只
有一张表; - 未使用GROUP BY子句,未使用HAVING子句
修改替换视图
create or replace view 视图 as sql语句;
alter view 视图名 as sql语句;
使用视图更新数据
update 视图 set 列=值 where 其他条件
事物
什么是事物
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些一条或多条数据库操作sql语句就构成一个事务!
事物的使用条件
- 在 MySQL 中只有使用了
Innodb
数据库引擎的数据库或表才支持事务。 - 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事物的基本操作
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN
或START TRANSACTION
,或者执行命令 SET AUTOCOMMIT=0
,用来禁止使用当前会话的自动提交。
START TRANSACTION;
-- 或
BEGIN;
BEGIN WORK;
设置事物保存点
SAVEPOINT 保存点名;
-- 删除保存点
RELEASE SAVEPOINT 保存点名
提交/事物确认
COMMIT
回滚
ROLLBACK [TO 保存点]
事物隔离级别
隔离级别分类
读未提交(Read Uncommitted)
最低的隔离级别,允许事务读取其他事务尚未提交的数据,容易出现脏读、不可重复读和幻读等问题。
读已提交(Read Committed)
比读未提交更高的隔离级别,允许事务读取其他事务已经提交的数据,但不能读取其他事务正在修改的数据。这一隔离级别可以避免脏读,但仍然存在不可重复读和幻读的问题。
可重复读(Repeatable Read)
比读已提交更高的隔离级别,允许事务读取其他事务已经提交的数据,并锁定其他事务正在修改的数据,避免不可重复读。但仍然存在幻读的问题。
串行化(Serializable)
最高的隔离
更改隔离级别
可以使用 SQL 语句 SET TRANSACTION ISOLATION LEVEL
来更改事务隔离级别。例如,要将事务隔离级别更改为可重复读,可以使用以下语句:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
注意,这条语句只能在当前事务内生效,对后续事务无影响。如果要更改默认的事务隔离级别,需要在数据库管理系统中进行设置。具体方法取决于使用的数据库管理系统。
请注意,在实际应用中,更改事务隔离级别可能会带来一定的性能影响,因此应谨慎使用。建议在实际使用中结合实际情况进行评估,选择适合的事务隔离级别。
存储过程(自定义函数)
不想写了,看菜鸟
MYSQL 存储过程中的关键语法
- 声明存储过程:
CREATE PROCEDURE/function prc_存储过程名字(IN p_in int) ### IN: 输入参数 p_in: 形参 int:类型 PROCEDURE: 存储过程 function: 存储过程体
- 存储过程开始和结束符号:
BEGIN .... END
- 变量定义:
DECLARE l_int int unsigned default 4000000;
- 变量赋值:
SET @p_in=1
- 声明语句结束符,可以自定义:
DELIMITER $$ 或 DELIMITER //