【事務操作】、【MySQL與Python交互】:(準備數據)、(SQL演練)、(創建表)、(同步表數據)、(修改表結構)、(外鍵)

一、事務操作

事務操作分兩種:自動事務(默認)、手動事務

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);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容