數值數據類型存儲數值。
MySQL支持多種數值數據類型,每種存儲的數值具備不一樣的取值範圍。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
sql
全部數值數據類型(除 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還大的整數以及精確的小數。
類型 | 大小 | 用途 |
---|---|---|
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 適合存儲全部值長度相同的字符串或很短的字符串。性能
VARCHAR 的最大長度是65535個字節,而 varchar(n)
中的 n
指字符長度,所以,n
的最大值是由當前字段的字符集決定的。當字符集是 utf8
時,n
的最大值爲 21845。當字符集是 utf8mb4
時,n
的最大值爲 16383。(可是實際上MySQL要求一個行的定義長度不能超過65535個字節,所以,除非表中只有這一個字段,不然 n
的值達不到上述的最大值)。編碼
VARCHAR 使用1-2個額外字節記錄字符串長度,列長度小於等於255個字符時,使用1個字節記錄,不然使用2個字節。code
類型 | 大小 | 用途 |
---|---|---|
TINYBLOB | 0 - 255 字節 | 不超過 255 個字符的二進制字符串 |
BLOB | 0 - 65535 字節 | 二進制形式的長文本數據(<64KB) |
MEDIUMBLOB | 0 - 16777215 字節 | 二進制形式的中等長度文本數據(<16MB) |
LONGBLOB | 0 - 4294967295 字節 | 二進制形式的極大文本數據(<4GB) |
類型 | 大小(字節) | 範圍 | 格式 | 用途 |
---|---|---|---|---|
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 | 混合日期和時間值,時間戳 |
使用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 設置編碼。ci
CREATE TABLE IF NOT EXISTS `user` ( ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT '用戶表'
建立名爲 id
的字段,整型,非負數,不能爲空,自增。unicode
若是你不想字段爲 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`)
SHOW TABLES
用於查看數據庫中的全部數據表。
mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | user | +----------------+ 1 row in set (0.07 sec)
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)
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 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)
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)
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)
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)
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)
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)
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
刪除數據表時,要刪除的數據表必須存在,不然會報錯。
DROP TABLE tablename
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