在学会创建数据库之后,在数据库中需要创建表(实体以表的形式存在),以及对表中存储的数据记录进行定义,相当于 Java 语言中对类编写其属性。在定义前我们需要了解 SQL 语言有哪些数据类型。
一、数据类型
1.1 数据值类型
1.1.1 整型
类型 | 大小 | 说明 | 对应 Java 类型 |
---|---|---|---|
bit [(M)] | 默认 bit | 位值类型。M表示每个值的位数,取值范围是1~64.如果省略M,则默认是1 | |
tinyint [(M)] | 1 byte | 取值范围 -2⁷ ~ 2⁷-1(-128到127),无符号取值范围2⁸-1 | Byte |
bool | 1 byte | 通常用 tinyint(1) 表示true。值为零表示假,非零表示真 | Boolean |
smallint [(M)] | 2 byte | 取值范围 -2¹⁵ ~ 2¹⁵-1,无符号取值范围 2¹⁶-1 | Short |
mediumint [(M)] | 3 byte | 取值范围 -2²³ ~ 2²³-1,无符号取值范围 2²⁴-1 | |
int [(M)] | 4 byte | 取值范围 -2³¹ ~ 2³¹-1,无符号取值范围 2³²-1 | Int |
integer [(M)] | 4 byte | int[(M)] 的同义词 | Integer |
bigint [(M)] | 8 byte | 取值范围 -2⁶³ ~ 2⁶³-1,无符号取值 2⁶⁴-1 | Long |
bigint 一般用来作编号的类型。
1.1.2 浮点型
类型 | 大小 | 说明 |
---|---|---|
float [(M,D)] | 4 byte | 单精度浮点型,M是总位数,D是小数点后面的位数,大约可以精确到小数点后7位。 |
double [(M,D)] | 8 byte | 单精度浮点型,M是总位数,D是小数点后面的位数,大约可以精确到小数点后15位。 |
decimal [(M,D)] | 动态 | 不存在精度损失,M是总位数,D是小数点后面的位数。decimal的最大位数(M) 是65,最大小数位数(D)是30.如果省略M,则默认是10,如果省略D,则默认为0。M中不计算小数点和负数的-号,如果D为0,则值没有小数点和小数部分。 |
decimal 一般用于表示金额 / 价格,可以存放很大的数,也可以根据项目要求自己设置小数精度,适用范围广。
1.2 字符串类型
类型 | 说明 |
---|---|
char [(M)] | 固定长度字符串,M表示长度,以字符为单位,取值范围0~255,M省略则长度为1 |
varchar (M) | 可变长度字符串,M表示字符最大长度,取值范围0~65535字节,有效字符个数取决于实际指定的字符数和使用的字符集,最常用 |
tinytext | 小文本类型,最大长度为255个字节,有效字符个数取决于使用的字符集 |
text [(M)] | 文本类型,最大长度为65535个字节,有效字符个数取决于使用的字符集 |
midiumtext | 中文本类型,最大长度为16,777,215个字节,有效字符个数取决于使用的字符集 |
longtext | 大文本类型,最大长度为4,294,967,295 即4GB个字节,有效字符个数取决于使用的字符集 |
对于 varchar 最常用的字符串类型其大小如果以字符为单位,就需要根据字符的具体情况用 1~4 个字节来表示一个字符。在 utf8mb4 编码集下,一个 varchar 字段最多可以存放 65535 / 4 = 16383 个字符。
1.3 二进制类型
文本类型是人类能直接看懂的,而二进制类型,则是给机器看的。
类型 | 大小 |
---|---|
binary [(M)] | 固定长度二进制字节,与char类似,但存储的是二进制字节而不是字符串。M表示长度,以字节为单位,取值范围0~255,M省略则长度为1 |
varbinary (M) | 可变长度二进制字节,与varchar类似,但存储的是二进制字节而不是字符串。M表示长度,以字节为单位 |
tinyblob | 小二进制字节类型,最大长度为255个字节 |
blob [(M)] | 二进制字节类型,最大长度为65535个字节 |
midiumblob | 中二进制字节类型,最大长度为16,777,215个字节 |
longblob | 大二进制字节类型,最大长度为 4,294,967,295即4GB个字节 |
1.4 日期类型
数据类型 | 大小 | 说明 | 对应Java类型 |
---|---|---|---|
datetime [(fsp)] | 8字节 | 日期类型和时间类型结合 范围从1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59:59.499999,不会进行时区的检索及转换 显示格式 yyyy-mm-dd hh:mm:ss[.fraction] 0值为 0000-00-00 00:00:00 | java.util.Date, java.sql.Timestamp |
timestamp | 4字节 | 时间戳类型 范围从1970-01-01 00:00:01.000000 到2038-01-19 03:14:07.499999,自动检索当前时区并进行转换 0值为 0000-00-00 00:00:00 | java.util.Date, java.sql.Timestamp |
date | 3 字节 | 日期类型 支持范围 1000-01-01 到 9999-12-31 显示格式 yyyy-mm-dd 0值 0000-00-00 | |
time [(fsp)] | 3 字节 | 时间类型 支持范围 -838:59:59.000000 ~ 838:59:59.000000 显示格式为 hh:mm:ss[.fraction] 0值 00:00:00 | |
year [(4)] | 1 字节 | 4位格式的年份 支持范围 1901~2155 |
fsp 为可选设置,用来指定小数秒精度,范围从 0~6,值为0表示没有小数部分,如果省略,默认精度为0;
对于 timestamp 时间戳,一旦时间超过2038年就会出现溢出的问题,因此现在普遍使用 datetime 类型。
1.5 枚举和集合
类型 | 说明 |
---|---|
enum('value1', 'value2', ...) | 枚举 从值列表 'value1','value2'或 ''(空字符串)和null中选一个值 最多可以有65535个不同的元素 单个元素的最大长度是 M <= 255 或 (M * w) <= 1020,其中M是元素字符长度,w是字符集中字符所需的最大字节数 enum 的值在内部表示为整数 |
set('value1', 'value2', ...) | 集合 从值列表 'value1','value2'...中选零个或多个值 最多64个元素 单个元素的最大长度是 M <= 255 或 (M * w) <= 1020,其中M是元素字符长度,w是字符集中字符所需的最大字节数 set 值在内部表示为整数 |
二、表操作指令
在操作表之前,应该要选择要操作的目标数据库,才能对表进行操作。
2.1 查看所有表指令:show tables;
2.2 创建表
create [temporary] table [if not exists] tbl_name (field datatype [约束] [comment '注解内容'][, field datatype [约束] [comment '注解内容']] ...) [engine 存储引擎] [character set 字符集] [collate 排序规则];
• temporary:表示创建的是一个临时表
• field:列名
• datatype:数据类型
• comment:对列的描述或说明
• engine:存储引擎,不指定则使⽤默认存储引擎
• characterset:字符集,不指定则使⽤默认字符集
• collate:排序规则,不指定则使⽤默认排序规则
注意:定义字段时,最后一个字段是没有逗号的,且定义字段用一个小括号括起来,最后要以分号结束。
示例:创建一个学生表,表中包含3个字段,id表示学生号,name表示学生姓名,gender表示性别
2.3 查看表结构指令:desc 表名
2.4 删除表
drop [temporary] table [if exists] tbl_name [,tab_name]...
命令行客户端工具只执行一些简单的查询指令,如果一两句 SQL 可以解决的可以用命令行工具执行。但对于比较复杂的 SQL,比如表涉及、复杂查询,建议还是使用可视化工具。MySQL 就提供了快捷方式 MySQL Workbench 工具。以下是使用该工具进行建表的示例:
2.5 修改表 alter
alter table tbl_name [alter_option [, alter_option] ...];alter_option: {table_options| add [COLUMN] col_name column_definition [FIRST | AFTER col_name]| modify [COLUMN] col_name column_definition [FIRST | AFTER col_name]| drop [COLUMN] col_name| rename COLUMN old_col_name TO new_col_name| rename [TO | AS] new_tbl_name
}
2.5.1 add 向表中新增一列
alter table 表名 add 列名 数据类型 [comment '注释' after 指定列名];
2.5.2 modify 修改某列的长度
alter table 表名 modify 列名 数值长度;
2.5.3 rename 重命名某列
alter table 表名 rename column 要修改的原始列名 to 新列名;
2.5.4 drop 删除某个字段
alter table 表名 drop 列名;
2.5.5 rename to 修改表名
alter table 旧表名 rename to 新表名; / rename table 旧表名 to 新表名;