一、事務操作
事務操作分兩種:自動事務(默認)、手動事務
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);