抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

数据和数据库

数据和信息

  1. 信息: 信息就是事物包含的意义(可以有不同的理解)如:

    对于杯水,属性是无限多的,体积、温度、密度这些属性是客观存在的,就是说如果这杯水的温度是33度,就算没有人去观察这杯水,它的温度也还是33度,而“水的温度是33度”只是这杯水的众多信息之一。(这个概念对于学过哲学唯物内容的同学来说,是比较好理解的。)

  2. 数据: 数据是信息的具体表现形式,是记录信息可识别的符号.
    如: 数字,文字,图像,视频等

  3. 数据和信息的联系: 数据是信息的表示或者载体,信息是数据的内涵和意义,是对数据的语义解释.

数据库

  1. 数据库: 数据库DB(database), 长期储存在计算机内、有组织的、可共享的大量数据的集合.数据库就是一个存放数据的仓库
    如: 二维表,电话簿等
  2. 数据库管理系统DBMS(database management system):DBMS是软件,位于用户与操作系统之间。DBMS能够组织和存储数据、获取和维护数据。
  3. 数据库系统DBS(database system): 数据库系统由数据库数据库管理系统(及其应用开发工具)、应用程序数据库管理员四部分构成。
  4. 数据库管理员DBA(Database Administrator): 俗称运维,负责控制数据库系统,是数据库系统中最重要的

数据库体系结构

模式:
实例: 模式的一个具体值,如Student(1,张三,18)

三层模式

  1. 逻辑模式/模式(Schema):对数据库中全体数据(实体)的逻辑结构和特征的描述,不涉及具体值.如Student(id,name,age).
    • 一个数据库只有一个逻辑模式
  2. 外模式/子模式/用户模式: 是用户能看见和使用的局部数据的逻辑模式和特征的描述
    • 一个数据库有多个外模式
    • 是模式的子集
    • 是用户的数据视图
  3. 内模式/存储模式: 是对数据的物理结构与存储方式的描述,数据在数据库内部的组织方式
    • 一个数据库只有一个内模式

两级映像

  1. 外模式/模式映像: 定义外模式与逻辑模式之间的对应关系,当模式改变时,改变映像可以使外模式不变,应用程序不变,保证数据的逻辑独立性.
    • 每一个外模式都对应一个 外模式/模式映像
    • 映像的定义通常在各自外模式的描述中
  2. 内模式/模式映像: 定义了全局逻辑结构和存储结构的对应关系,当存储结构改变时,改变映像,可是模式不变,应用程序不变,保证数据的物理独立性

    作用

  • 应用程序与数据之间互相独立
  • 逻辑独立性
  • 物理独立性

数据模型

什么是数据模型

数据模型是对现实世界的模拟表述,数据模型应该满足三方面要求:

  • 比较真实的模拟现实世界
  • 容易理解
  • 容易被计算机实现

    数据模型三要素

  1. 数据结构(静态特征)
  2. 数据操作(动态特征)
  3. 数据的约束条件(规则集合)

    数据模型的分类

    分类条件为数据结构不同
  4. 关系模型-二维表
  5. 半结构化的模型数据
    如:
  • 网状模型-网状结构
  • 层次模型-树形结构
  • XML-树形结构
  • JSON-树形结构

关系数据模型

关系模型建立在集合代数的基础上

