MYSQL學習筆記

本身記性實在太差,有些指令三天不用就忘了,因而作個記錄省得老去百度mysql

1鏈接數據庫linux

通常狀況本地鏈接數據庫不會出現問題,大部分問題出如今遠程鏈接上,尤爲是權限問題很煩人,不過知道咋回事了也就那麼回事sql

注意:用的時候不要把尖括號也帶上了,這裏只是提醒這是個字段,省得你真寫成mysql -u<用戶名>......了數據庫

 

1.1鏈接本地數據庫ubuntu

mysql -u<用戶名> -p<密碼>windows

例:mysql -uroot -prootcentos

 

1.2鏈接其餘地方的數據庫服務器

mysql -u<用戶名> -p<密碼> -h<遠程數據庫地址> -P<端口號>工具

測試了一下,遠程數據庫地址填域名也能夠,只不過比較慢,畢竟須要域名解析學習

若是遠程地址連不上,本地地址能夠連上,先檢查防火牆是否是攔住數據庫的TCP端口了,MySQL默認3306,固然通常公司的數據庫不會用默認的

而後檢查MYSQL用戶配置,這個在下面新建用戶的時候講,另外就算不給用戶賦權限,用戶也是能夠登陸的,不過只能看見information_schema這一個庫

 

1.3還有一個是指定須要鏈接的數據庫

mysql -u<用戶名> -p<密碼> -D<數據庫名>

這個通常狀況用不到,可是若是你新建了個用戶,權限限制在某個數據庫下

並且你登陸的時候沒有指定數據庫,那麼你會發現USE <數據庫>是沒有權限的

可是操做你賦權限的那個數據庫是沒有問題的,只不過每次操做都須要帶上數據庫名

這個時候就須要在鏈接的時候帶上數據庫名

重點:鏈接mysql數據庫和當前終端用戶有關 本機root用戶登陸mysql的root用戶沒問題 可是其餘用戶沒法用root用戶登入數據庫 必須sudo才能夠

           並且linux下普通用戶用非root用戶登陸mysql修改root密碼無效 儘管顯示成功了 但依然沒法登陸 root用戶下用之前root的密碼登陸數據庫依然成功

 

2用戶操做

用戶操做是最經常使用的了,有其實在新開一個數據庫的時候須要添加用戶並分配一些權限,不建議root用戶搞開發,省得一不注意刪錯庫了

 

2.1新建用戶

CREATE USER <用戶名>@<遠程地址> IDENTIFIED BY <密碼> [WITH GRANT OPTION]

例如:CREATE 'USER DBA_BOOK'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

用戶名和密碼建議用引號擴起來,反正密碼要是不要引號擴起來是會報錯的

遠程地址能夠用*代替,表示任意地址均可以使用該用戶登陸,

mysql默認的ROOT用戶默認是隻能在本機(LOCALHOST)登陸

最後的with grant option可選,至關與設置該用戶是否爲管理員

若是設置了,那麼該用戶就能夠新建別的用戶並分配本身擁有的權限

固然下面能夠單獨設置那些權限運行他分配給別人

 

2.2添加權限

GRANT <權限> ON <數據庫名>.<表名> TO <用戶名>@<遠程地址> [WITH GRANT OPTION]

例如:GRANT ALL PRIVILEGES ON db_book.* TO 'dba_book'@'%'

權限能夠一次寫多個,用逗號分來就能夠

經常使用的包括SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,INDEX

還有些GRANT,REFERENCE,PROCESS什麼的,其餘的想不起來了

比較藍的話乾脆ALL PRIVILEGES代替全部的權限

數據庫名能夠不寫,那就表明當前數據庫,若是當前沒有選擇數據庫,那麼執行指令會報錯提示No database selected

其餘的地方和新建用戶的地方同樣

固然用戶名後面的@若是不寫的話就是給全部你寫的這個用戶名相同的用戶賦權限了

例如存在多個用戶

