掌握 MySQL:数据类型、数据定义语言DDL、数据操作语言DML

复制代码
感谢阅读!❤️
如果这篇文章对你有帮助,欢迎 **点赞** 👍 和 **关注** ⭐,获取更多实用技巧和干货内容!你的支持是我持续创作的动力!
**关注我,不错过每一篇精彩内容!**

目录

    • 一、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 UNSIGNEDBIGINT UNSIGNED
  • 布尔值可用 TINYINT(1)(MySQL 没有原生 BOOLEAN,但会映射为 TINYINT)
浮点 & 定点数
类型 说明
FLOAT(M,D) 单精度浮点数,不精确,适合科学计算
DOUBLE(M,D) 双精度浮点数,不精确
DECIMAL(M,D) 精确小数,用于金额、财务等场景(推荐!)

🔍 示例:

sql 复制代码
price 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个成员)

📌 示例:

sql 复制代码
status 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 应用)

通用建议(开发规范)

  1. 避免使用 TEXT 作为主键或频繁查询字段
  2. 金额用 DECIMAL,不用 FLOAT/DOUBLE
  3. 字符串长度合理预估VARCHAR(255)VARCHAR(10000) 更高效
  4. 时间字段统一用 DATETIME,除非明确需要时区转换
  5. 主键优先用 BIGINT UNSIGNED AUTO_INCREMENT
  6. 枚举值慎用 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;

🔹 功能:

  • 永久删除

    整张表,包括:

    • 表结构(列定义、约束等)
    • 所有数据
    • 相关索引、触发器(多数数据库中)
  • 不可恢复(除非有备份)!

  • 安全写法:仅当表存在时才删除(避免报错)

    SQL 复制代码
    DROP 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增

  • 单行插入:

    sql 复制代码
    INSERT INTO 表名
    VALUES (值1, 值2, ..., 值N);
    
    -- 示例:
    INSERT INTO STUDENTS
    VALUES ('1002', '陈宇航', 19);
    
    -- 指定字段
    INSERT INTO STUDENTS (SID, SNAME, AGE) VALUES
    ('1003', '黄思睿', 20),

    ⚠️ 注意:

    • 必须按表定义的全部列顺序提供所有值。
    • 不推荐使用,因表结构变更时易出错。
    • 推荐指定字段
  • 多行插入

    sql 复制代码
    INSERT INTO STUDENTS (SID, SNAME, AGE) VALUES
    ('1003', '黄思睿', 20),
    ('1004', '周雨桐', 18),
    ('1005', '吴子轩', 19);

    ✅ 优点:减少网络往返,提高插入效率。

  • 从其他表插入

    sql 复制代码
    INSERT 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 TABLE DELETE 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条件,将修改表中所有的记录

最佳实践:

  1. SELECTUPDATE

    在执行前,先用相同 WHERE 条件查一下:

    sql 复制代码
    SELECT * FROM users WHERE status = 'inactive';
    -- 确认无误后再执行
    UPDATE users SET status = 'archived' WHERE status = 'inactive';
  2. 在事务中操作(重要数据)

    sql 复制代码
    BEGIN;
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE id = 2;
    -- 检查结果,没问题就 COMMIT,有问题就 ROLLBACK
    COMMIT;
  3. 避免全表更新

    除非明确需要,否则永远不要省略 WHERE

相关推荐
蓝影铁哥2 小时前
浅谈5款Java微服务开发框架
java·linux·运维·开发语言·数据库·微服务·架构
马克学长2 小时前
SSM校园公益活动网站7a9p4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·校园公益活动网站
李慕婉学姐2 小时前
Springboot在线阅读平台的设计与实现5yy58005(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
IT 行者2 小时前
Spring Authorization Server 迁移至 Spring Security 7.0:变革与展望
java·数据库·spring
码农学院2 小时前
Mysql 是如何解决幻读问题的?
数据库·mysql
计算机毕设VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue高校实验室教学管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
哈里谢顿2 小时前
mysql基础面试题
mysql
net3m332 小时前
websocket下发mp3帧数据时一个包被分包为几个子包而导致mp3解码失败而播放卡顿有杂音或断播的解决方法
开发语言·数据库·python
TG:@yunlaoda360 云老大2 小时前
华为云国际站代理商WeLink的资源与工具支持具体有哪些?
服务器·数据库·华为云