MySQL那些不常用的一些SQL語(yǔ)句
不知道大家有沒(méi)遇到過(guò)是用 MyCat 進(jìn)行分庫(kù)分表的數(shù)據(jù)庫(kù),對(duì)于這種的數(shù)據(jù)庫(kù),相信大家在是用 Navicat 進(jìn)行連接時(shí)候,會(huì)發(fā)現(xiàn),有時(shí)候明明自己的表是存在的,但是在使用 Navicat 的時(shí)候,左邊是看不到這個(gè)表的,從而導(dǎo)致了,對(duì)添加字段,查看表結(jié)構(gòu)不熟悉的同學(xué)來(lái)說(shuō),這簡(jiǎn)直是一種折磨,今天阿粉就把一些經(jīng)典的 SQL 給大家整理出來(lái),讓大家以后在想看的時(shí)候,直接拉出來(lái)看。
MySQL的添加表
這個(gè)頁(yè)面都熟悉,很多人建表的時(shí)候,都是直接在這里定義表的結(jié)構(gòu),然后直接保存,確實(shí)是沒(méi)毛病,但是如果分庫(kù)之后,你不知道規(guī)則,那么你只能讓有權(quán)限的人去幫你執(zhí)行建表語(yǔ)句,這時(shí)候就用到了SQL語(yǔ)句創(chuàng)建表。
CREATE TABLE 表名稱(chēng)
(
列名稱(chēng)1 數(shù)據(jù)類(lèi)型,
列名稱(chēng)2 數(shù)據(jù)類(lèi)型,
列名稱(chēng)3 數(shù)據(jù)類(lèi)型,
....
)
但是這么指定,肯定還不行,還得有主鍵不是么?
給個(gè)最簡(jiǎn)單的:
CREATE TABLE `USER` (
`ID` varchar(64) NOT NULL ,
`Name` varchar(64) NULL ,
`Age` int(11) NULL ,
PRIMARY KEY (`ID`)
)
我們創(chuàng)建一個(gè) USER 表,然后給表加上主鍵,就完成了創(chuàng)建一個(gè)基本的表。
如果你想增加字段的時(shí)候,又找不到表了,那應(yīng)該怎么辦呢?
非常簡(jiǎn)單,ALTER TABLE 語(yǔ)句,語(yǔ)法格式如下;
ALTER TABLE table_name ADD column_name datatype default xxx COMMENT '注釋'
這個(gè)語(yǔ)法 table_name 就是你的表名,column_name 是你的字段名,datatype 是你的字段類(lèi)型, default后面則是你字段的默認(rèn)值,而COMMENT后面,則是跟著的對(duì)應(yīng)字段的注釋?zhuān)遣皇呛芎?jiǎn)單。
雖然簡(jiǎn)單,但是很多直接習(xí)慣是用 Navicat 的人來(lái)說(shuō),還得去百度,現(xiàn)在不需要了,直接收藏一下,下次拉過(guò)來(lái)繼續(xù)用。
如果覺(jué)得我們給這個(gè)表設(shè)計(jì)的某個(gè)字段的類(lèi)型不合適,那么又應(yīng)該怎么改呢?
同樣的還是 ALTER 語(yǔ)法:
ALTER TABLE table_name MODIFY COLUMN column_name datatype comment '注釋';
實(shí)際上和加字段區(qū)別并不大,但是 MODIFY 這個(gè)是修改的意思,畢竟寫(xiě)代碼還有 CRUD 呢!
MYSQL 查看表結(jié)構(gòu)
當(dāng)你找不到表的時(shí)候,而且還深信表一定存在,那么就得用到一個(gè)關(guān)鍵字了 DESC,看到這個(gè)關(guān)鍵詞的時(shí)候,相信小伙伴們都懵逼了,什么鬼,DESC 不是排序的時(shí)候是用的么?
是,DESC 在排序的時(shí)候確實(shí)是使用的,但是此 DESC 非彼 DESC,這里的 DESC 實(shí)際上是 DESCRIBE 的縮寫(xiě),而 排序所用的 DESC 是 DESCEND 的縮寫(xiě),這個(gè)你懂了么?
DESC table_name
這個(gè)語(yǔ)句就能成功的把你創(chuàng)建的表的結(jié)構(gòu)都展示出來(lái)。
MYSQL 查看表索引的語(yǔ)句
這個(gè)相信大家肯定是都會(huì)的。
show index from tbname;
這里要注意的就是他的每個(gè)字段是什么意思了。
1.Table: 表名。
2.Non_unique: 如果索引不能包括重復(fù)值則為0,如果可以則為1。也就是平時(shí)所說(shuō)的唯一索引。
3.Key_name 索引名稱(chēng),如果名字相同則表明是同一個(gè)索引,而并不是重復(fù),比如上圖中的第四、五條數(shù)據(jù),索引名稱(chēng)都是name,其實(shí)是一個(gè)聯(lián)合索引。
4.Seq_in_index 索引中的列序列號(hào),從1開(kāi)始。上圖中的四、五條數(shù)據(jù),Seq_in_index一個(gè)是1一個(gè)是2,就是表明在聯(lián)合索引中的順序,我們就能推斷出聯(lián)合索引中索引的前后順序。
5.Column_name 索引的列名。
6.Collation指的是列以什么方式存儲(chǔ)在索引中,大概意思就是字符序。
7.Cardinality 是基數(shù)的意思,表示索引中唯一值的數(shù)目的估計(jì)值。我們知道某個(gè)字段的重復(fù)值越少越適合建索引,所以我們一般都是根據(jù)Cardinality來(lái)判斷索引是否具有高選擇性,如果這個(gè)值非常小,那就需要重新評(píng)估這個(gè)字段是否適合建立索引。
8.Sub_part 前置索引的意思,如果列只是被部分地編入索引,則為被編入索引的字符的數(shù)目。如果整列被編入索引,則為NULL。
9.Packed 指示關(guān)鍵字如何被壓縮。如果沒(méi)有被壓縮,則為NULL。壓縮一般包括壓縮傳輸協(xié)議、壓縮列解決方案和壓縮表解決方案。
10.Null 如果列含有NULL,則含有YES。
11.Index_type表示索引類(lèi)型,Mysql目前主要有以下幾種索引類(lèi)型:FULLTEXT,HASH,BTREE,RTREE。
12.Comment Index_comment 注釋的意思。
說(shuō)到查看索引,那么就得說(shuō)新增和刪除索引。
索引的類(lèi)型:
- UNIQUE(唯一索引):不可以出現(xiàn)相同的值,可以有NULL值
- INDEX(普通索引):允許出現(xiàn)相同的索引內(nèi)容
- PROMARY KEY(主鍵索引):不允許出現(xiàn)相同的值
- fulltext index(全文索引):可以針對(duì)值中的某個(gè)單詞,但效率確實(shí)不敢恭維
- 組合索引:實(shí)質(zhì)上是將多個(gè)字段建到一個(gè)索引里,列值的組合必須唯一
創(chuàng)建索引
CREATE INDEX index_name
ON table_name (column_name)
刪除索引
DROP INDEX index_name ON table_name
非常簡(jiǎn)單,阿粉不多說(shuō),這里就說(shuō)一個(gè)比較經(jīng)典的,如果表已經(jīng)創(chuàng)建好了,那么再添加索引,那就還得是 ALTER。
ALTER TABLE table_name add INDEX `index_name` (`xxx`,`xx`,`x`)
以上的語(yǔ)句替換一下表名和索引的名稱(chēng)和字段的名稱(chēng),那么就建立了一個(gè)聯(lián)合索引了,這樣看起來(lái)好像很簡(jiǎn)單是不是。
最后阿粉再來(lái)個(gè)總結(jié):
總結(jié)
創(chuàng)建表
CREATE TABLE `USER` (
`ID` varchar(64) NOT NULL ,
`Name` varchar(64) NULL ,
`Age` int(11) NULL ,
PRIMARY KEY (`ID`)
)
添加字段
ALTER TABLE table_name MODIFY COLUMN column_name datatype comment '注釋';
查看表結(jié)構(gòu)
DESC table_name
查看表索引
show index from tbname;
創(chuàng)建索引
CREATE INDEX index_name
ON table_name (column_name)
刪除表索引
DROP INDEX index_name ON table_name
增加表索引
ALTER TABLE table_name add INDEX `index_name` (`xxx`,`xx`,`x`)