MySQL基礎知識點整理 - 數據表管理
〇、數據類型
1. 數值數據類型
數值數據類型存儲數值。
MySQL支持多種數值數據類型,每種存儲的數值具有不同的取值範圍。
整數
類型 | 大小 | 範圍(有符號) | 範圍(無符號) |
---|---|---|---|
TINYINT | 1 字節 | (-128,127) | (0,255) |
SMALLINT | 2 字節 | (-32768,32767) | (0,65535) |
MEDIUMINT | 3 字節 | (-8388608,8388607) | (0,16777215) |
INT或INTEGER | 4 字節 | (-2147483648,2147483647) | (0,4294967295) |
BIGINT | 8 字節 | (-2^63^, 2^63^ - 1) | (0,2^64^) |
- 長度
int(n)
與zerofill
int(n)
隻影響顯示字符的寬度,不限制數值的合法範圍。int(3)
依然可以存儲 123456789
這麼大的數值。
若設置了 zerofill
屬性,當 int(3)
存儲 12
時,會在前面補0,補足3位。即 012
;當 int(5)
存儲 12
時,會在前面補三個0,補足5位。即 00012
- 有符號或無符號
所有數值數據類型(除 BIT
和 BOOLEAN
外)都可以有符號或無符號。有符號數值列可以存儲正或負的數值,無符號數值列只能存儲正數。默認情況爲有符號,但如果你知道自己不需要存儲負值,可以使用 UNSIGNED
關鍵字,這樣做將允許你存儲兩倍大小的值。
小數
類型 | 大小 | 範圍(有符號) | 範圍(無符號) |
---|---|---|---|
FLOAT | 4 字節 | (-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 字節 | (-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)
。
DECIMAL還可以用於存儲比BIGINT還大的整數以及精確的小數。
2. 串數據類型
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0 - 255 個字符 | 定長字符串 |
VARCHAR | 0 - 65535 字節 | 變長字符串 |
TINYTEXT | 0 - 255 字節 | 短文本字符串 |
TEXT | 0 - 65535 字節 | 長文本數據(<64KB) |
MEDIUMTEXT | 0 - 16777215 字節 | 中等長度文本數據(<16MB) |
LONGTEXT | 0 - 4294967295 字節 | 極大文本數據(<4GB) |
從 MySQL4.1 版本開始,char(n)
和varchar(n)
中的n
指字符長度,不再表示之前版本的字節長度。也就是說在不同字符集下,char類型列的內部存儲可能不是定長數據。
CHAR*
CHAR 是定長字符串,會直接根據定義字符串時指定的長度分配足夠的空間。
CHAR 適合存儲所有值長度相同的字符串或很短的字符串。
VARCHAR
VARCHAR 的最大長度是65535個字節,而 varchar(n)
中的 n
指字符長度,因此,n
的最大值是由當前字段的字符集決定的。當字符集是 utf8
時,n
的最大值爲 21845。當字符集是 utf8mb4
時,n
的最大值爲 16383。(但是實際上MySQL要求一個行的定義長度不能超過65535個字節,因此,除非表中只有這一個字段,否則 n
的值達不到上述的最大值)。
VARCHAR 使用1-2個額外字節記錄字符串長度,列長度小於等於255個字符時,使用1個字節記錄,否則使用2個字節。
最佳實踐
- 對於經常變更的數據, CHAR 比 VARCHAR 更好,CHAR 的磁盤空間利用率更高,不容易產生碎片。
- 當列中數據的長度相同時,選擇 CHAR;當列中數據長度參差不齊時,選擇 VARCHAR。
- 對於非常短的列,CHAR 比 VARCHAR 在存儲上更有效率。
- 只分配真正需要的空間,更長的列會消耗更多的內存。
- 儘量避免使用 BLOB/TEXT 類型,查詢時會使用臨時表,導致嚴重的性能開銷。如果一定要用,建議單獨建表存儲該字段。
3. 二進制數據類型
類型 | 大小 | 用途 |
---|---|---|
TINYBLOB | 0 - 255 字節 | 不超過 255 個字符的二進制字符串 |
BLOB | 0 - 65535 字節 | 二進制形式的長文本數據(<64KB) |
MEDIUMBLOB | 0 - 16777215 字節 | 二進制形式的中等長度文本數據(<16MB) |
LONGBLOB | 0 - 4294967295 字節 | 二進制形式的極大文本數據(<4GB) |
4. 日期和時間類型
類型 | 大小(字節) | 範圍 | 格式 | 用途 |
---|---|---|---|---|
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 | 混合日期和時間值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
最佳實踐
- 儘量使用 TIMESTAMP,比 DATETIME 的空間利用率高。
一、創建數據表
CREATE TABLE
使用CREATE TABLE 創建表,必須給出下列信息:
- 表的名字,在關鍵字 CREATE TABLE 之後給出;
- 表中字段的名字和定義,用逗號分隔。
以下爲創建MySQL數據表的SQL通用語法:
CREATE TABLE table_name (
column1 datatype [NULL|NOT NULL] [DEFAULT ],
column2 datatype,
);
實例
- 創建用戶表
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 '狀態',
`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 '用戶表';
實例解析
如果數據庫中不存在 user
表時,創建該表。存儲引擎爲 InnoDB
,默認字符集爲utf8
ENGINE 設置存儲引擎,CHARSET 設置編碼。
CREATE TABLE IF NOT EXISTS `user` (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT '用戶表'
創建名爲 id
的字段,整型,非負數,不能爲空,自增。
如果你不想字段爲 NULL 可以設置字段的屬性爲 NOT NULL, 在操作數據庫時如果輸入該字段的數據爲NULL ,就會報錯。
AUTO_INCREMENT定義列爲自增的屬性,一般用於主鍵,數值會自動加1。
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT
創建名爲 username
的字段,字符串類型,最大長度爲190個字符,字符集爲 utf8mb4
,不能爲空
`username` varchar(190) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
將字段 id
設爲主鍵,使用 BTREE
索引
PRIMARY KEY關鍵字用於定義列爲主鍵。 可以使用多列來定義主鍵,列間以逗號分隔。
PRIMARY KEY (`id`) USING BTREE,
爲字段 email
添加唯一索引,索引名稱爲 unq_email
設置了唯一索引的字段不能出現重複的值,但是如果字段可以爲 null
,則允許出現多個 null
值。
UNIQUE KEY `unq_email` (`email`) USING BTREE
爲字段 username
添加普通索引,索引名稱爲 idx_username
KEY `idx_username` (`username`)
二、查看數據表
1. 查看數據庫中的所有數據表
SHOW TABLES
用於查看數據庫中的所有數據表。
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| user |
+----------------+
1 row in set (0.07 sec)
2. 查看數據表的建表SQL語句
SHOW CREATE TABLE
用於查看指定數據表的建表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 '狀態',
`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. 查看數據表結構
DESCRIBE 和 DESC
DESCRIBE
可用於查看錶結構,DESC
是 DESCRIBE
的縮寫。
語法:
DESCRIBE table_name
- 查看
user
表的表結構
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
也可以用於查看錶結構。
語法:
EXPLAIN table_name
DESCRIBE
和 EXPLAIN
語句是同義詞,實際上在平時使用過程中 DESCRIBE
多用於獲取表結構的信息,而 EXPLAIN
多用於獲取SQL語句的執行計劃。
- 查看
user
表的表結構
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)
三、修改數據表
1. 重命名數據表
- 語法
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
表添加一個字段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個字符
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
兩個字段的索引,索引名爲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)
四、刪除數據表
可以使用 DROP TABLE
命令刪除一個或者多個數據表。
在使用 DROP TABLE
刪除數據表時,要刪除的數據表必須存在,否則會報錯。
1. 刪除一個數據表
DROP TABLE tablename
2. 批量刪除數據表
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