【MySQL】数据类型和表的操作

目录

[一. 常用的数据类型](#一. 常用的数据类型)

1.数值类型

[1.1 整形类型](#1.1 整形类型)

[1.2 浮点型类型](#1.2 浮点型类型)

2.字符串类型

char和varchar的区别

如何选择char和varchar

3.日期类型

4.二进制类型

[二. 表的操作](#二. 表的操作)

1.查看所有表

2.表的创建

3.查看表的结构

4.表的修改

[4.1 添加新的列](#4.1 添加新的列)

[4.2 修改表中现有的列](#4.2 修改表中现有的列)

[4.3 删除表中现有的列](#4.3 删除表中现有的列)

[4.4 重命名表中现有的列](#4.4 重命名表中现有的列)

[4.5 重命名当前表](#4.5 重命名当前表)

5.表的删除


一. 常用的数据类型

在我们日常开发中最用的MySQL数据类型有:数值类型、字符串类型、日期型类型、二进制类型,MySQL中的数据类型和我们之前学习的java中的基本类型是类似的,都是用来存储不同类型的数据,接下来我们分别来认识一下这些类型的特点。

1.数值类型

1.1 整形类型

注:M表示每个值的位数

|------------------|-------|----------------------------------------------|
| 类型 | 大小 | 说明 |
| BIT[(M)] | bit | 只能存0或者1(相当于只能存二进制位的数)取值范围为1 ~ 64,省略M则默认大小为1 |
| TINYINT | 1byte | 取值范围-2^7 ~ 2^7-1,无符号取值范围2^8-1 |
| BOOL | 1byte | 只能包含1位数字的值,值为0则为假,非零则为真 |
| SMALLINT[(M)] | 2byte | 取值范围 -2^15 ~ 2^15-1,无符号取值范围2^16-1 |
| MEDIUMINT[(M)] | 3byte | 取值范围 -2^23 ~ 2^23-1,无符号取值范围2^24-1 |
| INT[(M)] | 4byte | 取值范围 -2^31 ~ 2^31-1,无符号取值范围2^32-1 |
| INTEGER[(M)] | 4byte | INT[(M)]的同义词(用哪个都行) |
| BIGINT[(m)] | 8byte | 取值范围 -2^63 ~ 2^63-1,无符号取值范围2^64-1 |

在现在存储资源不缺乏的情况下,我们能用BIGINT类型就用BIGINT类型,因为取值范围更大,避免不必要的错误

1.2 浮点型类型

|------------------|--------|------------------------------------------------------------------------------------------------|
| 类型 | 大小 | 说明 |
| FLOAT[(M,D)] | 4byte | 单精度浮点型,M表示总位数,D表示小数点后面的位置,大约可以精确到小数点后面7位 |
| DOUBLE[(M,D)] | 8byte | 双精度浮点型,M表示总位数,D表示小数点后面的位置,大约可以精确到小数点后面15位 |
| DECIMAL[(M,D)] | 动态 | 不存在精度丢失,DECIMAL的最大位数为65 ,最⼤⼩数位数为30。如果省略M,则默认为10,如果省略D,则默认为0。M中不计算⼩数点和负数的-号,如果D为0,则值没有⼩数点和⼩数部分。 |

因为FLOATDOUBLE 的精度丢失问题,在我们的开发中时一般不使用这两种类型,我们都使用DECIMAL,那么DECIMAL是如何保证数据精度是不受损失的?

假设我们现在有一个浮点数:123456789987654321123456789.123456789987654321123456789

那么Decimal的底层是将这个浮点数进行拆分,每一份用一个int表示:(小数点和符号不记录)

整数位:123456789 | 987654321 | 123456789 | 小数位:123456789 | 987654321 | 123456789

整数部分用了3个int 表示,小数部分用了3个int表示

那么假设后面还有多余的小数(剩余部分),那么就会使用最小的合适的数据类型进行存储,最终通过这样的方式保存数据,就保证了数据精度不受损失。

那么在我们真实的开发过程中,如果遇上描述金额的所需要的数据类型时,一般有以下两种解决方式:

  1. 用上述说的不损失精度的Decimal类型
  2. 将金额的单位转换成分或者更小的单位,使用int类型去存储(这是一个小技巧)

2.字符串类型

|----------------------|----------------------------------------------------------------------------------|
| 类型 | 说明 |
| CHAR[(M)] | 固定长度的字符串,以字符为单位,取值范围为0 ~ 255,M省略长度默认为1 |
| VARCHAR[(M)] | 可变长度字符串,取值范围为0 ~ 65535 ,有效字符个数取决于实际字符数和使用字符集,例如使用utf8mb4字符集时65535/4约等于16383个字符 |
| TINYTEXT | 小文本类型,最大长度为255个字节 |
| TEXT[(M)] | 文本类型,最大长度为65535字节 |
| MEDIUMTEXT | 中文本类型,最大长度为16777215字节 |
| LONGTEXT | 大文本类型,最大长度为4294967295字节 |
| enum(value,value...) | 枚举类型: * 从值列表 'value1','value2' 或 ''(空字符串) 和 NULL 中选⼀个值 * 最多可以有 65,535 个不同的元素 |
| set(value,value...) | 集合 * 从值列表 'value1','value2' 中选零个或多个值 * 最多64个元素 |

注:当我们使用TEXT类型时,如果超出的最大长度,那么它就是自动变为MEDIMTEXT类型,当超出 MEDIMTEXT类型时就会自动转变成LONGTEXT类型

char和varchar的区别

  • char是固定长度的字符串,获取列的值时会从尾部删除空格(就像java中的next()读入一样,不会读入末尾的空格,但是一个字符串如果中间存在空格,那么是会保留的)
  • varchar是可变长度字符串,有效⻓度取决于实际字符数和使⽤的字符集,获取列的值时不会从尾部删除空格,插⼊数据时会删除超出⻓度的空格。

举个例子:

varchar类型的字符串是会保留空格的,char类型的字符串将后面的空格进行了删除

如何选择char和varchar

  • 如果数据确定⻓度都⼀样,就使⽤定⻓ CHAR 类型,⽐如:⾝份证,md5,学号,邮编。
  • 如果数据⻓度有变化,就使⽤变⻓ VARCHAR , ⽐如:名字,地址,但要规划好⻓度,保证最⻓的字符串能存的进去。
  • 定⻓ CHAR 类型⽐较浪费磁盘空间,但是效率⾼。
  • 变⻓ VARCHAR 类型⽐较节省磁盘空间,但是效率低

3.日期类型

|----------|---------|-------------------------------------------------------------------------------------------------------------------|
| 类型 | 大小 | 说明 |
| DATE | 3 bytes | 日期类型 ⽀持范围 1000-01-01 ~ 9999-12-31 显⽰格式为 YYYY-MM-DD |
| TIME | 3 bytes | 时间类型 ⽀持范围 -838:59:59.000000 ~ 838:59:59.000000 显⽰格式为 hh:mm:ss |
| DATETIME | 8 bytes | ⽇期类型和时间类型的组合 ⽀持范围 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.499999 显⽰格式为 YYYY-MM-DD hh:mm:ss[.fraction] |
| YEAR | 1 bytes | 4位格式的年份 ⽀持范围 1901 ~ 2155 显⽰格式为 YYYY |

4.二进制类型

|-----------|--------------------------------|
| 类型 | 说明 |
| BINARY | 固定长度二进制字节,存储的是二进制字节,取值范围0~255 |
| VARBINARY | 可变长度二进制字节,存储的是二进制字节 |

注:在现在的开发中我们已经不使用二进制类型来存储数据了 ,了解即可

二. 表的操作

数据库中的表就像java中的一个类,那么我们一起来学习一下表的基本操作,那么我们需要先新建一个库,在库中来实现表的一些操作~

1.查看所有表

在创建表之前,我们肯定需要查看一下当前库中已经具备了哪些表,以防止重复创建:

复制代码
show tables;

那么可以看见当前库中没有任何的表,这时候我们就要来创建表啦!

2.表的创建

创建表的语法:

复制代码
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    field datatype [约束] [comment '注解内容']
    [, field datatype [约束] [comment '注解内容']] ...
) [engine 存储引擎] [character set 字符集] [collate 排序规则];
  • field:列名
  • datatype:数据类型
  • comment:对列的描述或说明
  • engine:存储引擎,不指定则使⽤默认存储引擎
  • character set:字符集,不指定则使⽤默认字符集
  • collate:排序规则,不指定则使⽤默认排序规则

现在我们来创建一个学生表:

复制代码
create table users (
  name VARCHAR(20) comment'姓名',
  age BIGINT COMMENT'年龄',
  class VARCHAR(20)COMMENT'班级'
) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;

此时一个学生表就创建完成了,接下来我们查看一下当前学生表的结构~

3.查看表的结构

语法:

复制代码
desc 表名;

查看刚才创建的学生表:

  • Field:表中的列名
  • Type:列的数据类型
  • Null:该列的值是否允许为Null
  • Key:该列的索引类型
  • Default:该列的默认值
  • Extra:扩展信息

4.表的修改

在我们的项目实际开发中,经常会对表结构进行调整,这个时候就要对表进行修改操作

复制代码
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
  • tbl_name:要修改的表名
  • ADD:向表中添加列
  • MODIFY:修改表中现有的列
  • DROP:删除表中现有的列
  • RENAME COLUMN:重命名表中现有的列
  • RENAME [TO | AS] new_tbl_name:重命名当前的表

这么多修改表的操作,我们一个一个来看:

4.1 添加新的列

假设我们现在需要为刚才创建的添加一个birthday列;

此时birthday列就被添加成功了,那么这是在尾部插入一个新的列,那么现在我想在头部插入一个gender列能不能实现呢?其实是可以实现的,只需要将最后的after改成first即可:

4.2 修改表中现有的列

那么假设说现在name列的varchar( 20 )不够用了,我需要做出调整改成varchar( 40 ):

4.3 删除表中现有的列

现在我不需要birthday这个列了,需要将它删除:

此时表中的birthday这个字段就被删除了

4.4 重命名表中现有的列

现在我需要将表中的name字段重命名成studentname:

4.5 重命名当前表

我现在需要将当前student表重命名成students:

5.表的删除

语法:

复制代码
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
  • TEMPORARY:表⽰临时表
  • tbl_name:将要删除的表名

现在我们将刚才创建的students表删除:

删除表不仅可以单个删除,同时也可以进行多个删除,那么我们现在重新创建两个表:student表和class表,然后进行多个表同时删除

注:表的创建和删除跟库的创建和删除是类似的,都可以加上 if not exists 和 if exists来防止报错

相关推荐
极客智谷10 分钟前
深入理解Java线程池:从原理到实战的完整指南
java·后端
鱼儿也有烦恼11 分钟前
MySQL最新安装、连接、卸载教程(Windows下)
mysql·navicat
代码不行的搬运工17 分钟前
HTML快速入门-4:HTML <meta> 标签属性详解
java·前端·html
Databend1 小时前
大数据是不是凉了?
数据库
mask哥1 小时前
详解最新链路追踪skywalking框架介绍、架构、环境本地部署&配置、整合微服务springcloudalibaba 、日志收集、自定义链路追踪、告警等
java·spring cloud·架构·gateway·springboot·skywalking·链路追踪
XU磊2601 小时前
javaWeb开发---前后端开发全景图解(基础梳理 + 技术体系)
java·idea
学也不会1 小时前
雪花算法
java·数据库·oracle
晓华-warm1 小时前
国产免费工作流引擎star 5.9k,Warm-Flow版本升级1.7.0(新增大量好用功能)
java·中间件·流程图·开源软件·flowable·工作流·activities
凭君语未可1 小时前
介绍 IntelliJ IDEA 快捷键操作
java·ide·intellij-idea
码上飞扬2 小时前
Java大师成长计划之第5天:Java中的集合框架
java·开发语言