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详解(超多数据类型+全约束+实战落地)
前置说明
- 全程基于 InnoDB、utf8mb4、MySQL 5.7/8.0 兼容;
- 覆盖:整型/浮点/高精度小数/字符串/日期时间/二进制/枚举/JSON 全常用数据类型;
- 覆盖:主键、自增、非空、唯一、默认值、外键、检查、注释、索引、联合索引 全约束;
- 按标准五大类 + 高阶开发SQL拆分,每段带业务场景+详解。
一、DDL 数据定义语言(建库、建表、改结构、约束核心)
1.1 建库规范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 企业级建表(超多数据类型 + 全约束演示)
业务场景:电商用户详情表 + 账户资产表融合示范
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(加字段/改类型/加约束/加索引)
-- 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
-- 创建视图(封装复杂关联查询)
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 插入(适配全字段类型)
-- 常规插入:覆盖字符串/数字/日期/枚举/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,防全表更新)
-- 更新金额+状态+自动触发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 删除(逻辑删除优先,物理删除谨慎)
-- 物理删除(仅归档/清理冷数据用)
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 基础查询+字段过滤+枚举翻译
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 分组聚合查询(配合数值类型统计)
-- 按会员等级统计人数、总余额、平均余额
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关联查询
-- 关联用户表+订单表(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字段解析查询
-- 提取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 去重+分页
-- 去重查询所有会员等级
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 事务控制语言(金融/账户必备,保障原子性)
-- 转账业务:扣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 权限控制语言(运维/开发赋权)
-- 创建专属数据库开发账号
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 核心约束避坑
- 核心业务字段必加
NOT NULL + DEFAULT,禁止大量NULL;
- 手机号/编码必加
UNIQUE 唯一约束,防重复脏数据;
- 金额只用DECIMAL,绝不浮点;
- 状态固定值优先
ENUM,减少业务乱录入;
- 大文本用TEXT,不建索引;筛选字段必建合适索引/联合索引;
- 生产优先逻辑删除,少用物理DELETE。
6.2 全数据类型速记
- 整型:TINYINT/SMALLINT/INT/BIGINT + UNSIGNED
- 金额:DECIMAL(精度,小数位)
- 字符:CHAR(定长) / VARCHAR(变长) / TEXT(大文本)
- 时间:DATETIME / DATE / TIME / TIMESTAMP
- 枚举集合:ENUM / SET
- 扩展:JSON
- 二进制:BLOB