word網(wǎng)站的鏈接怎么做站長(zhǎng)推廣網(wǎng)
MySQL:庫(kù)表操作
- 庫(kù)操作
- 查看
- 創(chuàng)建
- 字符編碼集
- 刪除
- 修改
- 備份
- 表操作
- 創(chuàng)建
- 查看
- 刪除
- 修改
庫(kù)操作
查看
- 查看存在哪些數(shù)據(jù)庫(kù):
show databases;
示例:
- 查看自己當(dāng)前處于哪一個(gè)數(shù)據(jù)庫(kù):
select database();
示例:
此處由于我不處于任何一個(gè)數(shù)據(jù)庫(kù)中,此處值為NULL
- 查看當(dāng)前有哪些用戶連接到了
MySQL
:
show processlist;
示例:
創(chuàng)建
- 創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)
語(yǔ)法:
create database [if not exists] 數(shù)據(jù)庫(kù)名;
[if not exists]
:如果數(shù)據(jù)庫(kù)存在,就不創(chuàng)建該數(shù)據(jù)庫(kù)。
示例:
此時(shí)就創(chuàng)建了blog_db
數(shù)據(jù)庫(kù),可以通過(guò)show databases
查看。
一個(gè)數(shù)據(jù)庫(kù),對(duì)操作系統(tǒng)而言,本質(zhì)就是一個(gè)目錄,在我的ubuntu
主機(jī)下,數(shù)據(jù)庫(kù)存儲(chǔ)在了/var/lib/mysql
目錄下,這個(gè)路徑會(huì)因?yàn)?code>MySQL版本以及操作系統(tǒng)而不同。
此時(shí)我的/var/lib/mysql
目錄下,也同步出現(xiàn)了blog_db
目錄:
字符編碼集
在MySQL
中,數(shù)據(jù)庫(kù)有兩種字符編碼集合:
字符集
:字符存儲(chǔ)時(shí),采用的編碼方式
校驗(yàn)集
:字符讀取時(shí),采用的編碼方式
查看系統(tǒng)支持的
字符集
:
show charset;
示例:
- 查看系統(tǒng)支持的
校驗(yàn)集
:
show collation;
示例:
此時(shí)系統(tǒng)就列出了支持的各種集合,比如utf8
。
可以在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),指定使用的字符集與校驗(yàn)集
- 指定
字符集
:
create database [if not exists] 數(shù)據(jù)庫(kù)名 charset=xxx;
create database [if not exists] 數(shù)據(jù)庫(kù)名 character set xxx;
以上兩種方式,都可以指定字符集為xxx
- 指定
校驗(yàn)集
:
create database [if not exists] 數(shù)據(jù)庫(kù)名 collate xxx;
示例:
執(zhí)行create database db_1 charset=utf8 collate utf8_general_ci
:
該指令創(chuàng)建了數(shù)據(jù)庫(kù)db_1
,并指定字符集
為utf8
,校驗(yàn)集
為utf8_general_ci
。
在數(shù)據(jù)庫(kù)對(duì)應(yīng)的目錄中,會(huì)存在一個(gè)文件dp.opt
,其內(nèi)部存儲(chǔ)了數(shù)據(jù)庫(kù)對(duì)應(yīng)的校驗(yàn)集
與字符集
:
當(dāng)然,如果你不指定字符集
和校驗(yàn)集
,此時(shí)會(huì)使用系統(tǒng)默認(rèn)的。
查看系統(tǒng)默認(rèn)的
字符集
:
show variables like 'character_set_database';
示例:
即默認(rèn)的字符集
為utf8
。
- 查看系統(tǒng)默認(rèn)的
校驗(yàn)集
:
show variables like 'collation_database';
示例:
即默認(rèn)的校驗(yàn)集
為utf8_general_ci
。
刪除
- 刪除數(shù)據(jù)庫(kù):
drop database [if exists] 數(shù)據(jù)庫(kù)名;
示例:
修改
修改數(shù)據(jù),主要是指修改數(shù)據(jù)庫(kù)使用的字符集
和校驗(yàn)集
。
- 修改
字符集
:
alter database 數(shù)據(jù)庫(kù)名 charset=xxx;
示例:
- 修改
校驗(yàn)集
:
alter database 數(shù)據(jù)庫(kù)名 collate xxx;
示例:
備份
- 拷貝數(shù)據(jù)庫(kù)指令
mysqldump -P 端口號(hào)-u 用戶名 -p 密碼 -B 數(shù)據(jù)庫(kù)名 > 數(shù)據(jù)庫(kù)備份存儲(chǔ)的文件路徑
注意:該指令要在bash
中執(zhí)行,而不是數(shù)據(jù)庫(kù)中。
比如備份bit_index
數(shù)據(jù)庫(kù):
mysqldump -B bit_index > ~/test/bit_index.sql
上述指令指定了一個(gè)名為bit_index
數(shù)據(jù)庫(kù),將其保存在路徑~/test/bit_index.sql
。
此時(shí)在對(duì)應(yīng)路徑下,就產(chǎn)生了對(duì)應(yīng).sql
文件:
通過(guò)vim
查看一下sql
內(nèi)部的數(shù)據(jù):
可以發(fā)現(xiàn):.sql
文件并不是簡(jiǎn)單的拷貝一份數(shù)據(jù)庫(kù),而是保留了整個(gè)數(shù)據(jù)庫(kù)的SQL
語(yǔ)句。
- 還原數(shù)據(jù)庫(kù)
source 路徑.sql;
該指令要在MySQL
內(nèi)部執(zhí)行,而不是命令行。
表操作
接下來(lái)學(xué)習(xí)如何操作一個(gè)數(shù)據(jù)庫(kù)內(nèi)部的表。
- 進(jìn)入/切換 數(shù)據(jù)庫(kù):
use 數(shù)據(jù)庫(kù)名;
示例:
如圖,我創(chuàng)建了一個(gè)名為box_he
的數(shù)據(jù)庫(kù),隨后執(zhí)行use box_he
進(jìn)入了該數(shù)據(jù)庫(kù),通過(guò)select database()
查看當(dāng)前所處的數(shù)據(jù)庫(kù),可以看到當(dāng)前確實(shí)處于box_he
中。
創(chuàng)建
- 創(chuàng)建一個(gè)表:
create table [if not exists] 表名 (field1 datatype,field2 datatype,field3 datatype
) character set 字符集 collate 校驗(yàn)集 engine 存儲(chǔ)引擎;
[if not exists]
:可省略,如果不存在這個(gè)表,才創(chuàng)建field
:列名datatype
:該列的數(shù)據(jù)類(lèi)型character set
:指定字符集,若沒(méi)有指定,與數(shù)據(jù)庫(kù)使用的字符集一致- 也可寫(xiě)為:
charset=字符集
- 也可寫(xiě)為:
collate
:指定校驗(yàn)集,若沒(méi)有指定,與數(shù)據(jù)庫(kù)使用的校驗(yàn)集一致engine
:指定存儲(chǔ)引擎- 也可寫(xiě)為:
engine=存儲(chǔ)引擎
- 也可寫(xiě)為:
注意事項(xiàng):
- 每一個(gè)列后面都有一個(gè)逗號(hào),但是最后一個(gè)沒(méi)有
- 整個(gè)語(yǔ)句末尾有分號(hào)
示例:
我創(chuàng)建了一個(gè)表t1
,內(nèi)部有id
列,類(lèi)型是int
;name
列,類(lèi)型是varchar(20)
;字符集為utf8
;校驗(yàn)集為utf8_general_ci
;存儲(chǔ)引擎是MyIsam
。
此時(shí)在/var/lib/mysql
下的boe_he
目錄下,出現(xiàn)了三個(gè)文件:t1.frm
,t1.MYD
,t1.MYI
這三個(gè)文件共同維護(hù)了t1
這張表。
可見(jiàn):數(shù)據(jù)庫(kù)中的表的本質(zhì),就是多個(gè)文件!
而不同存儲(chǔ)引擎,對(duì)一張表的存儲(chǔ)形式不同,比如創(chuàng)建一個(gè)同樣結(jié)構(gòu)的表,使用InnoDB
存儲(chǔ)引擎:
路徑/var/lib/mysql/box_he
下:
可以看到,同樣的表結(jié)構(gòu)InnoDB
,存儲(chǔ)t2
只使用了兩個(gè)文件t2.frm
和t2.ibd
。關(guān)于存儲(chǔ)引擎的具體內(nèi)容會(huì)在索引部分講解?,F(xiàn)在只需要了解:不同存儲(chǔ)引擎,對(duì)表的存儲(chǔ)存在差別即可。
查看
- 查看當(dāng)前數(shù)據(jù)庫(kù)下有哪些表:
show tables;
示例:
此處的t1
,t2
也就是剛剛創(chuàng)建的兩個(gè)表。
- 查看表的結(jié)構(gòu):
desc 表名;
示例:
各個(gè)字段含義如下:
Field
:列名Type
:列的數(shù)據(jù)類(lèi)型Null
:該列是否允許為空Key
:索引類(lèi)型Default
:默認(rèn)值Extra
:擴(kuò)充
- 查看建表時(shí)的語(yǔ)句:
show create table 表名;
示例:
執(zhí)行語(yǔ)句后,展示了創(chuàng)建表t1
時(shí)的語(yǔ)句,直接執(zhí)行該語(yǔ)句,格式比較混亂,一般來(lái)說(shuō)建議將末尾的分號(hào);
改為\G
:
show create table 表名 \G
這個(gè)\G
可以將數(shù)據(jù)以更加直觀的方式展示出來(lái):
建表的語(yǔ)句與我們輸入的語(yǔ)句略有出入,這是因?yàn)?code>MySQL會(huì)對(duì)輸入的語(yǔ)句進(jìn)行優(yōu)化,比如說(shuō)MySQL
建議將關(guān)鍵字全部大寫(xiě),我們就算是以小寫(xiě)的語(yǔ)句創(chuàng)建表格,底層還是會(huì)被轉(zhuǎn)化為大寫(xiě)。
不過(guò)我個(gè)人認(rèn)為小寫(xiě)的語(yǔ)句更加直觀,可以很快分辨出是哪一個(gè)單詞,而且因?yàn)橛姓Z(yǔ)句優(yōu)化,最后存儲(chǔ)時(shí)還是大寫(xiě),所以我使用小寫(xiě)。
再比如每一列后面都有一個(gè)DEFAULT NULL
,表示默認(rèn)值為NULL
,這個(gè)也是MySQL
的優(yōu)化,如果我們不指定默認(rèn)值,就會(huì)自動(dòng)設(shè)置默認(rèn)值為NULL
。具體如何指定默認(rèn)值,會(huì)在《MySQL:表的約束》博客中講解。
刪除
- 刪除一個(gè)表:
drop table [if exists] 表名 [, 表名, ...];
[if exists]
:如果表存在,才刪除它[, 表名, ...]
:可以一次性刪除多個(gè)表,表名之間用逗號(hào),
分隔
示例:
當(dāng)我把t1
和t2
刪除后,此時(shí)執(zhí)行show tables
,就顯示Empty set
即一個(gè)空的數(shù)據(jù)庫(kù)。
修改
由于剛剛把t1
和t2
都刪掉了,此處我重新創(chuàng)建這兩個(gè)表,方便展示后續(xù)操作:
- 修改表名:
alter table 舊表名 rename [to] 新表名;
rename [to]
:此處的to
可省略,效果一樣
示例:
此處我將t1
和t2
分別改名為table_1
和table_2
。
- 插入新的列
alter table 表名 add 列名 類(lèi)型 comment 描述 after xxx;
comment
:相當(dāng)于備注,用于表示這一列數(shù)據(jù)的含義after
:指定新增的列插入到哪一列后面,如果不指定,默認(rèn)插入到最后一列
示例:
語(yǔ)句alter table table_1 add age int comment '年齡' after id
的作用,就是在id
列后面,插入age
列,類(lèi)型是int
。
對(duì)比前后的desc table_1
,確實(shí)多出了age
列。
- 刪除列
alter table 表名 drop 列名;
示例:
以上指令,刪除了age
列
- 修改列
alter table 表名 change 舊列名 新列名 類(lèi)型;
示例:
我把id
列改為stu_id
列,并把類(lèi)型從int
改為了smallint
。由于我把數(shù)據(jù)類(lèi)型變小了,此時(shí)有可能會(huì)發(fā)生數(shù)據(jù)精度丟失,一般不建議這樣操作。