一、事务操作
事务操作分两种:自动事务(默认)、手动事务
1、手动事务的操作流程
(1)开启事务:start transaction;
(2)进行事务操作
(3)关闭事务
提交事务:commit; 同步数据表,表示操作成功
回滚事务:rollback; 直接清空日志表,表示操作失败
2、事务操作原理:
事务开启之后,所有的操作都会临时保存到事务日志,而事务日志只有在得到commit命令才会同步到数据表,其他任何情况都会清空,比如rollback、断电、断开连接
3、回滚点
设置回滚点语法:savepoint 回滚点名字;
回到回滚点语法:rollback to 回滚点名字;
4、自动事务处理
show variables like 'autocommit';
关闭自动提交:set autocommit=off/0;
5、事务的四大特性:ACID
A:Atomic,原子性(要么都成功,要么都失败)
C:Consistency,一致性(事务操作中数据是一致的,只有同步之后数据才会发生变化)
I:Isolation,隔离性(两个事务相互隔离不受影响)
D:Durability,持久性(数据一旦提交,不可改变,不能回滚)
6、锁机制
二、MySQL与python交互
1、准备数据
(1)创建数据表
(2)插入数据
2、SQL演练
(1)SQL语句的强化
查询类型cate_name为 '超极本' 的商品名称、价格
显示商品的种类
求所有电脑产品的平均价格,并且保留两位小数
显示每种商品的平均价格
查询每种类型的商品中 最贵、最便宜、平均价、数量
查询所有价格大于平均价格的商品,并且按价格降序排序
查询每种类型中最贵的电脑信息
3、创建‘商品分类’表
(1)查询goods表中商品的种类
(2)将分组结果写入到goods_cates数据表
4、同步表数据
通过goods_cates数据表来更新goods表
5、修改表结构
(1)查看 goods 的数据表结构,会发现 cate_name 和 brand_name对应的类型为varchar但是存储的都是数字
(2)通过alter table语句修改表结构
6、外键
(1)分别在 goods_cates 和 goods_brands表中插入记录
(2)在 goods 数据表中写入任意记录
————————————代码部分————————————
-- 创建一个账户表
create table my_account(
idint primary key auto_increment,
numberchar(16)not null unique
comment'账户',
namevarchar(20)not null,
moneydecimal(10,2)default 0.0
comment'账户余额'
)charset utf8;
-- 插入数据
insert into my_accountvalues
(null,'0000000000000001','张三',
1000),
(null,'0000000000000002','李四',
2000);
-- 张三转账1000元给李四
update my_accountset money=money
-1000 where id=1;
-- 事务安全
-- 开启事务
starttransaction;
-- 事务操作:1、李四账户减少
update my_accountset money=money
-1000 where id=2;
-- 事务操作:2、张三账户增加
update my_accountset money=money
+1000 where id=1;
-- 提交事务
commit;
-- 回滚点操作
-- 开启事务
starttransaction;
-- 事务处理1:张三发工资了,加钱
update my_accountset money=money
+10000 where id=1;
-- 设置回滚点
savepoint sp1;
-- 银行扣税
update my_accountset money=money
-10000*0.05 where id=2;-- 错误
-- 回滚到回滚点
rollback to sp1;
-- 继续操作
update my_accountset money=
money-10000*0.05 where id=1;
-- 查看结果
select *from my_account;
-- 提交结果
commit;
-- 显示系统变量autocommit(模糊查询)
show variableslike 'autocommit';
-- 关闭事务自动提交
set autocommit=0;
-- 给李四发工资
update my_accountset money=money
+10000 where id=2;
commit;
update my_accountset money=money-10000*0.05 where id=2;
-- 事务的隔离性
starttransaction;
-- 给张三返税,返500块钱
update my_accountset money=money+500 where id=1;
select *from my_account;
-- 另外窗口开启事务
starttransaction;
-- 李四淘宝花了500
update my_accountset money=money-500where id=2;
select *from my_account;
commit;
-- 回到张三窗口,事务回滚
rollback;
select *from my_account;-- 两边一致
-- 锁机制
starttransaction;
-- 使用非索引字段(name),行锁自动上升为表锁
update my_accountset money=money+500 where name='张三';
update my_accountset money=money+1000 where id=2;
-- SQL演练
-- 查询类型cate_name为'超级本'的商品名称、价格
select name,pricefrom goodswhere cate_name ='超级本';
select nameas 商品名称,priceas 商品价格from goodswhere cate_name='超级本';
-- 显示商品的种类
select cate_namefrom goods;
select distinct cate_namefrom goods;
select cate_namefrom goodsgroup by cate_name;
select cate_name,group_concat(name)from goodsgroup by cate_name;
-- 求所有电脑产品的平均价格,并且保留两位小数
select round(avg(price),2)from goods;
-- 显示每种商品的平均价格
select cate_name,avg(price)from goodsgroup by cate_name;
-- 查询每种类型的商品中 最贵、最便宜、平均价、数量
select cate_name,max(price),min(price),avg(price),count(*)from goodsgroup by cate_name;
-- 查询所有价格大于平均价格的商品,并且按价格降序排序
select avg(price)from goods;
select *from goodswhere price > (select avg(price)from goods)order by pricedesc;
-- 查询每种类型中最贵的电脑信息
select cate_name,max(price)from goodsgroup by cate_name;
select *from goods;
-- 查询每种类型中最贵的电脑信息
select *from goods
inner join
(
select
cate_name,
max(price)as max_price,
min(price)as min_price,
avg(price)as avg_price,
count(*)from goodsgroup by cate_name
)as goods_new_info
on goods.cate_name=goods_new_info.cate_nameand goods.price=goods_new_info.max_price;
select g_new.cate_name,g.name,g.pricefrom (
select cate_name,max(price)as
max_pricefrom goodsgroup by
cate_name
)as g_newleft join goodsas g
on g_new.cate_name=g.cate_name
and g_new.max_price = g.priceorder by g_new.cate_name;
insert into goods
values(0,'东哥牌电脑','笔记本','老王','4999',default,default);
-- 创建商品分类表
create table ifnot exists goods_cates(
idint unsignedprimary key auto_increment,
namevarchar(40)not null);
show tables;
-- 查询goods表中商品的种类
select cate_namefrom goodsgroup by cate_name;
-- 拆表
-- 将分组结果写入到goods_cates数据表
insert into goods_cates (name)
select cate_namefrom goodsgroup by cate_name;
update goodsset cate_name=401 where cate_name='电脑'
-- 同步表数据
-- 通过goods_cates数据表来更新goods表
update goodsas ginner join goods_catesas con g.cate_name=c.nameset g.cate_name=c.id;
-- 插入类别
insert into goods_cates(name)
values('路由器'),('交换机'),('网卡');
-- 插入商品
insert into goods(name,cate_id,brand_name,price)
values('LaserJet Pro P1606dn
黑白激光打印机',12,4,'1849');
-- 通过alter table语句修改表结构
alter table goods
change cate_name cate_idint
unsignednot null;
delete from goodswhere id=23;
-- 添加外键
alter table goodsadd foreign
key (cate_id)references
goods_cates(id);