摘要:基礎(chǔ)知識點(diǎn)整理數(shù)據(jù)表管理數(shù)據(jù)類型數(shù)值數(shù)據(jù)類型數(shù)值數(shù)據(jù)類型存儲數(shù)值。支持多種數(shù)值數(shù)據(jù)類型,每種存儲的數(shù)值具有不同的取值范圍。是定長字符串,會直接根據(jù)定義字符串時(shí)指定的長度分配足夠的空間。
MySQL基礎(chǔ)知識點(diǎn)整理 - 數(shù)據(jù)表管理 〇、數(shù)據(jù)類型 1. 數(shù)值數(shù)據(jù)類型
數(shù)值數(shù)據(jù)類型存儲數(shù)值。
MySQL支持多種數(shù)值數(shù)據(jù)類型,每種存儲的數(shù)值具有不同的取值范圍。
類型 | 大小 | 范圍(有符號) | 范圍(無符號) |
---|---|---|---|
TINYINT | 1 字節(jié) | (-128,127) | (0,255) |
SMALLINT | 2 字節(jié) | (-32768,32767) | (0,65535) |
MEDIUMINT | 3 字節(jié) | (-8388608,8388607) | (0,16777215) |
INT或INTEGER | 4 字節(jié) | (-2147483648,2147483647) | (0,4294967295) |
BIGINT | 8 字節(jié) | (-2^63^, 2^63^ - 1) | (0,2^64^) |
長度 int(n) 與 zerofill
int(n) 只影響顯示字符的寬度,不限制數(shù)值的合法范圍。
int(3) 依然可以存儲 123456789 這么大的數(shù)值。
若設(shè)置了 zerofill 屬性,當(dāng) int(3) 存儲 12 時(shí),會在前面補(bǔ)0,補(bǔ)足3位。即 012;當(dāng) int(5) 存儲 12 時(shí),會在前面補(bǔ)三個(gè)0,補(bǔ)足5位。即 00012
有符號或無符號
所有數(shù)值數(shù)據(jù)類型(除 BIT 和 BOOLEAN 外)都可以有符號或無符號。有符號數(shù)值列可以存儲正或負(fù)的數(shù)值,無符號數(shù)值列只能存儲正數(shù)。默認(rèn)情況為有符號,但如果你知道自己不需要存儲負(fù)值,可以使用 UNSIGNED 關(guān)鍵字,這樣做將允許你存儲兩倍大小的值。
小數(shù)類型 | 大小 | 范圍(有符號) | 范圍(無符號) |
---|---|---|---|
FLOAT | 4 字節(jié) | (-3.402823466 E+38,-1.175494351 E-38),0,(1.175494351 E-38,3.402823466351 E+38) | 0,(1.175 494351 E-38,3.402823466 E+38) |
DOUBLE | 8 字節(jié) | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 依賴于M和D的值 | 依賴于M和D的值 |
DECIMAL最常用的用法就是用來存儲貨幣,例如 DECIMAL(8, 2)。2. 串?dāng)?shù)據(jù)類型
DECIMAL還可以用于存儲比BIGINT還大的整數(shù)以及精確的小數(shù)。
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0 - 255 個(gè)字符 | 定長字符串 |
VARCHAR | 0 - 65535 字節(jié) | 變長字符串 |
TINYTEXT | 0 - 255 字節(jié) | 短文本字符串 |
TEXT | 0 - 65535 字節(jié) | 長文本數(shù)據(jù)(<64KB) |
MEDIUMTEXT | 0 - 16777215 字節(jié) | 中等長度文本數(shù)據(jù)(<16MB) |
LONGTEXT | 0 - 4294967295 字節(jié) | 極大文本數(shù)據(jù)(<4GB) |
從 MySQL4.1 版本開始,char(n) 和 varchar(n) 中的 n 指字符長度,不再表示之前版本的字節(jié)長度。也就是說在不同字符集下,char類型列的內(nèi)部存儲可能不是定長數(shù)據(jù)。CHAR*
CHAR 是定長字符串,會直接根據(jù)定義字符串時(shí)指定的長度分配足夠的空間。
CHAR 適合存儲所有值長度相同的字符串或很短的字符串。
VARCHAR 的最大長度是65535個(gè)字節(jié),而 varchar(n) 中的 n 指字符長度,因此,n 的最大值是由當(dāng)前字段的字符集決定的。當(dāng)字符集是 utf8 時(shí),n 的最大值為 21845。當(dāng)字符集是 utf8mb4 時(shí),n 的最大值為 16383。(但是實(shí)際上MySQL要求一個(gè)行的定義長度不能超過65535個(gè)字節(jié),因此,除非表中只有這一個(gè)字段,否則 n 的值達(dá)不到上述的最大值)。
VARCHAR 使用1-2個(gè)額外字節(jié)記錄字符串長度,列長度小于等于255個(gè)字符時(shí),使用1個(gè)字節(jié)記錄,否則使用2個(gè)字節(jié)。
最佳實(shí)踐對于經(jīng)常變更的數(shù)據(jù), CHAR 比 VARCHAR 更好,CHAR 的磁盤空間利用率更高,不容易產(chǎn)生碎片。
當(dāng)列中數(shù)據(jù)的長度相同時(shí),選擇 CHAR;當(dāng)列中數(shù)據(jù)長度參差不齊時(shí),選擇 VARCHAR。
對于非常短的列,CHAR 比 VARCHAR 在存儲上更有效率。
只分配真正需要的空間,更長的列會消耗更多的內(nèi)存。
盡量避免使用 BLOB/TEXT 類型,查詢時(shí)會使用臨時(shí)表,導(dǎo)致嚴(yán)重的性能開銷。如果一定要用,建議多帶帶建表存儲該字段。
3. 二進(jìn)制數(shù)據(jù)類型類型 | 大小 | 用途 |
---|---|---|
TINYBLOB | 0 - 255 字節(jié) | 不超過 255 個(gè)字符的二進(jìn)制字符串 |
BLOB | 0 - 65535 字節(jié) | 二進(jìn)制形式的長文本數(shù)據(jù)(<64KB) |
MEDIUMBLOB | 0 - 16777215 字節(jié) | 二進(jìn)制形式的中等長度文本數(shù)據(jù)(<16MB) |
LONGBLOB | 0 - 4294967295 字節(jié) | 二進(jìn)制形式的極大文本數(shù)據(jù)(<4GB) |
類型 | 大小(字節(jié)) | 范圍 | 格式 | 用途 |
---|---|---|---|---|
YEAR | 1 | 1901 / 2155 | YYYY | 年份值 |
DATE | 3 | 1000-01-01 / 9999-12-31 | YYYY-MM-DD | 日期值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時(shí)間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 結(jié)束時(shí)間是第 2147483647 秒,北京時(shí)間 2038-1-19 11:14:07,格林尼治時(shí)間 2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS | 混合日期和時(shí)間值,時(shí)間戳 |
盡量使用 TIMESTAMP,比 DATETIME 的空間利用率高。
一、創(chuàng)建數(shù)據(jù)表 CREATE TABLE使用CREATE TABLE 創(chuàng)建表,必須給出下列信息:
表的名字,在關(guān)鍵字 CREATE TABLE 之后給出;
表中字段的名字和定義,用逗號分隔。
以下為創(chuàng)建MySQL數(shù)據(jù)表的SQL通用語法:
CREATE TABLE table_name ( column1 datatype [NULL|NOT NULL] [DEFAULT ], column2 datatype, );實(shí)例
創(chuàng)建用戶表
CREATE TABLE IF NOT EXISTS `user` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `username` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT "密碼", `status` tinyint(3) unsigned NOT NULL DEFAULT "0" COMMENT "狀態(tài)", `created_at` int(11) unsigned NOT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `unq_email` (`email`) USING BTREE, KEY `idx_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT "用戶表";實(shí)例解析
如果數(shù)據(jù)庫中不存在 user 表時(shí),創(chuàng)建該表。存儲引擎為 InnoDB,默認(rèn)字符集為utf8
ENGINE 設(shè)置存儲引擎,CHARSET 設(shè)置編碼。
CREATE TABLE IF NOT EXISTS `user` ( ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT "用戶表"
創(chuàng)建名為 id 的字段,整型,非負(fù)數(shù),不能為空,自增。
如果你不想字段為 NULL 可以設(shè)置字段的屬性為 NOT NULL, 在操作數(shù)據(jù)庫時(shí)如果輸入該字段的數(shù)據(jù)為NULL ,就會報(bào)錯(cuò)。
AUTO_INCREMENT定義列為自增的屬性,一般用于主鍵,數(shù)值會自動加1。
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT
創(chuàng)建名為 username 的字段,字符串類型,最大長度為190個(gè)字符,字符集為 utf8mb4,不能為空
`username` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
將字段 id 設(shè)為主鍵,使用 BTREE 索引
PRIMARY KEY關(guān)鍵字用于定義列為主鍵。 可以使用多列來定義主鍵,列間以逗號分隔。
PRIMARY KEY (`id`) USING BTREE,
為字段 email 添加唯一索引,索引名稱為 unq_email
設(shè)置了唯一索引的字段不能出現(xiàn)重復(fù)的值,但是如果字段可以為 null,則允許出現(xiàn)多個(gè) null 值。
UNIQUE KEY `unq_email` (`email`) USING BTREE
為字段 username 添加普通索引,索引名稱為 idx_username
KEY `idx_username` (`username`)二、查看數(shù)據(jù)表 1. 查看數(shù)據(jù)庫中的所有數(shù)據(jù)表
SHOW TABLES 用于查看數(shù)據(jù)庫中的所有數(shù)據(jù)表。
mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | user | +----------------+ 1 row in set (0.07 sec)2. 查看數(shù)據(jù)表的建表SQL語句
SHOW CREATE TABLE 用于查看指定數(shù)據(jù)表的建表SQL語句
語法:
SHOW CREATE TABLE table_name
查看 user 表的建表語句
mysql> SHOW CREATE TABLE `user`G *************************** 1. row *************************** Table: user Create Table: CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, `email` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT "密碼", `status` tinyint(3) unsigned NOT NULL DEFAULT "0" COMMENT "狀態(tài)", `created_at` int(11) unsigned NOT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `unq_email` (`email`) USING BTREE, KEY `idx_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT="用戶表" 1 row in set (0.00 sec)3. 查看數(shù)據(jù)表結(jié)構(gòu) DESCRIBE 和 DESC
DESCRIBE 可用于查看表結(jié)構(gòu),DESC 是 DESCRIBE 的縮寫。
語法:
DESCRIBE table_name
查看 user 表的表結(jié)構(gòu)
mysql> DESCRIBE `user`; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(190) | NO | MUL | NULL | | | email | varchar(255) | YES | UNI | NULL | | | password | varchar(255) | YES | | NULL | | | status | tinyint(3) unsigned | NO | | 0 | | | created_at | int(11) unsigned | NO | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec)
mysql> DESC `user`; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(190) | NO | MUL | NULL | | | email | varchar(255) | YES | UNI | NULL | | | password | varchar(255) | YES | | NULL | | | status | tinyint(3) unsigned | NO | | 0 | | | created_at | int(11) unsigned | NO | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 6 rows in set (0.00 sec)EXPLAIN
EXPLAIN 也可以用于查看表結(jié)構(gòu)。
語法:
EXPLAIN table_name
DESCRIBE 和 EXPLAIN 語句是同義詞,實(shí)際上在平時(shí)使用過程中 DESCRIBE 多用于獲取表結(jié)構(gòu)的信息,而 EXPLAIN 多用于獲取SQL語句的執(zhí)行計(jì)劃。
查看 user 表的表結(jié)構(gòu)
mysql> EXPLAIN `user`; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(190) | NO | MUL | NULL | | | email | varchar(255) | YES | UNI | NULL | | | password | varchar(255) | YES | | NULL | | | status | tinyint(3) unsigned | NO | | 0 | | | created_at | int(11) unsigned | NO | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 6 rows in set (0.03 sec)三、修改數(shù)據(jù)表 1. 重命名數(shù)據(jù)表
語法
RENAME TABLE old_name TO new_name;
將 user 表重命名為 consumer ,再改回 user
mysql> RENAME TABLE `user` TO `consumer`; Query OK, 0 rows affected (0.00 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | consumer | +----------------+ 1 row in set (0.06 sec) mysql> RENAME TABLE `consumer` TO `user`; Query OK, 0 rows affected (0.00 sec) mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | user | +----------------+ 1 row in set (0.05 sec)2. 增加字段
語法
ALTER TABLE table_name ADD column_name column_type
給 user 表添加一個(gè)字段 intro
mysql> ALTER TABLE `user` ADD `intro` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT "簡介" AFTER `email`; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC `user`; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(190) | NO | MUL | NULL | | | email | varchar(255) | YES | UNI | NULL | | | intro | varchar(255) | YES | | NULL | | | password | varchar(255) | YES | | NULL | | | status | tinyint(3) unsigned | NO | | 0 | | | created_at | int(11) unsigned | NO | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 7 rows in set (0.06 sec)3. 修改字段 修改字段名和屬性
語法
ALTER TABLE table_name CHANGE old_name new_name column_type;
將 user 表的 intro 字段名改為 about
mysql> ALTER TABLE `user` CHANGE `intro` `about` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT "簡介"; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC `user`; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(190) | NO | MUL | NULL | | | email | varchar(255) | YES | UNI | NULL | | | about | varchar(255) | YES | | NULL | | | password | varchar(255) | YES | | NULL | | | status | tinyint(3) unsigned | NO | | 0 | | | created_at | int(11) unsigned | NO | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 7 rows in set (0.07 sec)修改字段屬性
語法
ALTER TABLE table_name MODIFY column_name column_type;
將 user 表的 about 字段字符串最大長度改為200個(gè)字符
mysql> ALTER TABLE `user` MODIFY `about` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT "簡介"; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC `user`; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(190) | NO | MUL | NULL | | | email | varchar(255) | YES | UNI | NULL | | | about | varchar(200) | YES | | NULL | | | password | varchar(255) | YES | | NULL | | | status | tinyint(3) unsigned | NO | | 0 | | | created_at | int(11) unsigned | NO | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 7 rows in set (0.09 sec)4. 刪除字段
語法
ALTER TABLE table_name DROP COLUMN column_name;
從 user 表中刪除 about 字段
mysql> ALTER TABLE `user` DROP COLUMN `about`; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC `user`; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(190) | NO | MUL | NULL | | | email | varchar(255) | YES | UNI | NULL | | | password | varchar(255) | YES | | NULL | | | status | tinyint(3) unsigned | NO | | 0 | | | created_at | int(11) unsigned | NO | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 6 rows in set (0.08 sec)5. 添加索引
語法
ALTER TABLE `user` ADD [ KEY | UNIQUE KEY | PRIMARY KEY] idx_name (column_name);
為 user 表中的 created_at 字段添加普通索引,索引名為 idx_created_at
mysql> ALTER TABLE `user` ADD KEY `idx_created_at` (`created_at`); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC `user`; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(190) | NO | MUL | NULL | | | email | varchar(255) | YES | UNI | NULL | | | password | varchar(255) | YES | | NULL | | | status | tinyint(3) unsigned | NO | | 0 | | | created_at | int(11) unsigned | NO | MUL | NULL | | +------------+---------------------+------+-----+---------+----------------+ 6 rows in set (0.07 sec)6. 刪除索引
語法
ALTER TABLE `user` DROP KEY idx_name;
刪除 user 表中的 created_at 和 email 兩個(gè)字段的索引,索引名為 idx_created_at 和 unq_email
mysql> ALTER TABLE `user` DROP KEY `idx_created_at`; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE `user` DROP KEY `unq_email`; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC `user`; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(190) | NO | MUL | NULL | | | email | varchar(255) | YES | | NULL | | | password | varchar(255) | YES | | NULL | | | status | tinyint(3) unsigned | NO | | 0 | | | created_at | int(11) unsigned | NO | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 6 rows in set (0.06 sec)四、刪除數(shù)據(jù)表
可以使用 DROP TABLE 命令刪除一個(gè)或者多個(gè)數(shù)據(jù)表。
在使用 DROP TABLE 刪除數(shù)據(jù)表時(shí),要刪除的數(shù)據(jù)表必須存在,否則會報(bào)錯(cuò)。1. 刪除一個(gè)數(shù)據(jù)表
DROP TABLE tablename2. 批量刪除數(shù)據(jù)表
DROP TABLE tablename1,tablename2,tablename3
刪除 user 表
mysql> DROP TABLE `user`; Query OK, 0 rows affected (0.01 sec) mysql> DESC `user`; 1146 - Table "test.user" doesn"t exist mysql> SHOW TABLES; Empty set
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/31836.html
摘要:支持崩潰后的安全恢復(fù)。的使用場景更新密集的表存儲引擎特別適合處理多重并發(fā)的更新請求。外鍵約束支持外鍵的存儲引擎只有。引擎是及之前版本的默認(rèn)存儲引擎。文件存儲表的索引。引擎存儲引擎是引擎的變種。 MySQL基礎(chǔ)知識點(diǎn)整理 - 存儲引擎 0. 查看 MySQL 支持的存儲引擎 可以在 mysql 客戶端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...
閱讀 606·2021-10-08 10:20
閱讀 1495·2021-09-23 11:22
閱讀 3222·2019-08-30 15:55
閱讀 1603·2019-08-28 18:25
閱讀 1865·2019-08-28 18:14
閱讀 1240·2019-08-26 11:37
閱讀 2902·2019-08-26 10:18
閱讀 2428·2019-08-23 18:39