1.数据库的数据类型
1.1 数值类型
1.1.1 INT(int) 和 BIGINT(bigint)
int 占用4个字节,bigint 占用8个字节,分别和 java 中的 int 和 long 对应;
1.1.2 FLOAT ( float ) 和 DOUBLE ( double )
在 SQL 中,FLOAT和DOUBLE是两种常用的浮点数据类型,它们的主要区别体现在精度 、存储空间 和数值范围上。

但 FLOAT 和 DOUBLE 都存在精度误差,不适合用于需要绝对精确的计算(如财务金额),此时应使用 DECIMAL 类型。
1.1.3 DECIMAL ( decimal )
-
DECIMAL 类型以字符串的形式精确存储数值,因此不存在精度损失,非常适合对精度要求高的计算场景。
-
DECIMAL的核心价值在于精确性,通过牺牲部分存储和性能换取计算可靠性,所以DECIMAL 的存储空间较大,计算速度也慢于整数或浮点类型。
-
DECIMAL ( p , s ) 包含两个参赛,精度(p):指数值的总位数,包括小数点后的数值;小数位数(s):指数值小数点后的位数;如 DECIMAL ( 10 , 2 ) 表示能存储的范围是 -9999999.99 到 9999999.99
1.2 字符串类型
1.2.1 CHAR ( char ) 和 VARCHAR ( varchar )
CHAR和VARCHAR都用于存储较短的字符串,两者的主要区别在于存储方式 和空间效率

1.2.2 TEXT ( text )
TEXT类型用于存储更长的文本字符串,其设计初衷就是为了解决CHAR和VARCHAR长度限制的问题

总结:CHAR用于定长,VARCHAR用于短变长,TEXT用于长变长。正确选择类型不仅能保证数据的正确存储,还能有效提升数据库的性能和节省存储空间
1.3 时间日期类型
1.3.1 TIMESTAMP ( timestamp )
TIMESTAMP类型存储从1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 UTC的时间,基于Unix时间戳(从1970年1月1日开始的秒数)。其核心特性包括:
-
时区相关:存储为UTC时间,查询时根据会话时区自动转换。
-
存储空间小:仅占用4字节。
-
自动更新 :支持
DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP,常用于记录数据变更时间。 -
范围限制:受32位整数限制,无法存储2038年之后的时间
1.3.2 DATETIME ( datetime )
DATETIME类型存储从1000-01-01 00:00:00到9999-12-31 23:59:59的日期时间,格式为YYYY-MM-DD HH:MM:SS。其特点为:
-
时区无关:按原始值存储,不受时区影响
-
存储空间大:占用8字节
-
范围广:覆盖历史及未来几乎所有日期
-
无自动更新:需显式指定默认值或约束
2.表的操作
2.1 查看所有表
进入数据库后,使用 SHOW TABLES 命令可以列出当前数据库中的所有表。这个命令能够直观地显示数据库中的表清单,便于了解数据库结构
sql
show tables;

2.2 创建表
创建表使用CREATE TABLE语句,需要指定表名、字段名、数据类型和约束条件
sql
CREATE TABLE student(
id int,
name varchar(20)
--列名 + 类型,
--列名 + 类型
);

2.3 查看表的结构
查看表结构有两种常用方法:使用 DESCRIBE table_name 或简写的 DESC table_name

2.4 修改表
修改表用 ALTER TABLE 语句,支持多种操作:
2.4.1 修改表名:ALTER TABLE old_name RENAME new_name

2.4.2 修改字段名:ALTER TABLE table_name CHANGE old_column new_column new_datatype

2.4.3 修改字段数据类型:ALTER TABLE table_name MODIFY column_name new_datatype

2.4.4 添加字段:ALTER TABLE table_name ADD new_column datatype

2.4.5 删除字段:ALTER TABLE table_name DROP column_name

2.5 删除表

