MySQL建表

1,212 阅读3分钟

1、前言

今天面试字节的时候,非常无奈,面试官不考查询语句,考的是建表语句,这我哪里会?里面的类型基本上都忘记了,今天做一次整体的记录

2、整数类型

整数类型有TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,存储空间及数值范围如下表

---类型存储空间(单位为位)数值范围
TINYINT8-128 ~ 127
SMALLINT16-32768 ~ 32767
MEDIUMINT24-8388608 ~ 8388607
INT32-2147483648 ~ 2147483647
BIGINT64太大了

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)
  • 设定自增 和 主键

参考