关系数据结构

  1. 域(Domain)/列: 是一组具有相同数据类型集合,在二维表中就是.例如

    1. 整数
      1,2,3,4,5,6,7,8,9,10,...
      
    2. 实数
      1.1,2.2,3.3,...
      
    3. 其它…
  2. 笛卡尔积(Cartesian Product): 就是两个集合相乘,例如
    假设现在有三个表学生,专业,老师.他们的结构图下

    学生表

    博客mysql学习学生表

    专业表

    博客mysql学习专业表

    老师表

    博客mysql学习老师表
    计算方式就是每个学生都与其它两个表的元组相乘,计算出所有可能的结果.
    最终结算结果如下
    博客mysql学习笛卡尔计算结果

  3. 关系/二维表: 关系也是一个二维表
    • 表的每一行就是元组
    • 表的每一列的取值范围就是
    • 列的名字称为属性(Attribute)
      1. 码(Key)/键:
        • 候选码(Candidate Key)/主键: 在关系中能唯一标识属性或属性集
        • 主属性(Prime Attribute): 候选码的各个属性
        • 主码(Primary Key)/唯一主键: 候选码其中的一个,一个表必须有一个主码
        • 全码: 所有属性``都是这个关系的候选码
        • 外码/外键(Foreign Key): 如果一个关系R中的一个属性F对应着另一关系S的主码K那么F在关系R中称为外码.
  4. 关系的基本性质
    • 列是同质的-数据类型/域相同
    • 列和行的顺序无所谓
    • 元组不能完全相同
    • 分量必须取原子值-即元组的某一个属性不能再往下分,比如性别

关系操作

  1. 关系模式(Relation Schema): 是对关系的描述
    • 关系模式是,关系是,列如:
      其中关系是学生,关系模式是学生(学号,姓名,年龄,性别,籍贯)
      博客mysql学习关系模式
    • 关系模式通常写为R(U),其中R是关系,U是属性集合
    • 和关系的区别: 是对关系的描述,他是静态的稳定的.关系是整个二维表其中的值会发生变化,而关系模式是属性,不会经常变化
  2. 关系数据库: 是实体之间的关系集合,列如
    假设有关系:教师关系(T),课程关系(C),学生关系(S),那么该关系数据库可以描述为有三个关系模式:
    T(TID,TNAME,TITLE)
    S(SID,SNAME)
    C(CID,CNAME)
    
  3. 关系操作
    1. 常用关系操作: 插入,查询,删除,修改
    2. 关系操作特点: 集合操作方式
    3. 关系数据语言种类: 关系代数语言,关系演算语言(SQL具有以上两种特点)

完整性约束

  1. 实体完整性: 实体和实体之间保证不重复
    • 主码唯一且不能为空
    • 主属性不能取空值
  2. 参照完整性: 外码和主码之间的引用规则
    • 外码取值暂时为空值或者是被参照表中的元组中的主码值
  3. 用户定义的完整性: 是用户工具实际情况自己定义的约束条件.例如XXX属性必须唯一等.

关系代数

  1. 关系数据语言: 对数据库进行操作的语言
    • 关系代数/关系演算: 早期的原理性的,不用于现在商用的DBMS中
    • SQL: 是讲SQL语言转换成关系代数或者类似的表现形式
  2. 运算规则
    • 用对关系的运算来表达查询
    • 运算对象: 关系
    • 运算符: (并:∪,交:∩,差:-),(选择:σ,投影:π,笛卡尔积:×,连接:∞,重命名:ρ),(比较运算符:< > <= >= = <>),(非:¬,与:∧,或:∨)
    • 运算结果: 关系
  3. 并,差,交
    • 进行运算的条件是两个集合的属性个数必须相同
    • 并和差属于高中集合知识,不细讲
    • 差: 由属于R而不属于S的所有集合组成,如下图为红色部分
      博客mysql学习差集合
  4. 投影,选择
    • 投影: 从R关系中选择若干满足条件属性组成新的关系.假设有以下算式:博客mysql学习投影算式
      • π表示投影运算符
      • L表示要从R中取那些属性,可以是属性名,或者属性的列号
      • R表示从R中取
      • 结果要去掉重复元组
    • 选择: 在R关系中选择满足条件的元组组成新的关系.假设有以下算式:博客mysql学习选择算式
      • σ表示选择运算符
      • c表示条件,格式为列名 运算符 值.
      • R表示从R中取
      • 结果要去掉重复元组
  5. 笛卡尔积,连接
    • 笛卡尔积: 就是将两个集合的元组进行匹配连接
      • 列数: n+m
      • 行数: k1xk2(如果属性重名,就采用R.S和S.A分别命名)
    • 连接: 将集合进行笛卡尔积后在进行选择操作.博客mysql学习连接
      • A和B:分别是R和S上相同长度且可以进行比较的属性组合
      • θ:比较的条件
      • 运算方法: 从R和S的笛卡尔集中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较条件的元组.概括就先笛卡尔再选择
      • 等值连接: 其实就是θ为=运算符,从两个关系中选择相同的属性值的元组
      • 自然连接: 等值连接运算后去掉重复属性
        • 两个关系必须具有公共属性
        • 结果要去掉重复属性
  6. 重命名: 给一个关系或者关系中的属性起一个代号.博客mysql学习重命名
    • ρ: 重命名运算符
    • s: 被重命名后的名字
    • A1…An: 重命名的属性名
    • R: 被重命名的关系
  7. 等价运算: 博客mysql学习等价运算
  8. 运算符优先级: 博客mysql学习运算符优先级