'dba_book'@'localhost'

'dba_book'@'192.168.1.12'

'dba_book'@'172.18.49.141'

‘dba_book'@'%'

執行GRANT ALL PRIVILEGES ON 'db_book'.* TO 'dba_book'

因而這四個用戶受影響了

另外localhost其實也是域名,不過大部分系統默認將其指向127.0.0.1,若是localhost指向的不是這個地址,那麼數據庫可能不是本地數據庫

另外精確指定遠程地址的用戶的權限的優先級大於用百分號指定遠程用戶的權限

就是說若是上面第二個用戶指定了一個INSERT權限,給第四個用戶指定了SELECT權限,那麼第二個用戶就只能插入不能查詢,其餘用戶(不包括第一個和第三個)就只能查詢而不能插入

 

2.3回收權限

REVOKE <權限> ON <數據庫名>.<表名> FROM <用戶名>@<遠程地址>

用法和賦權限同樣,再也不贅述

 

2.4刪除用戶

和刪除表同樣 DROP <用戶名>@<遠程地址>

以前用delete直接在user表刪除用戶 發現無論用 用戶依然存在 由於再添加同名用戶提示錯誤

 

3.數據導入(執行SQL腳本)

SOURCE <SQL腳本的絕對路徑>

例如:SOURCE /root/backup/20110311_localhost_db_book.sql

嘿嘿,我是單用戶系統,大家的大概都不會仍ROOT用戶下吧,雖然我用單系統用的挺嗨的,可是仍是要說,不喜歡折騰的別用ROOT用戶,搞很差就玩脫了準備重裝吧

好比你發現系統分區不夠用的時候調整了一下分區,中間出了小插曲出錯了,而後重啓發現不能引導了,而後U盤的LIVE模式啓動發現文件都丟了,

額。。。雖然和是否是用ROOT用戶沒啥關係,不過我仍是要說,由於都是淚啊,不過還好不是公司服務器,公司服務器還在用WIN2000呢

額。。。跑題了,這是病,得治,電一下。。。算了,棄療了

 

4.數據備份

若是不想學習MYSQL從刪庫到跑路的話就須要學習如何備份數據庫

最簡單的方法,複製

MYSQL的數據文件在/var/lib/mysql下,我是debian系的(包括ubuntu系列),紅帽系(包括centos)的不知道是否是也在這

直接複製粘貼

