感谢阅读!❤️
如果这篇文章对你有帮助,欢迎 **点赞** 👍 和 **关注** ⭐,获取更多实用技巧和干货内容!你的支持是我持续创作的动力!
**关注我,不错过每一篇精彩内容!**
目录
-
- 一、MySQL数据类型
-
- [1. 数值类型(Numeric Types)](#1. 数值类型(Numeric Types))
-
- [浮点 & 定点数](#浮点 & 定点数)
- [2. 字符串类型(String Types)](#2. 字符串类型(String Types))
-
- [2.1. 定长 vs 变长](#2.1. 定长 vs 变长)
- [2.2 大文本类型(用于长内容)](#2.2 大文本类型(用于长内容))
- [2.3 二进制 & 枚举](#2.3 二进制 & 枚举)
- [2.4 BLOB 类型(属于二进制大对象)](#2.4 BLOB 类型(属于二进制大对象))
- [3. 日期与时间类型(Date and Time Types)](#3. 日期与时间类型(Date and Time Types))
- [4. 其他类型](#4. 其他类型)
- 二、增删改表结构DDL
-
- [1. 创建一个表](#1. 创建一个表)
- [2. 删除表](#2. 删除表)
- [3. 查看建表语句](#3. 查看建表语句)
- [4. 修改表名](#4. 修改表名)
- [5. 新增字段](#5. 新增字段)
- [6. 修改字段名](#6. 修改字段名)
- [7. 修改字段数据类型](#7. 修改字段数据类型)
- [8. 删除字段](#8. 删除字段)
- 三、数据操作语言------DML
-
- [1. Insert增](#1. Insert增)
- [2. Delete删](#2. Delete删)
- [3. Update改](#3. Update改)
一、MySQL数据类型
MySQL 的数据类型主要分为三大类:数值型 、字符串型 、日期时间型 。此外还有 JSON 等特殊类型(5.7+ 支持)
1. 数值类型(Numeric Types)
| 类型 | 存储空间 | 有符号范围 | 无符号范围 | 说明 |
|---|---|---|---|---|
TINYINT |
1 字节 | -128 ~ 127 | 0 ~ 255 | 常用于状态标志(如 0/1 表示布尔) |
SMALLINT |
2 字节 | -32,768 ~ 32,767 | 0 ~ 65,535 | --- |
MEDIUMINT |
3 字节 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | --- |
INT / INTEGER |
4 字节 | -2³¹ ~ 2³¹-1 | 0 ~ 2³²-1 | 最常用整数类型 |
BIGINT |
8 字节 | -2⁶³ ~ 2⁶³-1 | 0 ~ 2⁶⁴-1 | 用于大ID(如分布式系统ID) |
✅ 建议:
- 主键 ID 通常用
INT UNSIGNED或BIGINT UNSIGNED- 布尔值可用
TINYINT(1)(MySQL 没有原生 BOOLEAN,但会映射为 TINYINT)
浮点 & 定点数
| 类型 | 说明 |
|---|---|
FLOAT(M,D) |
单精度浮点数,不精确,适合科学计算 |
DOUBLE(M,D) |
双精度浮点数,不精确 |
DECIMAL(M,D) |
精确小数,用于金额、财务等场景(推荐!) |
🔍 示例:
sqlprice DECIMAL(10,2) -- 最多10位有效数字,2位小数(如 12345678.99)(有效位最多65个,小数位最多30个)
⚠️ 注意:
FLOAT/DOUBLE会有精度丢失(如 0.1 + 0.2 ≠ 0.3),不要用于金钱计算!
2. 字符串类型(String Types)
2.1. 定长 vs 变长
| 类型 | 最大长度 | 存储特点 | 适用场景 |
|---|---|---|---|
CHAR(N) |
0~255 字符 | 定长,不足补空格 | 长度固定(如国家代码 'CN'、MD5 值) |
VARCHAR(N) |
0~65,535 字节 | 变长,只存实际内容 + 长度标识 | 大多数文本字段(姓名、标题等) |
💡 建议:
- 能用
VARCHAR就不用CHAR(除非长度绝对固定)VARCHAR(255)是常见选择(InnoDB 行大小限制友好)
2.2 大文本类型(用于长内容)
| 类型 | 最大容量 | 说明 |
|---|---|---|
TINYTEXT |
255 字节 | --- |
TEXT |
65,535 字节 (~64KB) | 博客正文、评论 |
MEDIUMTEXT |
16MB | --- |
LONGTEXT |
4GB | 小说、日志等超长文本 |
⚠️ 注意:
TEXT类型不能有默认值- 不能直接在
TEXT列上建完整索引(可前缀索引)
2.3 二进制 & 枚举
| 类型 | 说明 |
|---|---|
BINARY(N) / VARBINARY(N) |
存储二进制数据(如加密哈希) |
ENUM('值1','值2',...) |
枚举类型,最多 65,535 个选项 ✅ 节省空间,❌ 修改麻烦(需 ALTER TABLE) |
SET('a','b','c') |
可选多个值的集合(最多64个成员) |
📌 示例:
sqlstatus ENUM('active', 'inactive', 'pending') NOT NULL DEFAULT 'pending'
2.4 BLOB 类型(属于二进制大对象)
专门用于存储二进制数据的大对象类型:
- 图片(PNG、JPG)
- 音频(MP3)
- 视频(MP4)
- PDF 文件
- 加密数据、序列化对象等
一般不会存储音频、视频等内容到数据库中,这些文件一般存储在文件服务器中 ,数据库就存储文件的
URL
| 类型 | 最大容量 | 说明 |
|---|---|---|
TINYBLOB |
255 字节 | 极小二进制数据 |
BLOB |
65,535 字节(≈64KB) | 小图标、短音频片段 |
MEDIUMBLOB |
16 MB | 中等文件(如照片) |
LONGBLOB |
4 GB | 大文件(视频、安装包等) |
💡 它们与 TEXT 类型一一对应,但:
TEXT存 文本(受字符集影响)BLOB存 原始二进制(不受字符集影响)
示例:存储图片
sql
CREATE TABLE images (
id INT PRIMARY KEY,
name VARCHAR(100),
data LONGBLOB -- 存储图片的二进制内容
);
BINARY vs BLOB
| 类型 | 特点 |
|---|---|
BINARY(N) / VARBINARY(N) |
固定/可变长度二进制,适合小数据(如哈希值、UUID) |
BLOB 系列 |
适合大二进制对象,自动管理存储,无长度硬编码 |
sql
-- 示例
password_hash BINARY(32) -- 存 SHA256 哈希(32字节)
user_avatar MEDIUMBLOB -- 存用户头像
3. 日期与时间类型(Date and Time Types)
| 类型 | 格式 | 范围 | 存储空间 | 说明 |
|---|---|---|---|---|
DATE |
YYYY-MM-DD |
1000-01-01 ~ 9999-12-31 | 3 字节 | 仅日期 |
TIME |
HH:MM:SS |
-838:59:59 ~ 838:59:59 | 3 字节 | 仅时间(可表示时长) |
DATETIME |
YYYY-MM-DD HH:MM:SS |
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8 字节 | 不带时区,常用 |
TIMESTAMP |
YYYY-MM-DD HH:MM:SS |
1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 4 字节 | 自动转时区 ,受 time_zone 影响 |
YEAR |
YYYY |
1901 ~ 2155 | 1 字节 | 很少用 |
✅ 最佳实践:
- 一般用
DATETIME(范围大、无时区干扰)- 若需自动记录创建/更新时间,可用
TIMESTAMP+DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP- 避免
TIMESTAMP的 2038 年问题(Y2038 bug)
4. 其他类型
| 类型 | 说明 |
|---|---|
JSON |
MySQL 5.7+ 支持,可存储和查询 JSON 文档 ✅ 自动验证格式,支持 -> 操作符 |
GEOMETRY, POINT 等 |
空间数据类型(GIS 应用) |
通用建议(开发规范)
- 避免使用
TEXT作为主键或频繁查询字段- 金额用
DECIMAL,不用FLOAT/DOUBLE- 字符串长度合理预估 :
VARCHAR(255)比VARCHAR(10000)更高效- 时间字段统一用
DATETIME,除非明确需要时区转换- 主键优先用
BIGINT UNSIGNED AUTO_INCREMENT- 枚举值慎用
ENUM,后期扩展困难,可用字典表替代
示例建表(综合应用)
sql
CREATE TABLE users (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(255) NOT NULL,
balance DECIMAL(12,2) NOT NULL DEFAULT 0.00,
status ENUM('active','inactive') NOT NULL DEFAULT 'active',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
profile TEXT
);
二、增删改表结构DDL
1. 创建一个表
sql
CREATE TABLE T_STUDENT(
ID BIGINT,
NAME VARCHAR(255),
AGE INT COMMENT '年龄'
);
2. 删除表
基本语法:删除整张表(含结构和数据)
sql
DROP TABLE 表名;
-- 示例
DROP TABLE STUDENTS;
🔹 功能:
永久删除
整张表,包括:
- 表结构(列定义、约束等)
- 所有数据
- 相关索引、触发器(多数数据库中)
不可恢复(除非有备份)!
-
安全写法:仅当表存在时才删除(避免报错)
SQLDROP TABLE IF EXISTS 表名; -- 示例 DROP TABLE IF EXISTS STUDENTS;✅ 推荐在脚本或开发环境中使用,防止因表不存在而报错。
📌 支持情况:
- MySQL、PostgreSQL、SQLite、SQL Server(2016+):✅ 支持
- Oracle :❌ 不支持
IF EXISTS,需用 PL/SQL 判断
3. 查看建表语句
sql
SHOW CREATE TABLE 表名;
4. 修改表名
sql
ALTER TABLE 表名 RENAME 新表名;
5. 新增字段
sql
ALTER TABLE 表名 ADD 字段名 数据类型;
6. 修改字段名
不修改数据类型,也必须写上。(可同时修改数据类型)
SQL
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型;
-- 示例
ALTER TABLE TEST CHANGE NEW_MONEY MONEY DECIMAL(8,2);
ALTER TABLE TEST CHANGE MONEY NEW_MONEY DECIMAL(3,2);
7. 修改字段数据类型
SQL
ALTER TABLE 表名 MODIFY COLUMN 字段名 新数据类型;
8. 删除字段
SQL
ALTER TABLE 表名 DROP 字段名
三、数据操作语言------DML
当我们对表中的数据进行增删改查时,称为DML语句。主要包括(insert、update、delete)
1. Insert增
-
单行插入:
sqlINSERT INTO 表名 VALUES (值1, 值2, ..., 值N); -- 示例: INSERT INTO STUDENTS VALUES ('1002', '陈宇航', 19); -- 指定字段 INSERT INTO STUDENTS (SID, SNAME, AGE) VALUES ('1003', '黄思睿', 20),⚠️ 注意:
- 必须按表定义的全部列顺序提供所有值。
- 不推荐使用,因表结构变更时易出错。
- 推荐指定字段
-
多行插入
sqlINSERT INTO STUDENTS (SID, SNAME, AGE) VALUES ('1003', '黄思睿', 20), ('1004', '周雨桐', 18), ('1005', '吴子轩', 19);✅ 优点:减少网络往返,提高插入效率。
-
从其他表插入
sqlINSERT INTO 目标表 (列1, 列2, ..., 列N) SELECT 列A, 列B, ..., 列Z FROM 源表 [WHERE 条件];🔍 用途:数据迁移、备份、聚合插入等。
2. Delete删
语法:
SQL
-- 删除表中所有数据
DELETE FROM 表名;
-- 条件删除表中数据
DELETE FROM 表名 WHERE ...;
Delete删除属于DML方式删除,这种删除数据的方式可以通过事务进行回滚,重新恢复,但删除效率较低。
还有一种删除表中数据的方式,但这种方式不支持事务,不可以回滚,删除之后数据永远找不回来,这种删除方式叫:表截断
sql
-- 表截断,这种删除方式不属于DML操作
truncate table 表名;
-
作用:
- 删除表中的全部行(即所有记录)。
- 表本身仍然存在,结构不变,可以继续插入新数据。
-
与
DELETE FROM 表名;的区别:特性 TRUNCATE TABLEDELETE FROM(无 WHERE)删除范围 所有行 所有行(可加 WHERE 条件删除部分) 是否可回滚(事务) 在某些数据库中不可回滚(如 MySQL 的 InnoDB 引擎下可以回滚,但 Oracle 中通常不能) 可回滚 性能 更快,不逐行删除,直接释放数据页 较慢,逐行删除并记录日志 触发器 不会触发 DELETE 触发器 会触发 DELETE 触发器 自增 ID(AUTO_INCREMENT) 重置为初始值(如 1) 不重置(除非手动设置) -
使用场景:
- 需要快速清空大表数据。
- 不需要保留任何历史记录。
- 不关心触发器或事务回滚(或确认当前数据库支持回滚)。
-
注意事项:
- 无法带条件 :
TRUNCATE不能加WHERE子句,只能清空整张表。 - 权限要求 :通常需要比
DELETE更高的权限(如 DROP 权限,因为部分数据库内部实现类似"删表重建")。 - 外键约束 :如果表被其他表的外键引用,某些数据库(如 MySQL)可能不允许
TRUNCATE,需先禁用外键检查或改用DELETE。
- 无法带条件 :
3. Update改
SQL
UPDATE 表名 SET 字段1=新的值, 字段2=新的值, ... ,字段N=新的值 WHERE ...;
-- 示例
UPDATE users SET EMAIL = 'new@example.com' WHERE ID = 100; (推荐)
如果不写where条件,将修改表中所有的记录
最佳实践:
-
先
SELECT再UPDATE在执行前,先用相同
WHERE条件查一下:sqlSELECT * FROM users WHERE status = 'inactive'; -- 确认无误后再执行 UPDATE users SET status = 'archived' WHERE status = 'inactive'; -
在事务中操作(重要数据)
sqlBEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 检查结果,没问题就 COMMIT,有问题就 ROLLBACK COMMIT; -
避免全表更新
除非明确需要,否则永远不要省略
WHERE。