MySQL數據庫-筆記06【SQL的4種連接查詢、事務】

學習地址:一天學會 MySQL 數據庫https://www.bilibili.com/video/BV1Vt411z7wy

 

MySQL安裝教程:https://blog.csdn.net/weixin_44949135/article/details/106661080

  1. 🚀01-03:【筆記01】https://blog.csdn.net/weixin_44949135/article/details/105505630
  2. 🚀04-15:【筆記02】https://blog.csdn.net/weixin_44949135/article/details/106686808
  3. 🚀16-21:【筆記03】https://blog.csdn.net/weixin_44949135/article/details/106694730
  4. 🚀22-29:【筆記04】https://blog.csdn.net/weixin_44949135/article/details/106728980
  5. 🚀30-54:【筆記05】https://blog.csdn.net/weixin_44949135/article/details/106731538
  6. 🚀55-64:【筆記06】https://blog.csdn.net/weixin_44949135/article/details/106735501


MySQL專欄:https://blog.csdn.net/weixin_44949135/category_10101442.html

目   錄

55-連接查詢-內連接、左連接、右連接

1、內連接、外連接【概念】

2、創建2個表

2.1、person表、card表

2.2、添加數據

3、內連接、左外連接、右外連接、全外連接

3.1、內連接【inner join查詢、join查詢】

3.2、左外連接【left join、left outer join】

3.3、右外連接【right join、right outer join】

3.4、全外連接【full join】

56-連接查詢-mysql不支持full join

1、圖解

1、內連接【兩個表的交集】

2、左外連接

3、右外連接

4、全外連接

2、舉例

57-事務-事務用來做什麼?

58-事務-如何控制事務commit_rollback

1、MySQL中如何控制事務?

2、默認事務開啓的作用。

3、具體實例演示

3.1、建庫、建表、插入數據

3.2、rollback;(事務回滾、回滾數據)

3.3、設置mysql自動提交爲false!

3.4、commit;(手動提交數據-不可撤銷-持久性)

3.5、轉賬操作

59-事務-手動開啓事務begin_ start_transaction

1、恢復默認(自動提交)

2、手動開啓事務

2.1、事務回滾失效

2.2、手動開啓事務(1)-[ begin; ]

2.3、手動開啓事務(2)-[ start transaction; ]

2.4、[ start transaction; + commit; ]

60-事務-ACID特徵與使用

1、事務的四大特徵

2、事務開啓

3、事務手動提交

4、事務手動回滾

60-事務隔離性-髒讀

1、事物的隔離性

2、如何查看數據庫的隔離級別?

2.1、MySQL 8.0

2.2、MySQL 5.x

3、如何修改隔離級別?

62-事務隔離性-不可重複讀

63-事務隔離性-幻讀

1、repeatable read;【可以重複讀】

2、在 REPEATABLE-READ 隔離級別下,又會出現什麼問題?

64-隔離級別-串行化-SERIALIZABLE

1、修改 隔離級別 爲 串行化

2、性能比較


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、事務開啓

  1. 修改默認提交:set autocommit = 0;
  2. begin;
  3. start transaction;

3、事務手動提交

commit;

4、事務手動回滾

rollback;

60-事務隔離性-髒讀

1、事物的隔離性

  1. read uncommitted;   讀未提交的
  2. read committed;       讀已經提交的
  3. repeatable read;       可以重複讀
  4. 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。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章