MySQL經常使用的一些語句,索引,字段等

一、庫相關:
建庫:
character set:指定編碼
COLLATE:排序規則 utf8mb4_general_ci 大小寫不敏感
CREATE DATABASE `test_db` default character set utf8mb4 COLLATE utf8mb4_general_ci;

查看建庫語句:
SHOW CREATE DATABASE `test_db`;

二、數據表相關:
建表:
CREATE TABLE `video` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '視頻名字',
  `cat_id` smallint(4) unsigned NOT NULL DEFAULT '0' COMMENT '分類id',
  `image` varchar(200) NOT NULL DEFAULT '',
  `url` varchar(200) NOT NULL DEFAULT '',
  `type` tinyint(2) unsigned NOT NULL DEFAULT '0',
  `content` text,
  `uploader` varchar(200) NOT NULL DEFAULT '',
  `create_time` int(10) unsigned NOT NULL DEFAULT '0',
  `update_time` int(10) unsigned NOT NULL DEFAULT '0',
  `status` tinyint(2) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  INDEX `cat_info`(`cat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

查看錶:
SHOW CREATE TABLE `video`;#建表語句
DESC `video`;
DESCRIBE `video`;

修改表的存儲引擎:
ALTER TABLE `video` ENGINE=MyISAM;
ALTER TABLE `video` ENGINE=InnoDB;

三、索引增長查看刪除
索引建立:
3.a、加主鍵索引
ALTER TABLE `table_name` ADD PRIMARY KEY (`column`)
複合主鍵:
ALTER TABLE `table_name` ADD PRIMARY KEY(`column1`,`column2`);

3.b、加惟一索引
ALTER TABLE `table_name` ADD UNIQUE (`column`)

3.c、加單列索引
ALTER TABLE `table_name` ADD INDEX index_name (`column`)

3.d、加全文索引
ALTER TABLE `table_name` ADD FULLTEXT (`column`)
Note:
MySQL5.6.24上InnoDB引擎也加入了全文索引:http://www.javashuo.com/article/p-nlfeyakd-mr.html
MySQL5.7.6支持了對中文的全文索引支持:http://www.javashuo.com/article/p-acqqmgdn-ho.html

3.e、添加複合索引[多列索引] [最左前綴原則]
ALTER TABLE `table_name` ADD INDEX index_name (`column1`,`column2`,`column3`)

Note:
note.1
多個單列索引與單個多列索引的查詢效果不一樣,由於執行查詢時,MySQL只能使用一個索引,會從多個索引中選擇一個限制最爲嚴格的索引。
平時用的SQL查詢語句通常都有比較多的限制條件,因此爲了進一步榨取MySQL的效率,就要考慮創建組合索引。
例如對上面video表中針對name和create_time創建一個組合索引:
name字段取前50個字符創建索引。
ALTER TABLE `video` ADD INDEX index_name_ctime (name(50),create_time)
創建這樣的組合索引,實際上是至關於分別創建了下面兩組組合索引:
* name,create_time
* name

爲何沒有create_time這樣的組合索引呢?
這是由於MySQL組合索引「最左前綴」的結果。簡單的理解就是隻從最左面的開始組合。並非只要包含這兩列的查詢都會用到該組合索引,以下面的幾個SQL所示:
能使用到上面的索引:
* SELECT * FROM `video` WHREE name='測試' AND create_time=1234567890;
* SELECT * FROM `video` WHREE name='測試';
不能使用上面的索引:
* SELECT * FROM `video` WHREE create_time=1234567890;

note.二、索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。
因此咱們在數據庫設計時不要讓字段的默認值爲NULL。

note.三、索引列排序
MySQL查詢只使用一個索引,所以若是where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。
所以數據庫默認排序能夠符合要求的狀況下不要使用排序操做,儘可能不要包含多個列的排序,若是須要最好給這些列建立複合索引。

note.四、like語句操做
使用like時,只有 like "aaa%" 纔會使用到索引

note.五、不要在列上進行運算
例如:select * from users where YEAR(create_date)<2007,將在每一個行上進行運算,這將致使索引失效而進行全表掃描,
所以咱們能夠改爲:select * from users where create_date<'2017-01-01'。

note.六、字符串字段的索引,查詢時帶上單引號
參考文章:
https://www.zendstudio.net/archives/single-quotes-or-no-single-quotes-in-sql-query/

note.七、最後
MySQL只對如下操做符才使用索引:
<,<=,=,>,>=,between,in,以及某些時候的like(不以通配符%或_開頭的情形)。
而理論上每張表裏面最多可建立16個索引,不過除非是數據量真的不少,不然過多的使用索引也不是那麼好玩的,好比我剛纔針對text類型的字段建立索引的時候,系統差點就卡死了。

索引查看:
SHOW INDEX FROM `table_name`;

索引刪除:
DROP INDEX `index_name` ON `table_name`;

ALTER TABLE `table_name` DROP INDEX `index_name`;

四、字段增長修改刪除
增長:
增長字段:
ALTER TABLE `table_name` ADD `email` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '郵箱';

增長字段,並將增長的字段位於某個字段後面:
ALTER TABLE `table_name` ADD `email` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '郵箱' AFTER `telephone`;

修改:
修改字段數據屬性:
ALTER TABLE `table_name` MODIFY `email` CHAR(80) NOT NULL DEFAULT '' COMMENT '定長郵箱';

修改字段名稱和屬性:
ALTER TABLE `table_name` CHANGE `email` `user_email` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '用戶郵箱';

給字段設置默認值:
ALTER TABLE `table_name` ALTER `user_email` SET DEFAULT 'username@qq.com';

修改自增加鍵的起始值:
ALTER TABLE `table_name` AUTO_INCREMENT=100;

刪除:
刪除字段:
ALTER TABLE `table_name` DROP COLUMN `user_email`;

刪除多個字段:
ALTER TABLE `table_name` DROP COLUMN `user_email`,DROP COLUMN `telephone`;

html

相關文章
相關標籤/搜索