MySQL備忘筆記(二)

零、VsCode操作MySQL

大贊?。?!vscode果然還是一如既往的優(yōu)秀,沒(méi)有讓我失望~

1. windows下的插件連接

0、解決密碼認(rèn)證方式問(wèn)題

8.0以上版本特殊的密碼認(rèn)證方式會(huì)導(dǎo)致登錄失敗,解決方案如下:

控制臺(tái)輸入:

alter user 'root'@'localhost' identified with mysql_native_password by 'root';
flush privileges;

1、下載下列插件

2、在左側(cè)的資源管理器中找到MySQL入口,點(diǎn)擊+

host輸入MySQL服務(wù)器名或ip (根據(jù)實(shí)際情況輸入)

(本地服務(wù)器就輸入localhost或者127.0.0.1)

user是輸入數(shù)據(jù)庫(kù)用戶名(根據(jù)實(shí)際情況輸入)

password是數(shù)據(jù)庫(kù)密碼(根據(jù)實(shí)際情況輸入)

port是數(shù)據(jù)庫(kù)端口號(hào) 默認(rèn)3306(根據(jù)實(shí)際情況輸入)

登陸成功:

3、建立新的query文件

4、這種結(jié)構(gòu)下軟件分窗就顯得非常實(shí)用了

5、執(zhí)行query語(yǔ)句快捷鍵:

執(zhí)行所有語(yǔ)句:不框選語(yǔ)句情況下按F9

執(zhí)行單個(gè)語(yǔ)句:選擇語(yǔ)句情況下按F9

6、執(zhí)行代碼格式化:alt +shift +F

一、數(shù)據(jù)庫(kù)的設(shè)計(jì)

1、多表間的關(guān)系

①、一對(duì)一

例如:人和身份證的關(guān)系

實(shí)現(xiàn)方式:在任意一方添加唯一外鍵指向另一方主鍵。

image

②、一對(duì)多/多對(duì)一

例如:一個(gè)部門有多個(gè)員工,一個(gè)員工只有一個(gè)部門

實(shí)現(xiàn)方式:

在多的一方建立外鍵并指向一的一方的主鍵

image

③、多對(duì)多

例如:一個(gè)學(xué)生有多門課程,一門課程有多個(gè)學(xué)生

實(shí)現(xiàn)方式:多對(duì)多需要借助第三張中間表,中間表至少包含兩個(gè)字段,這兩個(gè)字段作為作為第三張表的外鍵,分別指向兩張表的主鍵

image

2、數(shù)據(jù)設(shè)計(jì)范式

設(shè)計(jì)數(shù)據(jù)庫(kù)需要遵循的規(guī)范

六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、

巴斯科特范式(BCNF)、第四范式(4NF)、第五范式(5NF)

要遵循后面的范式,要先遵循前面的范式
我們一般只需要滿足前三個(gè)范式就可以了

關(guān)于范式. 請(qǐng)參考如下視頻:
https://www.bilibili.com/video/BV1nx411G7NX?p=86
https://www.bilibili.com/video/BV1p7411A7Lp?p=16
①、第一范式(1NF):

每一列都是不可分割的基本數(shù)據(jù)項(xiàng),且必須有主鍵

意思是列不可以嵌套及混合

只按照第一范式設(shè)計(jì)當(dāng)然不行,問(wèn)題如下:

②、第二范式(2NF):

解決非主屬性部分依賴于主關(guān)鍵字。(在1NF基礎(chǔ)上消除非主屬性對(duì)主碼的部份依賴)

第二范式要求所有非主鍵字段完全依賴主鍵, 不能部分依賴

幾個(gè)概念:

a:函數(shù)依賴

A-->B

在一張表中,如果通過(guò)A屬性(屬性組)的值可以唯一確定B屬性的值,則B依賴于A

如:

學(xué)號(hào)-->姓名 學(xué)號(hào)可以唯一確定姓名 姓名依賴于學(xué)號(hào)

學(xué)號(hào) !-->分?jǐn)?shù) 只靠學(xué)號(hào)無(wú)法確定分?jǐn)?shù) 分?jǐn)?shù)不依賴于學(xué)號(hào)

(學(xué)號(hào),課程名稱)-->分?jǐn)?shù) (學(xué)號(hào),課程名稱)可以唯一確定分?jǐn)?shù),分?jǐn)?shù)依賴于(學(xué)號(hào),課程名稱)