代码汇总:
sql
CREATE DATABASE java;
use java;
show TABLES;
CREATE TABLE student(
id int,
name varchar(20)
);
desc student;
desc student1;
show TABLES;
--修改表名
ALTER TABLE student rename student1;
--修改字段名
ALTER TABLE student1 CHANGE id studentId int;
--修改字段数据类型
ALTER TABLE student1 MODIFY name VARCHAR(200);
--添加字段
ALTER TABLE student1 ADD age int;
--删除字段
ALTER TABLE student1 DROP age;
--删除表
DROP TABLE student1;
3.练习
sql
CREATE DATABASE store;
use store;
SHOW TABLES;
DESC TABLE goods;
CREATE TABLE goods(
id bigint COMMENT '商品编号',
name varchar(50) COMMENT '商品名',
unitprice decimal(12,2) COMMENT '零售单价',
costprice decimal(12,2) COMMENT '成本价',
category varchar(20) COMMENT '商品类型',
provider varchar(50) COMMENT '供应商'
);
CREATE TABLE customer(
id bigint COMMENT '客户编号',
name varchar(20) COMMENT '客户姓名',
gender bool COMMENT '性别',
phone_num varchar(20) COMMENT '电话号码',
email varchar(50) COMMENT '电子邮件',
address varchar(255) COMMENT '地址',
create_time datetime COMMENT '注册时间'
);
CREATE TABLE purchase(
order_id varchar(32) COMMENT '订单编号',
custimer_id bigint COMMENT '客户编号',
goods_id bigint COMMENT '商品编号',
nums int COMMENT '购买商品数量',
amount decimal(12,2) COMMENT '总金额',
create_time datetime COMMENT '订单生成时间'
);
4.一些问题解答
4.1 UTF-8
UTF-8 是一种针对 Unicode 的可变长度字符编码(变长编码),它使用 1 到 4 个字节来表示一个字符。它是互联网上最广泛使用的字符编码标准,能够表示 Unicode 标准中的任何字符。
主要特点
-
兼容 ASCII:UTF-8 完全兼容 ASCII 编码,这意味着所有 ASCII 字符(0-127)在 UTF-8 中仍然使用 1 个字节表示,且编码方式与 ASCII 完全相同。
-
变长编码:
- 1 字节:0xxxxxxx(ASCII 字符)
- 2 字节:110xxxxx 10xxxxxx
- 3 字节:1110xxxx 10xxxxxx 10xxxxxx
- 4 字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-
空间效率:对于主要使用 ASCII 字符的文本,UTF-8 非常节省空间;对于包含大量非拉丁字符的文本,虽然会占用更多空间,但仍然是首选编码。
-
错误恢复能力强:UTF-8 的编码结构使得在数据损坏时,能够更容易地找到下一个有效字符的起始位置。
4.2 两个无符号整数相加容易出现溢出现象
这是因为无符号整数在计算机中使用固定位数(如8位、32位、64位)表示,当两个较大的数相加时,结果可能超过该位数能表示的最大值。
**主要原因是:**
-
有限表示范围:比如8位无符号整数只能表示0-255
-
自动取模 :溢出时计算机会丢弃高位进位,结果变成
(x + y) mod 2^w -
无警告机制:大多数编程语言不会自动检测无符号整数溢出
举例说明:
在C/C++中,unsigned char a = 200; unsigned char b = 100; 相加结果300超过255,实际得到 300 % 256 = 44
4.3 rand函数生成随机数
rand函数用于生成大于等于0且小于1的均匀分布随机实数。每次计算工作表时都会返回一个新的随机实数。
基本使用方法
rand函数的语法为=rand(),不需要任何参数但必须保留括号。该函数会生成一个包含0到1之间(不包括1)的15位小数
生成指定范围的随机数
要生成a到b之间的随机数,可以使用公式=a+rand()*(b-a)。例如生成1到100之间的随机实数:=1+rand()*99
生成随机整数
通过嵌套int函数可以生成随机整数。例如生成1到100之间的随机整数:=INT(1+rand()*99)。使用round函数可能得到100,而INT函数默认向下舍入不会达到100
4.4 时间戳
时间戳是计算机系统中用于唯一标识特定时间点的数字或字符,通常表示从固定起点(如1970年1月1日00:00:00 UTC,即Unix纪元)到当前时刻的秒数或毫秒数。它具有以下核心特点:
- 唯一性:每个时间点对应唯一的时间戳
- 全球统一性:基于协调世界时(UTC),不受时区影响
- 高精度:可精确到秒、毫秒甚至纳秒
- 防篡改性:与数字签名结合可验证数据完整性