SQL语句
一、mysql目录结构
目录 | 目录内容 |
---|---|
bin | 放置可执行文件 |
docs | 文档 |
include | 包含(头)文件 |
lib | 依赖库 |
share | 存放字符集,语言 |
Data | mysql管理的数据库文件所在的目录 |
mysql.ini | mysql配置文件 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dW8QBEG-1607528520368)(D:\java_study\java-study\第二阶段\01模块一 MySQL数据库和SQL\01任务一MySQL基础和SQL入门\02_图片\MySql自带数据库的简单介绍.jpg)]
二、sql语法注意事项
1) SQL语句可以单行 或者 多行书写,以分号 结尾 ; (Sqlyog中可以不用写分号)
2) 可以使用空格和缩进来增加语句的可读性。
3) MySql中使用SQL不区分大小写,一般关键字大写,数据库名 表名列名 小写。
4) 注释方式
--空格 单行注释
/**/ 多行注释
# Mysql特有的单行注释
# show databases; 单行注释
– show databases; 单行注释
/*
多行注释
show databases;
*/
三、SQL的分类
分类 | 说明 |
---|---|
数据定义语言 | 简称DDL(Data Defifinition Language),用来定义数据库对象:数据库,表,列等。 |
数据操作语言 | 简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。 |
数据查询语言 | 简称DQL(Data Query Language),用来查询数据库中表的记录。 |
数据控制语言 | 简称DCL(Date Control Language),用来定义数据库的访问权限和安全级别,及创建用户。(了解) |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CH2RHlka-1607528520372)(D:\java_study\java-study\第二阶段\01模块一 MySQL数据库和SQL\01任务一MySQL基础和SQL入门\02_图片\SQL的分类.jpg)]
四、DDL操作数据库
1、创建数据库(create)
第一种:create database 数据库名; 创建指定名称的数据库
CREATE DATABASE db1;
第二种:create database 数据库名 character set 字符集 创建指定数据库,并且指定字符集(一般都指定utf8)
CREATE DATABASE db1_1 CHARACTER SET utf8;
2、查看/选择数据库(show/select)
use 数据库 切换数据库,使用选定的数据库
USE db1;
select database(); 查看当前正在使用的数据
SELECT DATABASE();
show databases; 查看Mysql中都有哪些数据库
SHOW DATABASES;
show create database 数据库名; 查看一个数据库的定义信息
SHOW CREATE DATABASE db1;
3、修改数据库(alter)
alter database 数据库名 character set 字符集 修改数据库的字符集
ALTER DATABASE db1 CHARACTER SET utf8;
SHOW CREATE DATABASE db1;
4、删除数据库(drop)
drop database 数据库名 从Mysql中永久删除某个数据库
DROP DATABASE db1;
DROP DATABASE db1_1;
五、DDL操作数据表
1、mysql常见的数据类型
类型 | 描述 |
---|---|
int | 整型 |
double | 浮点型 |
varchar | 字符串型 |
data | 日期类型,yyyy-MM-dd ,只要年月日,没有时分秒 |
注意:
MySQL中的 char类型与 varchar类型,都对应了 Java中的字符串类型,区别在于:
char类型是固定长度的: 根据定义的字符串长度分配足够的空间。
varchar类型是可变长度的: 只使用字符串长度所需的空间
char类型适合存储 固定长度的字符串,比如 密码 ,性别一类
varchar类型适合存储 在一定范围内,有长度变化的字符串
2、创建表
create table 表名(
字段名称1 字段类型(长度),
字段名称2 字段类型(长度) 注意:最后一列不需要加逗号
)
需求:
表名:category
表中字段:
分类ID :cid ,为整型
分类名称:cname,为字符串类型,指定长度20
CREATE TABLE category(
cid INT,
cname VARCHAR(20)
);
需求2:创建测试表
表名: test1
表中字段:
测试ID : tid ,为整型
测试时间: tdate , 为年月日的日期类型
CREATE TABLE test1(
tid INT,
tdate DATE
);
复制表(like):
语法格式:create table 新表名 like 旧表名;
CREATE TABLE test2 LIKE test1;
3、查看表(show)
show tables; 查看数据库中所有表名
SHOW TABLES;
desc 表名; 查看数据表的结构
DESC test1;
show create table 表名; 查看创建表使用的SQL语句
SHOW CREATE TABLE category;
4、删除表(drop)
drop table 表名;
DROP TABLE test1;
drop table if exists 表名; 判断表是否存在,存在就删除,不存在就不执行删除
DROP TABLE IF EXISTS test1;
DROP TABLE IF EXISTS test2;
5、修改表
1、修改表名(rename…to…)
rename table 旧表名 to 新表名
RENAME TABLE category TO category1;
2、修改字符集
alter table 表名 character set 字符集;
ALTER TABLE category CHARACTER SET gbk;
3、向表中添加列(add)
alter table 表名 add 字段名称 字段类型
ALTER TABLE category ADD cdesc VARCHAR(20);
ALTER TABLE student ADD (sname VARCHAR(20),age INT,sex CHAR(1),address VARCHAR(40));
4、修改表中列的数据类型或长度(modify)
alter table 表名 modify 字段名称 字段类型
ALTER TABLE category MODIFY cdesc VARCHAR(50);
5、修改列名称(change)
alter table 表名 change 旧列名 新列名 类型(长度);
ALTER TABLE category CHANGE cdesc description VARCHAR(30);
6、删除列(drop)
alter table 表名 drop 列名;
ALTER TABLE category DROP description;
六、DML操作表中数据
1、插入数据(insert into…values…)
语法格式:
insert into 表名(字段名1,字段名2…) values(字段值1,字段值2…)
INSERT INTO student(sid,sname,age,sex,address) VALUES(1,‘孙悟空’,20,‘男’,‘花果山’);
INSERT INTO student VALUES(2,‘孙悟空’,10,‘男’,‘地球’);
INSERT INTO category(cname) VALUES(‘白骨精’);
注意:
- 值与字段必须要对应,个数相同&数据类型相同
2)值的数据大小,必须在字段指定的长度范围内
3)varchar char date类型的值必须使用单引号,或者双引号 包裹。
4)如果要插入空值,可以忽略不写,或者插入null
- 如果插入指定字段的值,必须要上写列名
2、更改数据(updata)
语法格式1:不带条件的修改
update 表名 set 列名 = 值
UPDATE student SET sex = ‘女’;
语法格式2:带条件的修改
update 表名 set 列名 = 值【where 条件表达式:字段名 = 值】
UPDATE student SET sid = 6 WHERE age = 500;
UPDATE student SET sex = ‘男’ WHERE sid = 3;
3、删除数据(delete)
语法格式一:delete from 表名 删除所有数据,不推荐. 有多少条记录 就执行多少次删除操作. 效率低
语法格式二:truncate table 表名 删除所有数据,推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高
TRUNCATE TABLE student;
语法格式三:delete from 表名 [where 字段名 = 值] 指定条件删除
DELETE FROM student WHERE sid = 1;
七、DQL查询表中数据(select)
1、简单查询
语法格式:select 列名 from 表名
需求1:查询emp中的所有数据
select * from emp; 使用*表示所有列
需求2:查询emp中的所有数据,仅显示id和name字段
SELECT eid,ename FROM emp;
需求3:将所有的员工信息查询出来,并将列名改为中文,使用关键字as
SELECT
eid AS ‘编号’,
ename AS ‘姓名’,
sex AS ‘性别’,
salary AS ‘薪资’,
hire_date AS ‘入职时间’, --AS可以省略不写
dept_name AS ‘部门职能’
FROM emp;
需求4:查询一共有几个部门,使用去重关键字 distinct
SELECT DISTINCT dept_name FROM emp;
需求5: 将所有员工的工资 +1000 元进行显示
SELECT ename,salary + 1000 FROM emp;
2、条件查询
语法格式:select 列名 from 表名 where 条件表达式
运算符 | 说明 |
---|---|
> < <= >= = <> != | 大于、小于、大于(小于)等于、不等于 |
BETWEEN …AND… | 显示在某一区间的值 例如: 2000-10000之间: Between 2000 and 10000 |
IN(集合) | 集合表示多个值,使用逗号分隔,例如: name in (悟空,八戒) in中的每个数据都会作为一次条件,只要满足条件就会显示 |
LIKE ‘%张%’ | 模糊查询 |
IS NULL | 查询某一列为NULL的值, 注: 不能写 = NULL |
And && | 多个条件同时成立 |
Or|| | 多个条件任一成立 |
Not | 不成立,取反。 |
需求1:
# 查询员工姓名为黄蓉的员工信息
SELECT * FROM emp WHERE ename = ‘黄蓉’;
# 查询薪水价格为5000的员工信息
SELECT * FROM emp WHERE salary = 5000;
# 查询薪水价格不是5000的所有员工信息
SELECT * FROM emp WHERE salary != 5000;
SELECT * FROM emp WHERE salary <> 5000
# 查询薪水价格大于6000元的所有员工信息
SELECT * FROM emp WHERE salary > 6000;
# 查询薪水价格在5000到10000之间所有员工信息
SELECT * FROM emp WHERE salary >= 5000 && salary <= 10000;
SELECT * FROM emp WHERE salary BETWEEN 5000 AND 10000;
# 查询薪水价格是3600或7200或者20000的所有员工信息
SELECT * FROM emp WHERE salary = 3600 OR salary = 7200 OR salary = 20000;
SELECT * FROM emp WHERE salary IN(3600,7200,20000);
需求2:
# 查询含有’精’字的所有员工信息
SELECT * FROM emp WHERE ename LIKE ‘%精%’;
# 查询以’孙’开头的所有员工信息
SELECT * FROM emp WHERE ename LIKE ‘孙%’;
# 查询第二个字为’兔’的所有员工信息
SELECT * FROM emp WHERE ename LIKE ‘_兔%’;
# 查询没有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NULL;
# 查询有部门的员工信息
SELECT * FROM emp WHERE dept_name IS NOT NULL;
通配符 | 说明 |
---|---|
% | 表示匹配任意多个字符串, |
_ | 表示匹配 一个字符 |
3、去除重复(DISTINCT)
语法规则:
SELECT DISTINCT 列名称 FROM 表名称
SELECT DISTINCT Company FROM Orders;
MySQL单表&约束&事务
一、DQL操作单表
1、排序(ORDER BY)
语法结构:
select 字段名 from 表名 [where 字段 = 值] order by 字段名 [ASC/DESC]
ASC:升序排序
DESC:降序排序
a、单列排序,只按照一个字段排序
使用 salary 字段,对emp 表数据进行排序 (升序/降序)
SELECT * FROM emp ORDER BY salary ASC; --升序,默认排序,也可以不写ASC
SELECT * FROM emp ORDER BY salary DESC; --降序
b、组合排序,同时对多个字段排序,如果第一个字段相同,就按照第二个字段排序
在薪水排序的基础上,再使用id进行排序, 如果薪水相同就以id 做降序排序
SELECT * FROM emp ORDER BY salary,eid DESC;
2、聚合函数
语法结构:select 聚合函数(字段名) from 表名;
聚合函数 | 作用 |
---|---|
count | 统计指定列不为NULL的记录行数 |
sum | 计算指定列的数值和 |
max | 计算指定列的最大值 |
min | 计算指定列的最小值 |
avg | 计算指定列的平均值 |
需求1:
#1 查询员工的总数
SELECT COUNT(eid) FROM emp;
SELECT COUNT(*) FROM emp;
#2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
SELECT SUM(salary) FROM emp; --总薪水
SELECT MAX(salary) FROM emp; --最高薪水
SELECT MIN(salary) FROM emp; --最小薪水
SELECT AVG(salary) FROM emp; --薪水的平均值
SELECT
SUM(salary) AS ‘总薪水’,
MAX(salary) AS ‘最高薪水’,
MIN(salary) AS ‘最小薪水’,
AVG(salary) AS ‘平均薪水’
FROM emp;
#3 查询薪水大于4000员工的个数
SELECT COUNT(eid) FROM emp WHERE salary > 4000;
#4 查询部门为’教学部’的所有员工的个数
SELECT COUNT(eid) FROM emp WHERE dept_name = ‘教学部’;
SELECT COUNT(*) FROM emp WHERE dept_name = ‘教学部’;
#5 查询部门为’市场部’所有员工的平均薪水
SELECT AVG(salary) FROM emp WHERE dept_name = ‘市场部’;
3、分组(group by)
分组查询指的是使用GROUP BY 语句,对查询的信息进行分组,相同数据作为一组
语法格式:
select 分组字段/聚合函数 from 表名 group by 分组字段 [having 条件]
对数据进行过滤,使用 关键字 hiving
需求1:
按照性别进行分组
SELECT * FROM emp GROUP BY sex; --无意义
分组时可以查询要分组的字段, 或者使用聚合函数进行统计操作,单独分组无意义
需求: 通过性别字段 进行分组,求各组的平均薪资
SELECT sex,AVG(salary) FROM emp GROUP BY sex;
需求2:
#1.查询所有部门信息
SELECT dept_name AS ‘部门信息’ FROM emp GROUP BY dept_name;
#2.查询每个部门的平均薪资
SELECT dept_name AS ‘部门’,AVG(salary) FROM emp GROUP BY dept_name;
#3.查询每个部门的平均薪资, 部门名称不能为null
SELECT dept_name AS ‘部门’,AVG(salary) FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name
需求3:
# 查询平均薪资大于6000的部门.
需要在分组后,对数据进行过滤,使用 关键字 hiving
SELECT dept_name AS ‘部门’,AVG(salary) FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name HAVING AVG(salary) > 6000;
where 与 having的区别
过滤方式 | 特点 |
---|---|
where | where 进行分组前的过滤,where 后面不能写 聚合函数 |
having | having 是分组后的过滤,having 后面可以写 聚合函数 |
4、limint关键字(指定查询多少行数据)
语法格式:
SELECT 字段1,字段2… FROM 表名 LIMIT offset , length;
limit offffset , length;关键字可以接受一个 或者两个 为0 或者正整数的参数 |
---|
offffset 起始行数, 从0开始记数, 如果省略 则默认为 0. |
length 返回的行数 |
需求1:
# 查询emp表中的前 5条数据
SELECT * FROM emp LIMIT 5;
SELECT * FROM emp LIMIT 0,5;
# 查询emp表中 从第4条开始,查询6条
SELECT * FROM emp LIMIT 3,6;
需求2: 分页操作 每页显示3条数据
SELECT * FROM emp LIMIT 0,3;
SELECT * FROM emp LIMIT 3,3;
SELECT * FROM emp LIMIT 6,3;
– 分页公式 起始索引 = (当前页 - 1) * 每页条数
二、约束
约束的作用:
对表中的数据进行进一步的限制,从而保证数据的正确性、有效性、完整性.违反约束的不正确数据,将无法插入到表中
常见的约束
约束名 | 约束关键字 |
---|---|
主键 | primary key |
唯一 | unique |
非空 | not null |
外键 | foreign key |
1、主键约束(primary key)
特点:不可重复,唯一非空
作用:用来表示数据库中的每一条数据
语法格式:
字段名 字段类型 primary key;
需求1: 创建一个带主键的表
方法一:
CREATE TABLE emp2 (
– 设置唯一主键
eid INT PRIMARY KEY,
ename VARCHAR(20),
sex CHAR(1)
);
方法二:
CREATE TABLE emp2(
eid INT,
ename VARCHAR(20),
sex CHAR(1),
PRIMARY KEY(eid)
)
方法三:
CREATE TABLE emp2(
eid INT,
ename VARCHAR(20),
sex CHAR(1)
)
ALTER TABLE emp2 ADD PRIMARY KEY(eid);
测试主键的唯一性 非空性
# 正常插入一条数据
INSERT INTO emp2 VALUES(1,‘宋江’,‘男’);
# 插入一条数据,主键为空
– Column ‘eid’ cannot be null 主键不能为空
INSERT INTO emp2 VALUES(NULL,‘李逵’,‘男’);
# 插入一条数据,主键为 1
– Duplicate entry ‘1’ for key ‘PRIMARY’ 主键不能重复
INSERT INTO emp2 VALUES(1,‘孙二娘’,‘女’);
哪些字段可以作为主键 ?
- 通常针对业务去设计主键,每张表都设计一个主键id
- 主键是给数据库和程序使用的,跟最终的客户无关,所以主键没有意义没有关系,只要能够保证不重复就好,比如 身份证就可以作为主键.
2、删除主键
语法格式:
alter table emp2 drop primary key;
3、主键的自增(AUTO_INCREMENT)
AUTO_INCREMENT 表示自动增长(字段类型必须是整数类型)
创建主键自增的表
CREATE TABLE emp2(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
sex CHAR(1)
);
添加数据 观察主键的自增
INSERT INTO emp2(ename,sex)VALUES(‘张三’,‘男’);
INSERT INTO emp2(ename,sex)VALUES(‘李四’,‘男’);
INSERT INTO emp2 VALUES(NULL,‘翠花’,‘女’);
INSERT INTO emp2 VALUES(NULL,‘艳秋’,‘女’);
4、修改主键自增的起始值
默认地AUTO_INCREMENT的开始值是 1
– 创建主键自增的表,自定义自增其实值
CREATE TABLE emp2(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
sex CHAR(1)
)AUTO_INCREMENT=100; --从100开始自增
– 插入数据,观察主键的起始值
INSERT INTO emp2(ename,sex) VALUES(‘张百万’,‘男’);
INSERT INTO emp2(ename,sex) VALUES(‘艳秋’,‘女’);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VB8oOuRE-1607528520374)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206003736638.png)]
5、delete和truncate对自增长的影响
清空数据的方式 | 特点 |
---|---|
DELETE | 只是删除表中所有数据,对自增没有影响 |
TRUNCATE | truncate 是将整个表删除掉,然后创建一个新的表自增的主键,重新从 1开始 |
测试1: delete 删除表中所有数据
– 目前最后的主键值是 101
SELECT * FROM emp2;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2MWDzs9-1607528520378)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206003736638.png)]
– delete 删除表中数据,对自增没有影响
DELETE FROM emp2;
– 插入数据 查看主键
INSERT INTO emp2(ename,sex) VALUES(‘张百万’,‘男’);
INSERT INTO emp2(ename,sex) VALUES(‘艳秋’,‘女’);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4s0z2mr-1607528520382)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206004222255.png)]
测试2: truncate删除 表中数据
– 使用 truncate 删除表中所有数据,
TRUNCATE TABLE emp2;
– 插入数据 查看主键
INSERT INTO emp2(ename,sex) VALUES(‘张百万’,‘男’);
INSERT INTO emp2(ename,sex) VALUES(‘艳秋’,‘女’);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkwxUSJM-1607528520383)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206004348189.png)]
6、非空约束
非空约束的特点某一列不予许为空
语法格式:
字段名 字段类型 not null
需求1: 为 ename 字段添加非空约束
CREATE TABLE emp2(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20) NOT NULL,
sex CHAR(1)
);
–Column ‘ename’ cannot be null --ename不能为空
INSERT INTO emp2 VALUES(NULL,NULL,‘女’);
7、唯一约束(unique)
唯一约束的特点表中的某一列的值不能重复(对null不做唯一的判断 )
语法格式:
字段名 字段值 unique
1、添加唯一约束
CREATE TABLE emp3(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20) UNIQUE,
sex CHAR(1)
);
2、测试唯一约束
– 添加数据
INSERT INTO emp3 VALUES(NULL,‘张三’,‘男’);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-niXJ8WVI-1607528520385)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206005458777.png)]
–添加一条重复的数据
INSERT INTO emp3 VALUES(NULL,‘张三’,‘女’);
–Duplicate entry ‘张三’ for key ‘ename’ ename字段不能添加重复的数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NBQSSPTY-1607528520386)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206005549447.png)]
主键约束与唯一约束的区别: |
---|
1. 主键约束 唯一且不能够为空 |
2. 唯一约束,唯一 但是可以为空 |
3. 一个表中只能有一个主键 , 但是可以有多个唯一约束 |
8、外键约束(FOREING KEY)
FOREING KEY外键约束,具体可查看多表数据
9、默认值约束(DEFAULT)
默认值约束用来指定某列的默认值
语法格式:
字段名 字段类型 DEFAULT 默认值
1、创建emp4表, 姓名字段默认 奥利给
CREATE TABLE emp4(
eid INT PRIMARY KEY AUTO_INCREMENT,
– 为ename 字段添加默认值
ename VARCHAR(20) DEFAULT ‘奥利给’,
sex CHAR(1)
);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4aOH02A7-1607528520387)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206010428319.png)]
2、测试,添加数据使用默认值
INSERT INTO emp4 VALUES(NULL,DEFAULT,‘男’);
INSERT INTO emp4(sex) VALUES(‘女’);
–不使用默认值
INSERT INTO emp4 VALUES (NULL,‘艳秋’,‘女’);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HodSzQMI-1607528520389)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206011006344.png)]
三、事务
1、什么是事务
事务是一个整体,由一条或者多条SQL 语句组成,这些SQL语句要么都执行成功,要么都执行失败, 只要有
一条SQL出现异常,整个操作就会回滚,整个业务执行失败
2、模拟转账操作
创建账号表
– 创建账户表
CREATE TABLE account(
– 主键
id INT PRIMARY KEY AUTO_INCREMENT,
– 姓名
NAME VARCHAR(10),
– 余额
money DOUBLE
);
– 添加两个用户
INSERT INTO account (NAME, money) VALUES (‘tom’, 1000), (‘jack’, 1000);
模拟tom 给 jack 转 500 元钱,一个转账的业务操作最少要执行下面的 2 条语句:
– tom账户 -500元
UPDATE account SET money = money - 500 WHERE NAME = ‘tom’;
– jack账户 + 500元
UPDATE account SET money = money + 500 WHERE NAME = ‘jack’;
注意:
假设当tom 账号上 -500 元,服务器崩溃了。jack 的账号并没有+500 元,数据就出现问题了。
我们要保证整个事务执行的完整性,要么都成功, 要么都失败. 这个时候我们就要学习如何操作事
务.
3、MySQL事务操作
- 手动提交事务
- 自动提交事务
3.1.1 手动提交事务
语法格式
功能 | 语句 |
---|---|
开启事务 | start transaction 或者 BEGIN |
提交事务 | commit |
回滚事务 | rollback |
- START TRANSACTION 这个语句显式地标记一个事务的起始点。
- COMMIT 表示提交事务,即提交事务的所有操作,具体地说,就是将事务中所有对数据库的更新都写到磁盘上的物理数据库中,事务正常结束。
- ROLLBACK 表示撤销事务,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态
3.1.2 案例演示
模拟张三给李四转500元
1、命令行登录数据库
2、开启事务
start transaction;
3、tom账号 -500,jack账号 +500
update account set money = money - 500 where name = ‘tom’;
update account set money = money + 500 where name = ‘jack’;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HOWVXNAs-1607528520390)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206155655672.png)]
4、查看数据,无任何变化
5、执行commit提交事务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-95f8GfD2-1607528520393)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206155750850.png)]
6、再次查看,数据发送了变化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q284LXPc-1607528520397)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201206155822877.png)]
3.1.3、事务回滚操作
如果事务中,有某条sql语句执行时报错了,我们没有手动的commit,那整个事务会自动回滚
- 命令行 开启事务
start transaction;
- 插入两条数据
INSERT INTO account VALUES(NULL,‘张百万’,3000);
INSERT