掌握 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

相关推荐
深盾科技_Virbox5 分钟前
软件授权工具静默安装实践
java·运维·数据库·安全·软件需求
延凡科技34 分钟前
延凡科技综合监控预警处置平台—— 一体化视频AI安防闭环系统设计与功能实现[特殊字符]️
数据库·人工智能·科技·安全·能源
老马聊技术34 分钟前
Rocky Linux 9.0 安装 MySQL8.x详细教程
linux·数据库
醇氧1 小时前
主流 Agent 开发框架全解析(2026 最新)
大数据·数据库·人工智能·开源
吴声子夜歌1 小时前
Redis 6.x——整合SpringBoot
数据库·spring boot·redis
ATA88881 小时前
AI辅助生成SQL实战从连接配置到执行计划优化的完整技术流程
数据库·人工智能·智能问数
咏方舟【长江支流】1 小时前
【开源】跨语言·跨平台·跨数据库(4) ——用宝框架 ORM 数据源适配器
数据库·开源·ai编程·orm·咏方舟-长江支流·用宝框架·用宝框架orm
JZC_xiaozhong1 小时前
OA调价审批后,采购调价单如何自动同步到ERP?解决漏录错价难题
大数据·linux·服务器·前端·数据库·数据孤岛解决方案·数据集成与应用集成
渣渣灰飞1 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第一章:企业数据库设计规范
数据库·学习·mysql
IvorySQL2 小时前
PG 日报|新增 VFD 缓存监控视图,精细化数据库调优
大数据·数据库·人工智能·缓存·postgresql·区块链