MySQL 是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
如需在Windows系统安装请参考安装教程。本教程适用于MySQL8.0以后版本。
本文为基础教程,后续更新中级、高级教程。
MySQL 支持多种类型,常用的可以分为三类:数值、字符串和日期/时间类型。另外还有空间数据类型、JSON数据类型,这里不做介绍。
[]
表示类型定义的可选属性,没有[]
表示必选属性。
MySQL 支持所有标准 SQL 数值数据类型。
这些类型包括严格数值数据类型(TINYINT
、SMALLINT
、MEDIUMINT
、INT
和 BIGINT
),浮点数值数据类型(FLOAT
、DOUBLE
),定点类型 DECIMAL
,位值数据类型BIT
。
1、整数类型
对于整数数据类型,M
表示最大显示宽度;UNSIGNED
表示无符号,不允许负值,默认有符号;ZEROFILL
零填充,默认无填充。最大显示宽度为255
。
类型及属性 | 大小 | 范围(有符号) | 范围(无符号) | 类型描述 |
---|---|---|---|---|
TINYINT[(M)] [UNSIGNED] [ZEROFILL] |
1 bytes |
(-128,127) |
(0,255) |
极小整数 |
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] |
2 bytes |
(-32768,32767) |
(0,65535) |
小整数 |
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] |
3 bytes |
(-2 23,2 23-1) |
(0,2 24 ) |
中等整数 |
INT[(M)] [UNSIGNED] [ZEROFILL] 或INTEGER[(M)] [UNSIGNED] [ZEROFILL] |
4 bytes |
(-2 31,2 31-1) |
(0,2 32 ) |
整数 |
BIGINT[(M)] [UNSIGNED] [ZEROFILL] |
8 bytes |
(-2 63,2 63-1) |
(0,2 64 ) |
大整数 |
从MySQL 8.0.17开始,整数数据类型的显示宽度(M)
属性已弃用。
2、浮点数类型
对于浮点数据类型,M
是可以存储的总位数,D
是小数点后的位数,UNSIGNED
表示无符号,不允许负值,默认有符号,从MySQL 8.0.17开始,该属性已被弃用;ZEROFILL
零填充,默认无填充。
类型 | 大小 | 描述 |
---|---|---|
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] |
4 bytes |
一个小(单精度)浮点数。如果省略 M 和 D,则值将存储到硬件允许的限制。单精度浮点数精确到大约7 位小数。FLOAT(M,D) 是一个非标准的 MySQL 扩展。从MySQL 8.0.17开始,对浮点数类型,此语法已被弃用。 |
FLOAT(p) [UNSIGNED] [ZEROFILL] |
4 bytes |
浮点数。p 表示以位为单位的精度,但MySQL仅使用此值来确定是使用FLOAT 还是DOUBLE 作为结果数据类型。如果p 介于0 到 24 之间,则数据类型变为FLOAT ,没有M 或D 值。如果p 从25 到53 ,则数据类型变为DOUBLE ,没有M 或D 值。结果列的范围与单精度FLOAT 或双精度DOUBLE 数据类型的范围相同。 |
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] |
8 bytes |
正常大小(双精度)浮点数。如果省略 M 和D ,则值将存储到硬件允许的限制。双精度浮点数精确到大约15 位小数。DOUBLE(M,D) 是一个非标准的 MySQL 扩展。从MySQL 8.0.17开始,此语法已被弃用, |
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL] 或REAL[(M,D)] [UNSIGNED] [ZEROFILL] |
8 bytes |
这些类型是DOUBLE 的同义词。例外:如果启用了REAL_AS_FLOAT SQL 模式,则REAL 是FLOAT 而不是DOUBLE 的同义词。 |
3、定点类型
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
或DEC[(M[,D])] [UNSIGNED] [ZEROFILL]
M
是总位数(精度),D
是小数点后的位数(小数位数)。小数点和(对于负数)符号不以M
为单位计算。如果D
为0
,则值没有小数点或小数部分。十进制的最大位数 M
为65
。支持的最大小数位数 D
为30
。如果省略D
,则默认值为0
。如果省略M
,则默认值为10
。4、位值类型
BIT[(M)]
M
表示每个值的位数,从 1
到64
。如果省略M
,则默认值为1
。字符串数据类型为 CHAR
、VARCHAR
、BINARY
、VARBINARY
、BLOB
、TEXT
、ENUM
和 SET
。
1、普通字符串类型
对于字符串列(CHAR
,VARCHAR
和TEXT
类型)的定义,MySQL以字符单位解释长度规范。共有属性:CHARACTER SET
指定字符集,CHARSET
等同于CHARACTER SET
;COLLATE
指定字符集排序规则。
类型及属性 | 类型描述 |
---|---|
[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name] |
NATIONAL CHAR 等同于NCHAR ,MySQL用作此预定义字符集。一个固定长度的字符串,在存储时始终用指定长度的空格右填充。 M 表示以字符为单位的列长度。M 的范围是0 到255 。如果省略M ,则长度为1 。 |
[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name] |
NATIONAL VARCHAR 是定义VARCHAR 列应使用某些预定义字符集的标准SQL方法。MySQL用作此预定义字符集。NVARCHAR 是NATIONAL VARCHAR 的简写。可变长度字符串。 M 表示最大列长度(以字符为单位)。M 的范围是0 到65535 。VARCHAR 的有效最大长度取决于最大行大小(65535 字节,在所有列之间共享)和使用的字符集。例如,字符每个字符最多需要三个字节,因此可以使用字符集的VARCHAR 列声明为最多21844 个字符。 |
TEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name] |
最大长度为 65535 (216 − 1)个字符的TEXT 列。如果值包含多字节字符,则有效最大长度较小。每个TEXT 值都使用2 字节长度前缀进行存储,该前缀指示值中的字节数。对于此类型,可以给出可选的长度M ,MySQL会将列创建为最小的TEXT 类型,该类型足够大,可以容纳M 个字符长的值。 |
TINYTEXT [CHARACTER SET charset_name] [COLLATE collation_name] |
最大长度为 255 (28−1)个字符的TEXT 列。如果值包含多字节字符,则有效最大长度较小。每个TINYTEXT 值都使用1 字节长度前缀进行存储,该前缀指示值中的字节数。 |
MEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name] |
最大长度为16777215 (224−1)字节的TEXT 列。如果值包含多字节字符,则有效最大长度较小。每个MEDIUMTEXT 值都使用3 字节长度前缀进行存储,该前缀指示值中的字节数。 |
LONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name] |
最大长度为4294967295 或4GB (232−1)个字符的TEXT 列。如果值包含多字节字符,则有效最大长度较小。LONGTEXT 列的有效最大长度还取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个LONGTEXT 值都使用4 字节长度前缀进行存储,该前缀指示值中的字节数。 |
指定字符串数据类型的属性会导致将列创建为相应的二进制字符串数据类型:CHAR
变为BINARY
,VARCHAR
变为VARBINARY
,TEXT
变为BLOB
。对于ENUM
和SET
数据类型,不会发生这种情况它们是按照声明创建的。
2、二进制字符串类型
对于二进制字符串列(BINARY
,VARBINARY
和BLOB
类型)的定义,MySQL以字节为单位解释长度规范。在mysql客户端中,二进制字符串使用十六进制表示法显示。
类型及属性 | 类型描述 |
---|---|
BINARY[(M)] |
BINARY 类型类似于CHAR 类型,但存储二进制字节字符串而不是非二进制字符串。可选长度M 表示列长度(以字节为单位)。如果省略,M 默认为1 。 |
VARBINARY(M) |
VARBINARY 类型类似于VARCHAR 类型,但存储二进制字节字符串而不是非二进制字符串。M 表示最大列长度(以字节为单位)。 |
BLOB[(M)] |
最大长度为65535 (216−1)字节的BLOB 列。每个BLOB 值都使用2 字节长度前缀进行存储,该前缀指示值中的字节数。对于此类型,可以给出可选的长度M ,MySQL会将列创建为最小的BLOB 类型,该类型足够大,可以容纳M 字节长的值。 |
TINYBLOB |
最大长度为255 (28−1)字节的BLOB 列。每个TINYBLOB 值都使用1 字节长度前缀进行存储,该前缀指示值中的字节数。 |
MEDIUMBLOB |
最大长度为16777215 (224−1)字节的BLOB 列。每个MEDIUMBLOB 值都使用3 字节长度前缀进行存储,该前缀指示值中的字节数。 |
LONGBLOB |
最大长度为4294967295 或 4GB (232−1)字节的BLOB 列。LONGBLOB 列的有效最大长度取决于客户端/服务器协议中配置的最大数据包大小和可用内存。每个LONGBLOB 值都使用4 字节长度前缀进行存储,该前缀指示值中的字节数。 |
3、枚举类型
ENUM('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]
ENUM
值在内部表示为整数。一个ENUM
列最多可以有65535
个不同的元素。单个元素支持的最大长度为M <= 255
和(M x w) <= 1020
,其中M
是元素文本长度,w
是字符集中最大长度字符所需的字节数。4、集合类型
SET('value1','value2',...) [CHARACTER SET charset_name] [COLLATE collation_name]
SET
值在内部表示为整数。一个SET
列最多可以有64
个不同的成员。单个元素支持的最大长度为M <= 255
和(M x w) <= 1020
,其中M
是元素文本长度,w
是字符集中最大长度字符所需的字节数。用于表示时态值的日期和时间数据类型为DATE
,TIME
,DATETIME
,TIMESTAMP
和YEAR
。每个时态类型都有一个有效值范围,以及当你指定MySQL无法表示的无效值时可以使用的“零”值
。TIMESTAMP
和DATETIME
类型具有特殊的自动更新行为。
数据类型 | 范围 | 描述 | 零值 |
---|---|---|---|
DATE |
1000-01-01~9999-12-31 |
日期,MySQL以格式YYYY-MM-DD 显示DATE 值,允许使用字符串或数字将值分配给DATE列。 |
0000-00-00 |
TIME[(fsp)] |
-838:59:59.000000~838:59:59.000000 |
时间,MySQL以格式hh:mm:ss[.fraction] 显示TIME 值,允许使用字符串或数字将值分配给TIME 列。 |
00:00:00 |
DATETIME[(fsp)] |
1000-01-01 00:00:00.000000~9999-12-31 23:59.999999 |
日期和时间组合。MySQL以格式YYYY-MM-DD hh:mm:ss[.fraction] 显示DATETIME 值,允许使用字符串或数字将值分配给DATETIME 列。 |
0000-00-00 00:00:00 |
TIMESTAMP[(fsp)] |
1970-01-01 00:00:01.000000~2038-01-19 03:14:07.999999 |
时间戳。TIMESTAMP 值存储为自纪元(UTC)1970-01-01 00:00:00 以来的秒数。TIMESTAMP 不能表示该值1970-01-01 00:00:00 ,因为这相当于纪元的0 秒,并且值0 保留用于表示“零” TIMESTAMP 值。 |
0000-00-00 00:00:00 |
YEAR[(4)] |
1901~2155 |
4位数格式的年份,MySQL以YYYY 格式显示YEAR 值,允许使用字符串或数字将值分配给YEAR 列。 |
0000 |
从 MySQL 8.0.19开始,不推荐使用具有显式显示宽度的YEAR(4)
数据类型,请使用不带显示宽度的YEAR
,这具有相同的含义。
登录数据库
mysql -uroot -p
按Enter
输入密码,在按Enter
。
1、创建数据库
创建名为map_information_of_china
的数据库。
CREATE DATABASE map_information_of_china;
创建名为map_information_of_china
的数据库,并设置字符集为gbk
。
CREATE DATABASE map_information_of_china CHARACTER SET gbk;
2、查看数据库
查看所有数据库。
SHOW DATABASES;
查看数据库map_information_of_china
的详情;
SHOW CREATE DATABASE map_information_of_china;
3、选择数据库
选择数据库map_information_of_china
。
USE map_information_of_china;
4、删除数据库
删除数据库map_information_of_china
。
DROP DATABASE map_information_of_china;
1、创建数据表
创建表之前要先选择数据库,表示在该数据库下创建表。要在其它数据库下创建,重新选择其它数据库即可。
(1)在数据库map_information_of_china
下创建名为province_information
的数据表,并添加字段province_id
(省份编号)、province_name
(省份名称)、province_abbreviation
(省份简称)、province_area
(省份面积)。在创建数据表时,字段后面要说明字段的数据类型。一个字段为一列,一个表只少要有一列,否则无法创建表。
USE map_information_of_china;
CREATE TABLE province_information(
province_id INT,
province_name VARCHAR(12),
province_abbreviation char(4),
province_area int);
(2)创建数据表province_information
,若数据表存在则不创建。
CREATE TABLE IF NOT EXISTS province_information(
province_id INT,
province_name VARCHAR(12),
province_abbreviation char(4),
province_area int);
(3)创建数据表province_information
,并设置数据引擎为innoDB
,默认字符集为utf8
。
CREATE TABLE province_information(
province_id INT,
province_name VARCHAR(12),
province_abbreviation char(4),
province_area int)
ENGINE = innoDB DEFAULT CHARACTER SET = utf8;
(4)创建数据表时,字段类型后可添加属性(或叫约束)。用来约束该字段(或叫该列)的值。常用的几种约束类型见下表。
属性名称 | 描述 |
---|---|
NOT NULL |
表示该列值不能为空。 |
DEFAULT 'XX' |
在没有给定值时,将该列默认值设置为XX 。默认值格式按对应数据类型书写。 |
PRIMARY KEY |
将该列字段设置为主键。一个数据表中只能存在一个主键约束。 |
AUTO_INCREMENT |
将该列值设置为自增,一般用于主键约束的列。 |
COMMENT 'xx' |
注释,对该列的说明注释。 |
创建数据表province_information
,将字段province_id
设置为主键自增,将字段province_name
设置不能为空,将字段province_area
默认值设置为0
,并将每一列进行注释说明。
CREATE TABLE province_information(
province_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '省份编号',
province_name VARCHAR(12) NOT NULL COMMENT '省份名称',
province_abbreviation char(4) COMMENT '省份简称',
province_area int DEFAULT 0 COMMENT '省份面积') ;
2、查看数据表
(1)查看当前数据库下所有表。
SHOW TABLES;
(2)查看指定表province_information
的表结构。
第一种方式:
DESC province_information;
第二种方式:
SHOW COLUMNS FROM province_information;
(3)查看表province_information
的创建详情。
SHOW CREATE TABLE province_information;
3、修改数据表
(1)修改数据表名。
将数据表province_information
名称修改为province_info
。
RENAME TABLE province_information TO province_info;
(2)修改数据表的引擎和字符集。
将数据表privince_infomation
的引擎修改为innoDB
,字符集修改为gbk
。
ALTER TABLE province_information ENGINE=innoDB CHARSET=gbk;
4、删除数据表
(1)删除数据表province_information
的表结构及表中数据。
DROP TABLE province_information;
(2)删除数据表province_information
的表结构及数据并安原表结构重新创建此表。
TRUNCATE TABLE province_information;
(3)仅删除数据表province_information
的表中数据,保留其表结构。
DELETE FROM province_information;
注意:此方法仅删除表中数据,并不能清除设置自增列的数值,新添加数据并不能从
0
开始自增。
1、添加数据表字段
(1)在最后一列添加字段
在数据表province_information
的最后一列添加字段create_time
(创建时间)。
ALTER TABLE province_information ADD create_time DATETIME COMMENT '创建时间';
(2)在第一列添加字段
在数据表province_information
的第一列添加字段id
。
ALTER TABLE province_information ADD id int FIRST;
(3)在省份简称province_abbreviation
字段后面添加字段population_quantity
(人口数量)。
ALTER TABLE province_information ADD population_quantity int COMMENT '人口数量' AFTER province_abbreviation;
2、查看数据表字段
查看表字段有两种方式:
(1)通过查看表结构查看。
查看数据表province_information
的表字段。
DESC province_information;
(2)通过查看表的列信息查看。
查看数据表province_information
的表字段。
SHOW COLUMNS FROM province_information;
3、修改数据表字段
(1)修改表字段名称和类型。
将数据表province_information
的字段province_abbreviation
修改为abbreviation
,类型为varchar
。
ALTER TABLE province_information CHANGE province_abbreviation abbreviation varchar(4);
(2)修改数据表的字段类型
将数据表province_information
的字段province_abbreviation
的类型修改为varchar
。
ALTER TABLE province_information MODIFY province_abbreviation varchar(4);
(3)调整数据表中某个字段的位置
将数据表province_information
中province_abbreviation
字段调整至第一列。
ALTER TABLE province_information MODIFY province_abbreviation char(4) FIRST;
将数据表province_information
中province_abbreviation
字段调整至province_name
后面。
ALTER TABLE province_information MODIFY province_abbreviation varchar(4) AFTER province_name;
在更改位置的同时可以修改字段的类型。
(4)修改字段默认值
将数据表province_information
中字段population_quantity
的默认值修改为0
。
ALTER TABLE province_information ALTER population_quantity SET DEFAULT 0;
(5)删除字段默认值
删除数据表province_information
中字段population_quantity
的默认值。
ALTER TABLE province_information ALTER population_quantity DROP DEFAULT;
4、删除数据表字段
删除数据表province_information
中字段population_quantity
。
ALTER TABLE province_information DROP population_quantity;
在数据库map_information_of_china
中创建数据表province_information
,包含以下字段id
(编号)、province_number
(省份编号)、province_name
(省份名称)、province_abbreviation
(省份简称)、province_area
(省份面积)。
USE map_information_of_china;
CREATE TABLE province_information(
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '编号',
province_number INT NOT NULL COMMENT '省份编号',
province_name VARCHAR(12) NOT NULL COMMENT '省份名称',
province_abbreviation CHAR(4) NOT NULL COMMENT '省份简称',
province_area INT DEFAULT 0 COMMENT '省份面积');
1、向数据表中插入数据
(1)全字段(或叫全列)插入数据。
向数据表province_information
中全字段插入数据:(1,41,河南,豫,170000)、(2,13,河北,冀,190000)。
INSERT INTO province_information VALUES
(1,41,'河南','豫',170000),
(2,13,'河北','冀',190000);
插入多条数据依次往后即可。
(2)指定字段插入数据。
向数据表province_information
中的字段province_number
、province_name
、province_abbreviation
插入数据:(43,湖南省,湘)、(42,湖北省,鄂)。
INSERT INTO province_information
(province_number,province_abbreviation,province_name)
VALUES
(43,'湘','湖南省'),
(42,'鄂','湖北省');
注意: 字段顺序可以打乱,但数据必须与插入语句中的字段顺序对应。多条数据依次往后添加即可。
2、查看数据表数据
(1)查看数据表中所有数据。
查看数据表province_information
中的所有数据。
SELECT * FROM province_information;
(2)查看数据表中指定字段中的数据。
查看数据表province_information
中字段province_name
和province_abbreviation
的数据。
SELECT province_name,province_abbreviation FROM province_information;
注:多个字段逗号隔开即可。
(3)高级查询
请关注后续中、高级教程。
3、修改数据表中数据
将数据表province_information
中id=1
的行的province_name
的值修改为:河南省
。
UPDATE province_information SET province_name = '河南省' where id = 1;
where
后跟条件,条件后续会详细介绍。
4、删除数据表中数据
(1)删除表中所有数据
删除数据表province_information
中的所有数据。
DELETE FROM province_information;
此方法不会删除表中设置自增的数据。
(2)删除表中数据,包括自增数据。
删除数据表provice_information
的数据,包括字段id
的自增数据。
TRUNCATE TABLE province_information;
此方法实际是删除此表又重新按原表结构创建数据表。