【数据库相关】MySQL全分类SQL详解(超多数据类型+全约束+实战落地)

MySQL全分类SQL详解(超多数据类型+全约束+实战落地)

  • 数据库开发工程师进阶版:MySQL全分类SQL详解(超多数据类型+全约束+实战落地)
    • 前置说明
    • [一、DDL 数据定义语言(建库、建表、改结构、约束核心)](#一、DDL 数据定义语言(建库、建表、改结构、约束核心))
      • [1.1 建库规范SQL](#1.1 建库规范SQL)
      • [1.2 企业级建表(超多数据类型 + 全约束演示)](#1.2 企业级建表(超多数据类型 + 全约束演示))
        • [业务场景:电商用户详情表 + 账户资产表融合示范](#业务场景:电商用户详情表 + 账户资产表融合示范)
        • 关键知识点拆解
          • [① 数据类型选型硬核规范](#① 数据类型选型硬核规范)
          • [② 约束全覆盖](#② 约束全覆盖)
      • [1.3 常用改表DDL(加字段/改类型/加约束/加索引)](#1.3 常用改表DDL(加字段/改类型/加约束/加索引))
      • [1.4 视图/索引进阶DDL](#1.4 视图/索引进阶DDL)
    • [二、DML 数据操作语言(增删改,带严格字段适配)](#二、DML 数据操作语言(增删改,带严格字段适配))
      • [2.1 INSERT 插入(适配全字段类型)](#2.1 INSERT 插入(适配全字段类型))
      • [2.2 UPDATE 更新(强制带WHERE,防全表更新)](#2.2 UPDATE 更新(强制带WHERE,防全表更新))
      • [2.3 DELETE 删除(逻辑删除优先,物理删除谨慎)](#2.3 DELETE 删除(逻辑删除优先,物理删除谨慎))
    • [三、DQL 数据查询语言(高阶+多函数+关联+分组)](#三、DQL 数据查询语言(高阶+多函数+关联+分组))
      • [3.1 基础查询+字段过滤+枚举翻译](#3.1 基础查询+字段过滤+枚举翻译)
      • [3.2 分组聚合查询(配合数值类型统计)](#3.2 分组聚合查询(配合数值类型统计))
      • [3.3 多表JOIN关联查询](#3.3 多表JOIN关联查询)
      • [3.4 JSON字段解析查询](#3.4 JSON字段解析查询)
      • [3.5 去重+分页](#3.5 去重+分页)
    • [四、TCL 事务控制语言(金融/账户必备,保障原子性)](#四、TCL 事务控制语言(金融/账户必备,保障原子性))
    • [五、DCL 权限控制语言(运维/开发赋权)](#五、DCL 权限控制语言(运维/开发赋权))
    • 六、补充:高频约束避坑+数据类型总结
      • [6.1 核心约束避坑](#6.1 核心约束避坑)
      • [6.2 全数据类型速记](#6.2 全数据类型速记)

数据库开发工程师进阶版:MySQL全分类SQL详解(超多数据类型+全约束+实战落地)

前置说明

  1. 全程基于 InnoDB、utf8mb4、MySQL 5.7/8.0 兼容
  2. 覆盖:整型/浮点/高精度小数/字符串/日期时间/二进制/枚举/JSON 全常用数据类型;
  3. 覆盖:主键、自增、非空、唯一、默认值、外键、检查、注释、索引、联合索引 全约束;
  4. 按标准五大类 + 高阶开发SQL拆分,每段带业务场景+详解。

一、DDL 数据定义语言(建库、建表、改结构、约束核心)

1.1 建库规范SQL

sql 复制代码
-- 创建数据库,指定字符集+排序规则(杜绝乱码)
CREATE DATABASE IF NOT EXISTS db_trade
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;

-- 删除库(生产严禁随意执行)
DROP DATABASE IF EXISTS db_temp;

1.2 企业级建表(超多数据类型 + 全约束演示)

业务场景:电商用户详情表 + 账户资产表融合示范
sql 复制代码
CREATE TABLE IF NOT EXISTS t_user_account (
    -- 1.整型系列:tinyint/smallint/int/bigint(精准控存储)
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID,无符号大整型',
    age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄,无符号 tinyint 省空间',
    user_level SMALLINT NOT NULL DEFAULT 1 COMMENT '会员等级,小整型',
    
    -- 2.高精度金额:必须 decimal,禁止 float/double
    account_balance DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '账户余额,16位总长4位小数,金融精准',
    freeze_amount DECIMAL(16,4) NOT NULL DEFAULT 0.0000 COMMENT '冻结金额',
    
    -- 3.字符串系列:char/varchar/text
    user_code CHAR(20) NOT NULL COMMENT '用户编码,定长char,查询更快',
    phone VARCHAR(11) NOT NULL COMMENT '手机号,变长常用',
    email VARCHAR(128) DEFAULT '' COMMENT '邮箱',
    user_desc TEXT COMMENT '用户长备注,大文本,不建索引',
    
    -- 4.日期时间全品类
    register_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
    last_login_date DATE COMMENT '最后登录日期(仅年月日)',
    login_time TIME COMMENT '常用登录时段(时分秒)',
    update_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '自动更新时间戳',
    
    -- 5.枚举enum:固定业务状态
    gender ENUM('male','female','unknown') DEFAULT 'unknown' COMMENT '性别枚举,只能选固定值',
    
    -- 6.集合set:多选标签
    user_tag SET('vip','new_user','discount') COMMENT '用户标签,可多选',
    
    -- 7.JSON类型:存储灵活扩展字段(前端配置、扩展属性)
    extend_info JSON COMMENT '扩展JSON字段:头像、第三方绑定信息',
    
    -- 8.二进制:存小文件/加密密文
    encrypt_data BLOB COMMENT '加密二进制密文数据',

    -- ========== 核心约束区 ==========
    PRIMARY KEY (id) COMMENT '单字段主键',
    UNIQUE KEY uk_user_code (user_code) COMMENT '唯一约束:用户编码全局不重复',
    UNIQUE KEY uk_phone (phone) COMMENT '手机号唯一',
    
    -- 普通索引/联合索引
    INDEX idx_register_time (register_time) COMMENT '注册时间单列索引',
    INDEX idx_level_phone (user_level,phone) COMMENT '联合索引:等级+手机号',
    
    -- 外键约束(InnoDB专用,保障关联完整性)
    -- 注:实际高并发业务常逻辑外键,低并发可用物理外键
    FOREIGN KEY (user_level) REFERENCES t_level_config(level_id),
    
    -- 检查约束(MySQL8.0原生支持,5.7语法兼容不强制)
    CHECK (age >= 0 AND age <= 150),
    CHECK (account_balance >= 0)

) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_unicode_ci
AUTO_INCREMENT = 10000
COMMENT = '用户账户主表-含全数据类型&全约束';
关键知识点拆解
① 数据类型选型硬核规范
  • 整型:TINYINT(1字节)/SMALLINT(2)/INT(4)/BIGINT(8),加 UNSIGNED 扩大正数范围;
  • 金额:强制 DECIMAL(m,n),杜绝 Float/Double 精度丢失;
  • 字符串:固定长度用 CHAR,变长用 VARCHAR,超长备注用 TEXT
  • 时间:DATETIME 存业务时间,TIMESTAMP 自动更新,DATE/TIME 拆分场景;
  • 枚举:ENUM 限定固定状态,防脏数据;
  • 扩展字段:优先 JSON,无需频繁改表;
② 约束全覆盖
  • NOT NULL:非空,业务核心字段必须加;
  • AUTO_INCREMENT:自增主键,仅整型;
  • UNIQUE:唯一约束,防重复(手机号/编码);
  • DEFAULT:默认值,杜绝NULL乱存;
  • FOREIGN KEY:物理关联约束;
  • CHECK:字段值合法性校验(8.0强生效);
  • PRIMARY KEY:主键,非空+唯一;

1.3 常用改表DDL(加字段/改类型/加约束/加索引)

sql 复制代码
-- 1.加字段+指定类型+约束+注释
ALTER TABLE t_user_account 
ADD COLUMN real_name VARCHAR(64) NOT NULL DEFAULT '' COMMENT '真实姓名' AFTER phone;

-- 2.修改字段数据类型+约束
ALTER TABLE t_user_account
MODIFY COLUMN email VARCHAR(192) DEFAULT '' NOT NULL COMMENT '扩容邮箱长度,加固非空';

-- 3.添加唯一约束
ALTER TABLE t_user_account
ADD UNIQUE KEY uk_email (email);

-- 4.添加普通索引
ALTER TABLE t_user_account
ADD INDEX idx_gender (gender);

-- 5.删除索引
ALTER TABLE t_user_account
DROP INDEX idx_gender;

-- 6.删除字段(高危!生产必须评审)
ALTER TABLE t_user_account
DROP COLUMN encrypt_data;

1.4 视图/索引进阶DDL

sql 复制代码
-- 创建视图(封装复杂关联查询)
CREATE VIEW v_user_balance AS
SELECT id,phone,account_balance,freeze_amount,register_time
FROM t_user_account
WHERE user_level > 1;

-- 删除视图
DROP VIEW IF EXISTS v_user_balance;

二、DML 数据操作语言(增删改,带严格字段适配)

2.1 INSERT 插入(适配全字段类型)

sql 复制代码
-- 常规插入:覆盖字符串/数字/日期/枚举/JSON
INSERT INTO t_user_account (
    age,user_level,account_balance,user_code,phone,email,
    gender,extend_info,register_time
) VALUES (
    28,
    5,
    999.8800,
    'USER2026001',
    '13800138000',
    'test@qq.com',
    'male',
    '{"avatar":"https://xxx.png","wx_bind":true}',
    '2026-04-06 10:00:00'
);

-- 批量插入(高性能,数据库开发高频)
INSERT INTO t_user_account (user_code,phone,user_level)
VALUES 
('USER2026002','13900139000',3),
('USER2026003','13700137000',2);

2.2 UPDATE 更新(强制带WHERE,防全表更新)

sql 复制代码
-- 更新金额+状态+自动触发update_time
UPDATE t_user_account
SET account_balance = account_balance + 50.0000,
    user_level = 6
WHERE user_code = 'USER2026001';

-- JSON字段局部更新(MySQL5.7+支持)
UPDATE t_user_account
SET extend_info = JSON_SET(extend_info,'$.avatar','https://new.png')
WHERE id = 10000;

2.3 DELETE 删除(逻辑删除优先,物理删除谨慎)

sql 复制代码
-- 物理删除(仅归档/清理冷数据用)
DELETE FROM t_user_account
WHERE register_time < '2020-01-01';

-- 企业规范:优先逻辑删除(加del_flag字段)
ALTER TABLE t_user_account ADD COLUMN del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '0正常1删除';
-- 逻辑删除更新
UPDATE t_user_account SET del_flag = 1 WHERE user_code = 'USER2026003';

三、DQL 数据查询语言(高阶+多函数+关联+分组)

3.1 基础查询+字段过滤+枚举翻译

sql 复制代码
SELECT 
    id,
    phone,
    user_level,
    -- case when翻译枚举/数字状态
    CASE gender 
        WHEN 'male' THEN '男'
        WHEN 'female' THEN '女'
        ELSE '未知' 
    END AS gender_name,
    account_balance,
    DATE(register_time) AS reg_date  --日期函数截取
FROM t_user_account
WHERE del_flag = 0  --屏蔽逻辑删除数据
AND user_level >= 3
AND account_balance > 100;

3.2 分组聚合查询(配合数值类型统计)

sql 复制代码
-- 按会员等级统计人数、总余额、平均余额
SELECT 
    user_level,
    COUNT(*) AS user_count,
    SUM(account_balance) AS total_balance,
    AVG(account_balance) AS avg_balance,
    MAX(account_balance) AS max_balance
FROM t_user_account
WHERE del_flag = 0
GROUP BY user_level
HAVING SUM(account_balance) > 1000; --分组后过滤

3.3 多表JOIN关联查询

sql 复制代码
-- 关联用户表+订单表(LEFT JOIN保留所有用户)
SELECT 
    u.id,u.phone,o.order_no,o.order_amount
FROM t_user_account u
LEFT JOIN t_order o ON u.id = o.user_id
WHERE u.del_flag = 0
ORDER BY u.id DESC;

3.4 JSON字段解析查询

sql 复制代码
-- 提取JSON里的头像地址
SELECT 
    id,
    phone,
    JSON_UNQUOTE(JSON_EXTRACT(extend_info,'$.avatar')) AS avatar_url
FROM t_user_account
WHERE extend_info->'$.wx_bind' = true;

3.5 去重+分页

sql 复制代码
-- 去重查询所有会员等级
SELECT DISTINCT user_level FROM t_user_account WHERE del_flag=0;

-- 分页查询(第1页10条)
SELECT * FROM t_user_account WHERE del_flag=0 ORDER BY id DESC LIMIT 0,10;

四、TCL 事务控制语言(金融/账户必备,保障原子性)

sql 复制代码
-- 转账业务:扣A余额,加B余额,要么全成要么全回滚
START TRANSACTION;

-- 扣减付款方
UPDATE t_user_account 
SET account_balance = account_balance - 200.0000
WHERE user_code = 'USER2026001' AND account_balance >= 200;

-- 增加收款方
UPDATE t_user_account 
SET account_balance = account_balance + 200.0000
WHERE user_code = 'USER2026002';

-- 无异常提交
COMMIT;

-- 出现异常执行:ROLLBACK;

五、DCL 权限控制语言(运维/开发赋权)

sql 复制代码
-- 创建专属数据库开发账号
CREATE USER 'db_dev_ops'@'%' IDENTIFIED BY 'Dev@MySql2026!';

-- 赋权:查询+增改,禁止删表删库
GRANT SELECT,INSERT,UPDATE ON db_trade.* TO 'db_dev_ops'@'%';

-- 回收敏感权限
REVOKE DELETE,DROP,ALTER ON db_trade.* FROM 'db_dev_ops'@'%';

-- 刷新权限生效
FLUSH PRIVILEGES;

六、补充:高频约束避坑+数据类型总结

6.1 核心约束避坑

  1. 核心业务字段必加 NOT NULL + DEFAULT,禁止大量NULL;
  2. 手机号/编码必加 UNIQUE 唯一约束,防重复脏数据;
  3. 金额只用DECIMAL,绝不浮点;
  4. 状态固定值优先 ENUM,减少业务乱录入;
  5. 大文本用TEXT,不建索引;筛选字段必建合适索引/联合索引;
  6. 生产优先逻辑删除,少用物理DELETE。

6.2 全数据类型速记

  • 整型:TINYINT/SMALLINT/INT/BIGINT + UNSIGNED
  • 金额:DECIMAL(精度,小数位)
  • 字符:CHAR(定长) / VARCHAR(变长) / TEXT(大文本)
  • 时间:DATETIME / DATE / TIME / TIMESTAMP
  • 枚举集合:ENUM / SET
  • 扩展:JSON
  • 二进制:BLOB
相关推荐
不剪发的Tony老师2 小时前
mayfly-go:一款基于WEB的服务器、数据库、中间件统一运维平台
运维·服务器·数据库
minji...2 小时前
Linux 多线程(五)用C++语言以面向对象方式封装线程
linux·运维·服务器·网络·jvm·数据库
喵叔哟2 小时前
31_Document处理通用Skill:多格式抽取+结构化输出+校验层
数据库
搜佛说2 小时前
03-第3章-基础CRUD操作
数据库·物联网·边缘计算·iot·嵌入式实时数据库
清水白石0082 小时前
《从缓存到数据库:一致性之痛与工程之道》
数据库·python·缓存
cTz6FE7gA2 小时前
Oracle RMAN物理备份Web系统
数据库·oracle
APguantou3 小时前
NCRE-三级数据库技术-第14章-数据仓库与数据挖掘
数据库·数据仓库·数据挖掘
刘~浪地球4 小时前
Redis 从入门到精通(十):管道技术
数据库·redis·缓存
fzb5QsS1p8 小时前
MySQL 事务的二阶段提交是什么?
数据库·mysql