1、前言
今天面试字节的时候,非常无奈,面试官不考查询语句,考的是建表语句,这我哪里会?里面的类型基本上都忘记了,今天做一次整体的记录
2、整数类型
整数类型有TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,存储空间及数值范围如下表
---类型 | 存储空间(单位为位) | 数值范围 |
---|---|---|
TINYINT | 8 | -128 ~ 127 |
SMALLINT | 16 | -32768 ~ 32767 |
MEDIUMINT | 24 | -8388608 ~ 8388607 |
INT | 32 | -2147483648 ~ 2147483647 |
BIGINT | 64 | 太大了 |
3、 实数类型
FLOAT
单精度浮点型,使用8位----B
DOUBLE
双精度浮点型,使用16位存储----2B
DECIMAL
float和double进行计算时会发生精度损失,损精度损失原因可参考这篇文章:老板,用float存储金额为什么要扣我工资 需要精度计算的时候可以使用DECIMAL,使用DECIMAL需要额外的空间和计算开销,因此当且仅当需要精度计算时才使用
4、字符串类型
1. VARCHAR和CHAR
varchar和char是非常非常常用的字符串类型
VARCHAR
VARCHAR用于存储变长字符串,使用该类型存储字符串时需要额外使用1或2个额外字节记录字符串的长度:
- 列的最大长度小于或等于255 => 使用1字节
- 列的长度大于255 => 使用2字节
适用VARCHAR作为存储类型的场景:
- 列更新很少 => 列经常更新容易产生页分裂
- 列长度非固定 => VARCHAR存储时只使用必要空间,因此会省空间
CHAR
CHAR用于存储定长字符串,在存储CHAR类型时,会删除所有的末尾空格
使用CHAR最为存储类型的场景
- 列几乎定长
- 列长度很短 => VARCHAR需要额外字节存储长度
- 列经常更新
2. BLOB和TEXT类型
BLOB和TEXT类型都是用来存储很大的数据,比如文章内容这些
BLOB
采用二进制方式存储, BLOB细分又可以分为TINYBLOB,SMALLBLOB,BLOB,MEDIUMBLOB, LONGBLOB
TEXT
采用字符方式存储,TEXT细分又可以分为TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT, LONGTEXT
当BLOB和TEXT值太大时,InnoDB存储会使用外部存储区域来存储值,然后保存一个1~4字节的指针指向外部存储
5、日期和时间类型
常用的日期类型有DATETIME和TIMESTAMP
DATETIME
使用8字节存储,可以保存大范围的值,从1001~9999年
TIMESTAMP
使用4字节存储,保存范围比DATETIME小,从1970~2038年
对于需要存储更小粒度的日期和时间可以使用DOUBLE或BIGINT,当然不是存储小粒度也可以使用BIGINT
6、建表语法
CREATE TABLE table_name (column_name column_type);
- 记住,是先写 表名,再写表的类型
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
7、面试
- 面试时候,考官问的是,创建一张学生表,学生大概10000人,包含,学生学号、学生名字、学生性别、学生住址,需要选择合理的类型
CREATE TABLE IF NOT EXISTS 'students'{
'student_id' SMALLINT AUTO_INCREMENT NOT NULL,
'name' varchar(20) not null,
'age' TINYINT NOT NULL,
'sex' bit default 1,
'birth' datetime not null,
'address' varchar(255) not null,
PRIMARY KEY('student_id')
}ENGINE=InnoDB default CHARSET = UTF-8;
- id:10000 人-可以采用 smallint 进行标识
- name: 名字最长也就20个
- age : 肯定小于100岁, 可采用 TINYINT 进行标识
- sex: 用一个bit 就可以进行标识
- birth 需要采用日期
- 地址: 一般采用 varchar (255)
- 设定自增 和 主键