b:完全函數(shù)依賴

A-->B

在一張表中,如果通過(guò)A的屬性組中的所有值可以唯一確定B屬性的值,則B完全依賴于A

例如:

(學(xué)號(hào),課程名稱)-->分?jǐn)?shù) (學(xué)號(hào),課程名稱)可以唯一確定分?jǐn)?shù),分?jǐn)?shù)依賴于(學(xué)號(hào),課程名稱)

c: 部分函數(shù)依賴

A-->B

在一張表中,如果通過(guò)A的屬性組中的部分值可以唯一確定B屬性的值,則B部分依賴于A

例如:

(學(xué)號(hào),課程名稱)-->姓名 (學(xué)號(hào),)可以唯一確定姓名,姓名部分依賴于(學(xué)號(hào),課程名稱)

d:傳遞函數(shù)依賴

A-->B-->C

在一張表中,如果通過(guò)A屬性(屬性組)的值可以唯一確定B屬性的值,通過(guò)B屬性(屬性組)的值可以唯一確定C屬性的值,則C傳遞函數(shù)依賴于A

例如:學(xué)號(hào)-->系名-->系主任

e:碼

在一張表中,如果一個(gè)表中的一個(gè)屬性(屬性組)被其他所有屬性完全依賴,則稱這個(gè)屬性(屬性組)為該表的碼。

f:主屬性

碼中的屬性

g:非主屬性

非碼中的屬性

現(xiàn)在我們來(lái)消除例子中的部分依賴:

拆分表格后,數(shù)據(jù)冗余問(wèn)題解決了,但還有2、3問(wèn)題

image

③、第三范式(3NF):

一個(gè)數(shù)據(jù)庫(kù)表中不包含已在其它表中已包含的非主關(guān)鍵字信息 (在2NF基礎(chǔ)上消除傳遞依賴)

還應(yīng)該添加課程表

二、數(shù)據(jù)庫(kù)備份還原

1、命令行

①備份

mysqldump -u用戶名 -p密碼 數(shù)據(jù)庫(kù)名 > 保存的路徑

②還原

1)登錄數(shù)據(jù)庫(kù)服務(wù)器

2)創(chuàng)建數(shù)據(jù)庫(kù)

3)使用數(shù)據(jù)庫(kù)

4)執(zhí)行: source 文件路徑。

2.圖形化

①、備份

② 還原

三、多表查詢

1、查詢笛卡爾積

select * from 表名1,表名2;

這樣查詢出來(lái)的結(jié)果是笛卡爾積(A和B的所有組合可能性的集合)。

這樣的結(jié)果很多無(wú)用數(shù)據(jù)。

2、多表查詢的分類

①、內(nèi)連接查詢 //查詢兩表交集

a)隱式內(nèi)連接

select 表1.列名,表2.列名 from 表1 別名1,表2 別名2 where 條件;

b)顯式內(nèi)連接

select 字段列表 from 表名1 join 表2 on 條件;

注意:要用內(nèi)連接查詢需要確定:

a)確定從哪些表中查數(shù)據(jù)

b)條件是什么(判斷有效數(shù)據(jù))

c)確定需要查詢哪些字段

②、外鏈接查詢

a)左外鏈接 //查詢左表所有記錄及交集

select 字段列表 from 表1 left join 表2 on 條件;

例:假設(shè)有一位新員工還沒(méi)有部門

如果查內(nèi)連接交集就查不到了,查左連接就可以查到

b)右外鏈接 //查詢右表所有記錄及交集

select 字段列表 from 表1 right join 表2 on 條件;

例:

③、子查詢

子查詢就是查詢中嵌套查詢

a)子查詢情況1:子查詢的結(jié)果是單行單列的,此時(shí)子查詢可以作為條件,使用運(yùn)算符進(jìn)行計(jì)算。

如:

b)子查詢情況2:查詢的結(jié)果是多行單列的 可以使用運(yùn)算符in

例如:

c)子查詢情況2:查詢的結(jié)果是多行多列的 把子查詢當(dāng)作虛擬表供查詢

四、事務(wù)

1、事務(wù)

①、概念

