學習地址:一天學會 MySQL 數據庫【https://www.bilibili.com/video/BV1Vt411z7wy】
MySQL安裝教程:https://blog.csdn.net/weixin_44949135/article/details/106661080
- 🚀01-03:【筆記01】https://blog.csdn.net/weixin_44949135/article/details/105505630
- 🚀04-15:【筆記02】https://blog.csdn.net/weixin_44949135/article/details/106686808
- 🚀16-21:【筆記03】https://blog.csdn.net/weixin_44949135/article/details/106694730
- 🚀22-29:【筆記04】https://blog.csdn.net/weixin_44949135/article/details/106728980
- 🚀30-54:【筆記05】https://blog.csdn.net/weixin_44949135/article/details/106731538
- 🚀55-64:【筆記06】https://blog.csdn.net/weixin_44949135/article/details/106735501
MySQL專欄:https://blog.csdn.net/weixin_44949135/category_10101442.html
目 錄
3.2、左外連接【left join、left outer join】
3.3、右外連接【right join、right outer join】
59-事務-手動開啓事務begin_ start_transaction
2.3、手動開啓事務(2)-[ start transaction; ]
2.4、[ start transaction; + commit; ]
2、在 REPEATABLE-READ 隔離級別下,又會出現什麼問題?
55-連接查詢-內連接、左連接、右連接
1、內連接、外連接【概念】
內連接【inner join 或者 join】
外連接
左連接 left join 或者 left outer join
右連接 right join 或 righ outer join
完全外連接 full join 或者 full outer join
2、創建2個表
2.1、person表、card表
沒有 創建 外鍵 !!!
/* 創建數據庫 */
create databases testJoin;
/* 創建2個表 */
-- 1、person表
create table person(
id int,
name varchar(20),
cardId int
);
-- 2、card表
create table card(
id int,
name varchar(20)
);
2.2、添加數據
insert into card values(1, '飯卡');
insert into card values(2, '建行卡');
insert into card values(3, '農行卡');
insert into card values(4, '工商卡');
insert into card values(5, '郵政卡');
select * from card;
/* ------ 沒有創建外鍵!!! ------ */
insert into person values(1, '霸刀宋壹', 1);
insert into person values(2, '暴走丁二', 3);
insert into person values(3, '忍者張三', 6);
select * from person;
3、內連接、左外連接、右外連接、全外連接
3.1、內連接【inner join查詢、join查詢】
內聯查詢,其實就是兩張表中的數據,通過某個字段相等,查詢出相關記錄數據。
select * from person inner join card on person.cardId = card.id;
select * from person join card on person.cardId = card.id;
3.2、左外連接【left join、left outer join】
左外連接,會把左邊表裏面的所有數據取出來,而右邊表中的數據,如果有相等的,就顯示出來;
如果沒有,就會補NULL。
select * from person left join card on person.cardId = card.id;
select * from person left outer join card on person.cardId = card.id;
3.3、右外連接【right join、right outer join】
右外連接,會把右邊表裏面的所有數據取出來,而左邊表中的數據,如果有相等的,就顯示出來;
如果沒有,就會補NULL。
select * from person right join card on person.cardId = card.id;
select * from person right outer join card on person.cardId = card.id;
3.4、全外連接【full join】
select * from person full join card on person.cardId = card.id; /* MySQL 不支持 full join */
select * from person right join card on person.cardId = card.id
union
select * from person left join card on person.cardId = card.id;
56-連接查詢-mysql不支持full join
連接的好處:不用創建外鍵;可以根據連接表的某字段相等,求 交集、並集。
1、圖解
1、內連接【兩個表的交集】
2、左外連接
3、右外連接
4、全外連接
2、舉例
select * from person full join card on person.cardId = card.id; /* MySQL 不支持 full join */
select * from person right join card on person.cardId = card.id
union
select * from person left join card on person.cardId = card.id;
57-事務-事務用來做什麼?
transcation
mysql中,事務其實是一個最小的不可分割的工作單元。
事務能夠保證一個業務的完整性。
比如:銀行轉賬
a ---> -100
update user set money = money - 100 where name = 'a';
b ---> +100
update user set money = money + 100 where name = 'b';
實際的程序中,如果只有一條語句執行成功了,而另一條語句沒有執行成功 ==> 出現的數據前後不一致!
多條sql語句,可能會有要麼同時成功,要麼同時失敗的要求!
58-事務-如何控制事務commit_rollback
1、MySQL中如何控制事務?
mysql默認是開啓事務的。
autocommit(自動提交):表示 事務 開啓!
select @@autocommit;
2、默認事務開啓的作用。
當我們去執行一個sql語句的時候,效果會立即體現出來,且不能回滾。
事務回滾:撤銷sql語句執行效果!
3、具體實例演示
3.1、建庫、建表、插入數據
create database bank;
use bank;
create table user(
id int primary key,
name varchar(20),
money int
);
insert into user values(1, 'a', 1000);
select * from user;
3.2、rollback;(事務回滾、回滾數據)
rollback;
select * from user;
3.3、設置mysql自動提交爲false!
set autocommit = 0; /* 關閉 MySQL的自動提交(commit) */
select @@autocommit;
insert into user values(2, 'b', 1000);
rollback;
虛擬數據 非真實數據 未提交!!!
3.4、commit;(手動提交數據-不可撤銷-持久性)
自動提交:@autocommit = 1;
手動提交:commit;【提交後,不可撤銷!】
事務回滾:rollback;
3.5、轉賬操作
/* a ---> -100 */
update user set money = money - 100 where name = 'a';
/* b ---> +100 */
update user set money = money + 100 where name = 'b';
rollback; /* 事務提供返回的機會!可以設置手動commit */
59-事務-手動開啓事務begin_ start_transaction
1、恢復默認(自動提交)
set autocommit = 1;
select @@autocommit;
2、手動開啓事務
begin;
start transaction;
2.1、事務回滾失效
2.2、手動開啓事務(1)-[ begin; ]
begin;
update user set money = money - 100 where name = 'a';
update user set money = money + 100 where name = 'b';
2.3、手動開啓事務(2)-[ start transaction; ]
start transaction;
update user set money = money - 100 where name = 'a';
update user set money = money + 100 where name = 'b';
2.4、[ start transaction; + commit; ]
start transaction;
update user set money = money - 100 where name = 'a';
update user set money = money + 100 where name = 'b';
commit;
select * from user;
rollback;
事務開啓之後,一旦commit(提交),就不可以回滾!(也就是當前的這個事務在提交的時候就結束了!)
60-事務-ACID特徵與使用
1、事務的四大特徵
A 原子性:事務是最小的單位,不可以再分割。
C 一致性:事務要求,同一事務中的sql語句,必須保證“同時成功”或者“同時失敗”。
I 隔離性:事務1和事務2之間是具有隔離性的。
D 持久性:事務一旦結束(commit, rollback) ,就不可以返回。
2、事務開啓
- 修改默認提交:set autocommit = 0;
- begin;
- start transaction;
3、事務手動提交
commit;
4、事務手動回滾
rollback;
60-事務隔離性-髒讀
1、事物的隔離性
- read uncommitted; 讀未提交的
- read committed; 讀已經提交的
- repeatable read; 可以重複讀
- serializable; 串行化
如果有事務a,和事務b,
a事務對數據進行操作,在操作的過程中,事務沒有被提交,但是b可以看見a操作的結果。
/* bank數據庫 user數據表 */
insert into user values(3, '小名', 1000);
insert into user values(4, '淘寶店', 1000);
2、如何查看數據庫的隔離級別?
2.1、MySQL 8.0
select @@global.transaction_isolation; /* 系統級別 */
select @@transaction_isolation; /* 會話級別 */
2.2、MySQL 5.x
select @@global.tx_isolation;
3、如何修改隔離級別?
set transaction isolation level read uncommitted;
select @@global.transaction_isolation; /* MySQL默認隔離級別 REPEATABLE-READ */
set global transaction isolation level read uncommitted;
select @@global.transaction_isolation;
轉賬:小明在淘寶店買鞋子!(800塊錢)
小明 -> 成都 ATM
淘寶店 -> 廣州 ATM
start transaction;
update user set money = money - 800 where name = '小名';
update user set money = money + 800 where name = '淘寶店';
select * from user;
小名:給淘寶店打電話,說你去查一下,是不是錢到賬了?
淘寶店在廣州查賬!
淘寶店:發貨、晚上請女朋友喫好喫的、消費1800。
小明 -> 成都 rollback;淘寶店:--> 結賬的時候發現錢不夠!!!
如果兩個不同的地方,都在進行操作,如果事務a開啓之後,他的數據可以被其他事務讀取到。
這樣就會出現 髒讀!
髒讀:一個事務讀到了另外一個事務沒有提交的數據,就叫做 髒讀。
實際開發是不允許髒讀出現的。
62-事務隔離性-不可重複讀
select @@global.transaction_isolation;
set global transaction isolation level read committed;
select @@global.transaction_isolation; /* 修改 隔離級別 爲 READ-COMMITTED */
63-事務隔離性-幻讀
1、repeatable read;【可以重複讀】
select @@global.transaction_isolation;
set global transaction isolation level repeatable read;
select @@global.transaction_isolation;
2、在 REPEATABLE-READ 隔離級別下,又會出現什麼問題?
事務a和事務b 同時 操作一張表,事務a提交的數據,也不能被事務b讀到,就可以造成幻讀。
64-隔離級別-串行化-SERIALIZABLE
1、修改 隔離級別 爲 串行化
select @@global.transaction_isolation;
set global transaction isolation level serializable;
超時!!!【當user表被另外一個事務操作的時候,其他事務裏面的寫操作 是 不可以進行的!】
2、性能比較
串行化問題:性能特差!!!
性能比較:READ-UNCOMMITTED > READ-COMMITTED > REPEATABLE-READ > SERIALIZABLE;
隔離級別越高,性能越差!!!
MySQL默認隔離級別 是 REPEATABLE-READ。