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