如果一個(gè)包含多個(gè)步驟的業(yè)務(wù)操作,被事務(wù)管理,那么這些操作要么同時(shí)成功,要么同時(shí)失敗。

A給B要?jiǎng)濆X,A的賬戶-500元,B的賬戶就要+500元,這兩個(gè)update語(yǔ)句必須作為一個(gè)整體來(lái)執(zhí)行,不然A扣錢了,B沒(méi)有加錢這種情況很難處理。

②、操作

a)開(kāi)啟手動(dòng)事務(wù):start transaction

b)提交:commit

c)回滾:rollback

注意:1.即使沒(méi)有提交,你在本query最后查詢數(shù)據(jù)也會(huì)發(fā)現(xiàn)變化了,但當(dāng)你退出軟件重啟數(shù)據(jù)庫(kù)發(fā)現(xiàn)沒(méi)有改變,你看到的只是臨時(shí)數(shù)據(jù)。只有commit后才是真正的數(shù)據(jù)。上圖中的數(shù)據(jù)是我重啟后的數(shù)據(jù)

2.commit和rollback只能執(zhí)行一個(gè),需要類似于PHP類的后臺(tái)程序做判斷,數(shù)據(jù)庫(kù)本身只提供語(yǔ)句,不能再query中寫(xiě)判斷。

③、mysql不開(kāi)啟手動(dòng)提交事務(wù)時(shí),是默認(rèn)自動(dòng)提交的,每條語(yǔ)句都會(huì)提交一次。

修改自動(dòng)提交:

a)查看事務(wù)的默認(rèn)提交方式:

SELECT @@autocommit;

b)修改為手動(dòng)提交

set @@autocommit=0;

c)如果改為手動(dòng)提交 必須commit才會(huì)提交數(shù)據(jù)

2、事務(wù)的四大特征

a)原子性:不可分割的最小操作單位,要么同時(shí)成功,要么同時(shí)失敗

b)持久性:當(dāng)數(shù)據(jù)提交或回滾時(shí),會(huì)持久化的改變數(shù)據(jù)

c)隔離性:多個(gè)事務(wù)之間項(xiàng)目獨(dú)立

d)一致性:事務(wù)操作前后總量不變。

3、事務(wù)的隔離級(jí)別

事務(wù)有隔離性,但是多個(gè)事務(wù)同時(shí)操作同一批數(shù)據(jù),會(huì)引發(fā)一些問(wèn)題,設(shè)置不同的隔離級(jí)別可以解決這些問(wèn)題

引發(fā)的問(wèn)題:

a)臟讀:一個(gè)事務(wù)讀取到另一個(gè)事務(wù)沒(méi)有提交的數(shù)據(jù)

b)虛讀(不可重復(fù)讀):同一個(gè)事務(wù)中兩次讀取到的同一數(shù)據(jù)不一樣

c)幻讀:一個(gè)事務(wù)操作數(shù)據(jù)表中所有數(shù)據(jù),另一個(gè)事務(wù)添加數(shù)據(jù),則第一個(gè)事務(wù)查詢不到自己的修改(MySQL中不存在)

隔離級(jí)別:

a)read uncommited 讀未提交

此級(jí)別下,可出現(xiàn):臟讀、虛讀、幻讀

b)read commited 讀已提交

此級(jí)別下,可出現(xiàn):虛讀、幻讀

c)repeatable read 可重復(fù)讀 (MySQL默認(rèn))

此級(jí)別下,可出現(xiàn) 幻讀

d)serializable:串行化

此級(jí)別下,無(wú)問(wèn)題。但效率最低。

查詢隔離級(jí)別:

select @@tx_isolation;   /*mysql 8.0以后棄用*/
select @@transaction_isolation;/*mysql 8.0以后用*/

設(shè)置隔離級(jí)別:

set global transaction isolation level read committed;

注意:設(shè)置后需要重啟生效,上圖中我已經(jīng)重啟。

五、DCL

DCL用來(lái)管理數(shù)據(jù)庫(kù)用戶、授權(quán)

1、管理用戶

①、添加用戶:

create  user '用戶名'@'主機(jī)名' identified by "密碼";  /*注意,必須用單引號(hào)!*/

②、刪除用戶:

drop user'用戶名'@'主機(jī)名';

③、修改用戶密碼:(8.0以后新方法)

alter user 'root'@'localhost'IDENTIFIED BY 'MyNewPass';
flush privileges;