cp -a /var/lib/mysql/* /root/backup/20180528_localhost_full/

恢復的時候直接粘回原地方就行了,別忘了粘回去的先把服務停掉,最好把目標位置清空了再粘回去

固然不必定要把數據庫備份文件也仍在數據庫服務器上,否則你要是一個rm -r * 不也是玩完

我沒試過,有興趣的能夠本身試試,在虛擬機上試試就好,要在服務器上試的話先提早計劃好逃跑路線

mysql提供了個客戶端工具,mysqldump

我是這樣用的mysqldump -u<用戶名> -p<密碼> -h<數據庫地址> --databases <數據庫名>  > <備份文件的完整路徑名,包括文件名>

例如:mysqldump -udba_book -p123456 -h192.168.1.144 --databases db_book > /root/backup/20180528_192.168.1.144_db_book.sql

注意那個尖括號不要忘了,這個尖括號不是提示符,是操做系統輸出流的符號

通常和echo命令一塊兒使用

例如echo hello > demo.txt

若是不存在demo.txt這個文件,則建立這個文件而後寫入hello

若是存在demo.txt這個文件,則清空這個文件後寫入hello

還有一個就是>>,這個和前者的區別是若是存在該文件,則在文件末尾追加輸入的內容

例如在剛纔執行echo hello > demo.txt的基礎上再執行一次echo hello2 >> demo.txt

你會看到文件內容變成

hello

hello2

也就是說他會自動加一個換行符再寫入新的內容

貌似又扯遠了,不過我仍是要說,windows和linux都有這兩個命令

恢復數據的時候就用第三條數據導入的方法執行SQL文件就行了

 

5.常規操做

這裏只是作個筆記,詳細用法不寫了,有須要的請去菜鳥教程,W3SCHOOL這些地方查詢

5.1 SELECT

SELECT [DISTINCT] <選擇列> FROM <數據庫名>.<表名> WHERE <查詢條件> GROUP BY <分組列名> HAVING <分組篩選條件> ORDER BY <排序列名> [ASC/DESC]

DISTINCT用於去除重複項,

例如tb_test

|- id -|

|------|

|   1   |

|   1   |

|   1   |

|------|

就這樣的一張表,手打的,不要糾結好很差看了,反正我以爲很差看

內容僅供測試,應該沒人像我這麼無聊

SELECT DISTINCT * FROM test;

結果是

|- id -|

|------|

|   1   |

|------|

ORDER序默認升序ASC,降序用DESC

5.2 INSERT

INSERT INTO <數據庫名>.<表名> (<列名>) VALUES (<值>)

INSERT INTO <數據庫名>.<1表名> (<1列名>) SELECT (<2列名>) FROM <2表名> 。。。。。。這就和SELECT同樣了

INSERT INTO <數據庫名>.<表名> (<列名>) SELECT (<值>) FROM DUAL WHERE NOT EXISTS (SELECT * FROM <數據庫名>.<表名> WHERE <列名>=<值>)

第三個語句能夠達到插入不重複數據的目的,可是不太推薦,雖然能夠插入不重複的數據,可是明顯設置個惟一索引更方便,由於這種方法看上去執行效率都不會高,另外DUAL是一個MYSQL的臨時表,在插入數據前他會把數據先扔在這裏面再插入到目標表中

5.3 UPDATE

UPDATE <數據庫名>.<表名> SET <列名>=<值> WHERE <列名>=<值>

UPDATE <數據庫名>.<1表名> <表別名1>,<數據庫名>.<2表名> <表別名2> SET <表別名1>.<列名>=<表別名2>.<值> WHERE <表別名1>.<列名>=<表別名2>.<值>

第二個語句這樣也能夠達到複製表的目的,並且只更新表1和表2裏面都有的數據,固然依然存在效率較低的問題,1W條數據我執行了1分40秒,是否是該換電腦了

5.4 DELETE

DELETE FROM <數據庫名>.<表名> WHERE <列名>=<值>

這種方法不會重置自動增加列,須要重置自動增加列只能重建表

修改自動增加列能夠用ALTER TABLE <數據庫名>.<表名> AUTO_INCREMENT = 1;

這種方式的問題是設置的自動增加列的數不能小於等於表中存在的自動增加列的大小

好比

|-   id   -|-  name  -|

|---------|------------|

|-    1   -|-    a1    -|

|-    2   -|-    a2    -|

|-    3   -|-    a3    -|

|---------|------------|

假如此時這張表的自動增加列已經達到100了,執行上面那條語句後,自動增加列會變成4,而不是1,就是這個意思

 

6主外鍵及索引 想起來再寫吧,困了,睡會

 

20191228

刪除表的時候帶上鍊接查詢

表A

|----------------          A          --------------------|

|-    uuid    -|-    name    -|-     password     -|

|-      1      -|-        1       -|-        123456      -|

|-      2      -|-        2       -|-        123456      -|

|-      3      -|-        3       -|-        123456      -|

|---------      B        --------|

|-    uuid    -|-    name    -|

|-      1      -|-     張三     -|

|-      2      -|-     李四     -|

|-      3      -|-     王五     -|

表A中的name與表B中的uuid相關聯

假如要刪除張三的記錄

DELETE A FROM A,B WHERE A.name=B.uuid WHERE B.name='張三';

我記得查的資料上說較低版本不支持DELETE A這塊用別名

我用的是mariadb10.3.20 能夠用別名

相關文章
相關標籤/搜索