23.事務
1)事務:可以認為是做一件事情 需要多個SQL?要么同時成功 要么同時失敗
需求:銀行轉賬
update 你的賬戶?把你的錢減少
update 你朋友的賬戶 把他的錢增多
?
這兩個SQL不能只成功一個 要么都成功 要么都失敗
那么?我們就需要用到事務了 它可以把多個SQL放到一起執行
?
實現:顯式事務 隱式事務
區別:邊界
顯式事務:
有明顯的開始 邊界從begin開始 以commit or rollback結束
后面再寫要重新begin
?
隱式事務:
上一個事務的結束?就是上一個事務的開始
設置語句后?從你寫update?insert?delete開始就是事務的開始?
寫commit?or?rollback結束后面再寫insert等SQL命令又是新的事務開始了?
?
顯式事務?
begin;
sql1;
sql2;
sql3;
commit;(成功)?or?rollback;(恢復到原來的狀態)
?
隱式事務(沒有明顯的寫begin)
set?autocommit=0;?禁止自動提交?需要輸入commit完成事務
update emp set sal=sal-1000 where empno=1003;
update emp set sal=sal+1000 where empno=1006;
commit;or rollback;
?
set?autocommit=1;?允許自動提交?
update emp set sal=sal-1000 where empno=1003;
這時自動commit了?rollback不起作用了
每條單獨的語句都是一個事務
?
隱式事務 set autocommit=0 禁止自動提交
2)事務的特點:
原子性(automic)SQL命令要么成功都成功 要么都失敗
一致性(consistency)事務開始前和結束后是平衡的 一致的
隔離性(isolation)兩個事務之間互不干涉 各自做各自的 一個事務不能干涉另一個事務的進行
示例:
set autocommit=0;
for update 加鎖
直到commit?或?rollback?以后?解除鎖 另一個事務才可以運行成功
select * from emp for update; 等待更新
?
我們再打開一個SQL
對emp表作事務操作 發現不能操作
?
update emp set sal=sal+1000 where empno=1006;
持久性(duryblity)commit之后永遠不會發生改變了 rollback后也永遠不會發生改變了
3)for update 加鎖
只有加鎖的事務commit 或 rollback以后 釋放鎖 另一個事務才會執行成功
24.MySQL底層
客戶端:SQL命令
線程:處理多任務 處理多個連接客戶端的任務
存儲引擎:將數據存到表中 如果有索引 將會存到樹中
查詢緩存:提高查詢速度 將之前的查詢結果存到SQL中了?
SQL優化:硬件 內存 建立索引(重復少的)三范式建表?
explain:衡量SQL語句的好壞的工具
B樹和B+樹的區別-CSDN博客
25.存儲引擎
1)innodb
MySQL默認的存儲引擎 我們以前創建的表都是這種存儲引擎
特點:
a.用一個文件存儲索引和數據
b.支持事務
c.支持普通索引
d.在默認情況下 不支持全文索引(但做了處理 可以支持全文索引)
2)myisam
特點:
a.用三個文件存儲數據 說明增刪改速度慢 查詢快(限制不嚴格)
b.不支持事務
c.支持全文索引
d.數據和索引分開存儲
3)memory
4)blackhole
查看mysql數據庫的存儲地方
show variables like '%datadir%';
26.開發當中不想使用root用戶(目前為止我們一直在用root用戶)?
自己創建用戶:
CREATE USER '用戶名'@'localhost' IDENTIFIED BY '密碼';
?
CREATE USER 'jiehaowen'@'localhost' IDENTIFIED BY '123456';
創建完成后授權:操作MySQL 增刪改查.......
grant all privileges 所有權限
on *.* 哪個表哪個庫
to
?'用戶名'@'localhost'
?
grant all privileges on *.* to 'jiehaowen'@'localhost';
?
那么我們怎么使用呢 用管理員身份運行cmd 進入到下面的目錄下
cd C:\Program Files\MySQL\MySQL Server 5.7\bin
?
mysql -ujiehaowen -p123456
28.一些函數?
1)date_format 把日期轉換成符合格式的日期?'%Y-%m-%d %h:%i:%s'
創建log表
create?table?log(log_id?bigint?primary?key,log_dt?varchar(90),u_id?bigint);
?
插入數據
insert?into?log?values(1,'2024-03-04?12:12:12',1);
insert?into?log?values(2,'2024-03-04?15:13:12',1);
insert?into?log?values(3,'2024-03-05?16:13:12',2);
?
查詢2023-03-04的記錄?怎么查?
1.使用百分號%xxx%
2.如果必須用等號 應該怎么辦呢 使用相應的函數
select?*?from?log?where?dat_foemat(log_dt,'%Y-%m-%d')='2023-03-04';
?
顯示年月日
select date_format(log_dt,'%Y-%m-%d') dt,log_id,log_dt,u_id from log where date_format(log_dt,'%Y-%m-%d')='2024-03-04';
顯示年月
select?date_format(log_dt,'%Y-%m')?dt,log_id,log_dt,u_id?from?log?where?date_format(log_dt,'%Y-%m-%d')='2024-03-04';
顯示年
select?date_format(log_dt,'%Y')?dt,log_id,log_dt,u_id?from?log?where?date_format(log_dt,'%Y-%m-%d')='2024-03-04';
顯示小時
select date_format(log_dt,'%Y-%m-%d %h') dt,log_id,log_dt,u_id from log where date_format(log_dt,'%Y-%m-%d')='2024-03-04';
2)date_add()
查詢2024-03-05的用戶數/2024-03-04的用戶數?(環比)
?
select?a.user_cnt/b.user_cnt
from
?
4號用戶數
(
select?count(distinct(u_id))?user_cn?from?log?where?date_format(log_dt,'%Y-%m-%d')=date_add('2024-03-05',interval-1 day);
) a,
5號用戶數
(
select?count(distinct(u_id))?user_cn?from?log?where?date_format(log_dt,'%Y-%m-%d')='2024-03-05';
) b;
?
笛卡爾積 一般不用 結果都是一條記錄時可用
那么我們設置的這個日期是死的 怎么讓他變成活得呢 可以將兩個日期寫成一個 然后使用
date_add('2024-03-05',interval-1 day); (環比)
date_add('2024-03-05',interval-1 month); (同比)