④、查詢用戶:

a)切換到mysql數(shù)據(jù)庫(kù)

我不知道為什么workbench里不顯示這個(gè)數(shù)據(jù)庫(kù),但他真的有

b)查詢user表

use mysql;
show databases;
select * from user;

⑤、忘記root密碼怎么辦?

1.cmd執(zhí)行(管理員權(quán)限) :net stop MySQL

2.無(wú)驗(yàn)證方式啟動(dòng)mysql服務(wù):mysql --skip-grant-tables

3.打開(kāi)新的cmd窗口,輸入mysql 直接回車登錄成功

4.再新cmd中使用mysql數(shù)據(jù)庫(kù) :use mysql;

5.修改root密碼。

6.關(guān)閉所有cmd

7.打開(kāi)任務(wù)管理器 結(jié)束 mysqld.exe 這個(gè)進(jìn)程

8.重啟服務(wù),新密碼登錄

2、權(quán)限管理

①、查詢權(quán)限

show grants for '用戶名'@'服務(wù)器';

<figcaption class="Image-caption" style="margin-top: 0.66667em; padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">這個(gè)用戶除了登錄沒(méi)有任何權(quán)限</figcaption>

查詢r(jià)oot發(fā)現(xiàn)他的權(quán)限無(wú)限大

②、授予權(quán)限

grant select on 數(shù)據(jù)庫(kù).表名 to '用戶名'@'主機(jī)名';

授權(quán)后只有這張表他可以看

授予所有權(quán)限

grant ALL on *.* to '用戶名'@'主機(jī)名';

常用權(quán)限有:

show privileges;顯示結(jié)果---(權(quán)限操作分類)
    all(謹(jǐn)慎,包含管理數(shù)據(jù)庫(kù)的權(quán)限)    授予某個(gè)級(jí)別特定的所有權(quán)限,除了grant option權(quán)限:表示自己有的權(quán)限授權(quán)給別人
    alter   允許使用alter table語(yǔ)句        級(jí)別:global、database、table(1、2、3)
    alter routine  允許修改或刪除存儲(chǔ)例程  級(jí)別:global、database、table(1、2、3)
    create   允許創(chuàng)建數(shù)據(jù)庫(kù)和表
    create tablespace   允許創(chuàng)建、修改、刪除表空間和日志文件組  級(jí)別:global
    create temporary tablespace  允許創(chuàng)建臨時(shí)表   級(jí)別:global、database
    create user   允許使用create user、drop user、rename user、revoke all privileges語(yǔ)句    級(jí)別:global
    create viwe   允許創(chuàng)建和修改視圖
    shutdown   允許使用mysqldmin shutdown    級(jí)別:global
    delete  允許刪除表中的行
    drop    允許刪除數(shù)據(jù)庫(kù)、表、視圖
    event   允許使用事件   mysql的時(shí)間調(diào)度-linux下的crontab
    execute 允許用戶執(zhí)行存儲(chǔ)過(guò)程
    file    允許用戶使用load data infile讀寫(xiě)文件  級(jí)別:global
    grant option  允許把自己有的權(quán)限授權(quán)給其他用戶或者從其他用戶那里廢除  級(jí)別:global、database、table、procedure、proxy
    index    允許創(chuàng)建或刪除索引
    insert   允許向表中插入行
    lock tables 允許使用lock tables語(yǔ)句   級(jí)別:global、database
    process 允許使用show processlist語(yǔ)句查看正在運(yùn)行的進(jìn)程  級(jí)別:global

    proxy   允許用戶代理  級(jí)別
    references  允許使用外鍵    級(jí)別:global、database、table、column
    reload  允許使用flush語(yǔ)句  級(jí)別:global
    select  允許查詢表        級(jí)別:global、database、table、column
    show databases 允許使用show databases語(yǔ)句  級(jí)別:global
    show view 允許使用show create view語(yǔ)句     級(jí)別:global
    super  允許使用其他管理語(yǔ)句
    trigger   允許觸發(fā)器操作
    update  允許更新表中的行      級(jí)別:global、database、table、column
    usage   "no privileges"的同義詞

③、撤銷權(quán)限

revoke select on 數(shù)據(jù)庫(kù).表名 from '用戶名'@'主機(jī)名';
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容