范式

关系数据库中的关系满足一定要求的,满足不同程度要求的为不同的范式。满足最低要求的叫第一范式,简称1NF;在第一范式的基础上满足进一步要求的称为第二范式,简称2NF,其余范式以此类推。对于各种范式之间有如下关系:
博客mysql学习范式表

  1. 函数依赖: 在一个关系中,有属性A能知道属性B,称为A为决定因素.
    • 完全函数依赖: 在一个关系中,想要知道一个属性必须需要两个及以上的属性才能推出该属性,就称该属性完全依赖另外两个属性x,y,....
    • 部分函数依赖: 只需要关系所有属性中的子集属性,此时称该属性部分函数依赖于关系。
  2. 1NF: 所有属性都不可再分
  3. 2NF: 消除非主属性主属性的部分函数依赖
  4. 3NF: 在2NF的基础上消除传递函数依赖.传递函数依赖指的是,如果存在:A->B->C的决定关系,则C传递函数依赖于A
  5. 4NF: 消除主属性对主键的部分与传递依赖
  6. 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;

博客mysql学习创建数据库结果

查看数据库安装路径

任意一个命令都可以

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 修改表名

  1. rename
    rename table 旧表名 to 新表名;
    
    rename table 旧表名1 to 新表名1[,旧表名2 to 新表名2...];
    
  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 后面是表的规则。这种做法能够实现多表联合查询。

语法结构

  1. 用于 WHERE 子句的子查询的基本语法如下:
    SELECT 列名 [, 列名 ]
    FROM   table1 [, table2 ]
    WHERE  列名 OPERATOR
     (SELECT 列名 [, 列名 ]
     FROM table1 [, table2 ]
     [WHERE])
    
    子查询需要放在()内,OPERATOR 表示用于 WHERE 子句的运算符。
  2. 用于 FROM 子句的子查询的基本语法如下:
    SELECT column_name [, column_name ]
    FROM (SELECT column_name [, column_name ]
       FROM table1 [, table2 ]
       [WHERE]) AS temp_table_name
    WHERE  condition
    
    用于from子查询的结果相当于一张临时表,所以使用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 '用户名'@'主机';

博客mysql学习授权级别表
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视图更新失败情况

事物

什么是事物

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 操作。因此要显式地开启一个事务务须使用命令 BEGINSTART 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 存储过程中的关键语法

  1. 声明存储过程:
    CREATE PROCEDURE/function prc_存储过程名字(IN p_in int)
    ###
    IN: 输入参数
    p_in: 形参
    int:类型
    PROCEDURE: 存储过程
    function: 存储过程体
    
  2. 存储过程开始和结束符号:
    BEGIN .... END
    
  3. 变量定义:
    DECLARE l_int int unsigned default 4000000;
    
  4. 变量赋值:
    SET @p_in=1
    
  5. 声明语句结束符,可以自定义:
    DELIMITER $$
    或
    DELIMITER //
    

实例

评论