菜鸟开发之MySQL常见字段值处理
仰天大笑出门去,我辈更要谱天曲。
SQL一日同风起,基础不夯注定倾。
众里寻它千百度,蓦然回首,那个错误还在吐。
Java开发该过程中性能问题是存在的,而数据处理则是占据大头,平时开发一定要注意代码质量和需求实现的性能问题。如果需要聚合、过滤大量数据,或者实物一致性要求高时,需要优先SQL(统计报表);如果业务复杂、动态规则,或者高度使用中间结果,则在Java代码中处理,减少SQL变更,减少数据库交互。
一、数据拼接
1、CONCAT
CONCAT(string1, string2, ..., stringN),将两个或多个字符串连接在一起
-
自动忽略
NULL值参数,仅拼接非NULL的字符串。 -
第一个参数必须是分隔符(字符串)。
SELECT CONCAT('Hello', ' ', 'World'); -- 输出: Hello World
SELECT CONCAT('Hello', NULL, 'World'); -- 输出: NULL
2、CONCAT_WS
CONCAT_WS(separator, str1, str2, ..., strN)
CONCAT_WS() 函数是一个特殊的 CONCAT(),它允许你指定一个分隔符来连接字符串。WS 表示“With Separator”。
-
自动忽略
NULL值参数,仅拼接非NULL的字符串。 -
第一个参数必须是分隔符(字符串)。
SELECT CONCAT_WS('-', '2023', '08', '20'); -- 输出: 2023-08-20
SELECT CONCAT_WS(',', 'Apple', NULL, 'Banana'); -- 输出: Apple,Banana
二、空值判断
1、是否为NULL
1)IS NULL:返回NULL空字符串记录
SELECT * FROM table_name WHERE column_name IS NULL;
2)IS NOT NULL:返回不为NULL的字符串记录
SELECT * FROM table_name WHERE column_name IS NOT NULL;
2、是否空字符串
1)='':返回为空字符串
SELECT * FROM table_name WHERE column_name = '';
2)<>'':返回不为空字符串
SELECT * FROM table_name WHERE column_name <> '';
3、同时判断NULL和空字符串
1)使用IFNULL或COALESCE
IFNULL():如果字段为 NULL,则返回指定值。
SELECT IFNULL(column_name, '固定值') FROM table_name;
COALESCE():返回第一个非 NULL 的值
SELECT COALESCE(column_name, 'Default Value') FROM table_name;
2)NULLIF():字段等于指定值(如空字符串),则返回 NULL
SELECT NULLIF(column_name, '') FROM table_name;
4、处理NULL和空字符串
1)NULL和空字符串统一处理
SELECT * FROM table_name WHERE COALESCE(column_name, '') = '';
2)NULL转换为空字符串
SELECT IFNULL(column_name, '') FROM table_name;
3)空字符串转换为 NULL
SELECT NULLIF(column_name, '') FROM table_name;
三、数据替换
1、REPLACE函数
REPLACE(字段名, 旧字符串, 新字符串):简单替换,主要用于字符串
-- 将 name 字段中的 "旧" 替换为 "新"
SELECT REPLACE(name, '旧', '新') AS new_name FROM products;-- 更新表数据(永久替换)
UPDATE products SET name = REPLACE(name, '旧', '新');
2、UPDATE语句
UPDATE your_table
SET column_name = REPLACE(column_name, 'old_value', 'new_value')
WHERE column_name LIKE '%old_value%';
3、UPDATE结合CASE
CASE WHEN可以处理多种数据类型,主要用于复杂逻辑
语法:
CASE
WHEN 条件1 THEN 替换值1
WHEN 条件2 THEN 替换值2
ELSE 默认值
END
-- 根据 score 的值替换等级
SELECT name,CASE WHEN score >= 90 THEN 'A'WHEN score >= 80 THEN 'B'ELSE 'C'END AS grade
FROM students;-- 更新表数据(将负库存标记为缺货)
UPDATE inventory
SET stock_status = CASE WHEN stock <= 0 THEN '缺货'ELSE '有货'
END;
4、COALESCE和IFNULL
IFNULL(字段名, 默认值) -- 若字段为 NULL,返回默认值
COALESCE(字段名, 备用值1, 备用值2) -- 返回第一个非 NULL 的值
-- 将 NULL 替换为 "未知"
SELECT IFNULL(email, '未知') AS user_email FROM users;-- 优先使用 phone,若为 NULL 则用备用电话
SELECT COALESCE(phone, backup_phone, '无联系方式') AS contact FROM customers;
5、正则表达式
REGEXP_REPLACE(字段名, 正则表达式, 新字符串)函数,从MySQL 8.0开始,你可以使用正则表达式进行更复杂的替换。
-- 所有数字替换为X
UPDATE your_table
SET column_name = REGEXP_REPLACE(column_name, '[0-9]', 'X');
6、INSERT
INSERT(原字符串, 起始位置, 替换长度, 新字符串)
-- 将手机号中间四位替换为 ****
SELECT INSERT(phone, 4, 4, '****') AS masked_phone FROM users;
四、空格处理
1、去除空格的核心函数
1)首尾TRIM
TRIM()去除首尾空格;SELECT TRIM(' 示例文字 '); -- 输出: '示例文字'
-- 查询时去除首尾空格
SELECT TRIM(username) AS clean_name FROM users;-- 永久更新数据
UPDATE users SET username = TRIM(username);
2)左LRTM右RTRIM
SELECT LTRIM(' 左侧空格'); -- 输出: '左侧空格'
SELECT RTRIM('右侧空格 '); -- 输出: '右侧空格'
3)所有空格REPLACE
SELECT REPLACE('中 间 空 格', ' ', ''); -- 输出: '中间空格'
-- 删除 phone 字段中的所有空格
UPDATE customers SET phone = REPLACE(phone, ' ', '');
注意事项
-
大表更新时,分批处理(如
LIMIT 1000)。 -
为筛选字段添加索引(如
WHERE条件字段)。 -
TRIM('')返回空字符串,TRIM(NULL)返回NULL。 -
使用
COALESCE(TRIM(field), '')确保结果非NULL。
2、进阶处理
1)COALESCE()、IFNULL
SELECT TRIM(COALESCE(address, '')) AS clean_address FROM orders;
2)条件处理
SELECT CASE WHEN CHAR_LENGTH(TRIM(notes)) = 0 THEN '无备注'ELSE TRIM(notes)END AS formatted_notes
FROM orders;
动态格式化输出
-- 显示地址信息(首尾无空格,中间连续空格合并为单个)
SELECT id,REGEXP_REPLACE(TRIM(address), ' +', ' ') AS formatted_address
FROM customers;
五、数据截取
1、字符串
1)SUBSTR、SUBSTRING
从指定位置截取字符串的指定长度。
SUBSTRING(str, start_pos, length);SUBSTR(str, start_pos, length) -- 与SUBSTRING功能相同
start_pos:起始位置(从1开始计数)。
SELECT SUBSTRING('Hello World', 7, 5); -- 输出: 'World'
SELECT SUBSTR('2023-08-20', 1, 4); -- 输出: '2023'(截取年份)
2)LEFT、RIGHT
分别从左侧或右侧截取指定长度的字符串。
LEFT(str, length) -- 从左截取;RIGHT(str, length) -- 从右截取
SELECT LEFT('MySQL Tutorial', 5); -- 输出: 'MySQL'
SELECT RIGHT('123-456-7890', 4); -- 输出: '7890'(截取手机号后四位)
3)MID
与SUBSTRING()相同,但其语法更直观
SELECT MID('ABCDEFG', 3, 2); -- 输出: 'CD'
2、数值
1)TRUNCATE
TRUNCATE(number, decimals)截断数值的小数部分,保留指定小数位
SELECT TRUNCATE(123.4567, 2); -- 输出: 123.45
SELECT TRUNCATE(123.4567, -1); -- 输出: 120(截断整数部分)
2)ROUND
四舍五入到指定小数位(与 TRUNCATE 的区别在于是否四舍五入)
SELECT ROUND(123.4567, 2); -- 输出: 123.46
3、日期时间
1)DATE_FORMAT
DATE_FORMAT(date, format):格式化日期时间字段,提取特定部分(如年、月、日)
%Y:四位年份(如2023)
%m:两位月份(01-12)
%d:两位日期(01-31)
%H:小时(00-23)
%i:分钟(00-59)SELECT DATE_FORMAT(NOW(), '%Y-%m'); -- 输出: '2023-08'
2)专用日期函数
提取年/月/日
SELECT YEAR('2023-08-20') AS year, -- 输出: 2023MONTH('2023-08-20') AS month, -- 输出: 8DAY('2023-08-20') AS day; -- 输出: 20
4、JSON值获取
JSON_EXTRACT(json_doc, path[, path]...):通过 JSON 路径表达式(JSON Path)直接查询嵌套的 JSON 字段,适用于处理存储在 MySQL 中的半结构化数据。
json_doc:JSON 格式的文档(字段或字符串)。
path:JSON 路径表达式,指定要提取的数据位置。支持多个路径参数。
路径表达式
对象属性:使用点 . 访问,例如 $.name;
数组元素:使用方括号 [] 访问。例如 $[0];
嵌套结构:组合使用点和方括号,例如 $.address.street 或 $.items[0].name。
1)简单字段获取
{
"name": "Alice",
"age": 30,"is_active": true
}
SELECT JSON_EXTRACT('{"name": "Alice", "age": 30}', '$.name') AS name,JSON_EXTRACT('{"name": "Alice", "age": 30}', '$.age') AS age;-- 输出:
-- name: "Alice"(JSON 字符串)
-- age: 30(JSON 数值)
2)嵌套字段获取
{
"person": {
"name": "Bob",
"address": {
"city": "Beijing",
"postcode": "100000"
}
}
}
SELECT JSON_EXTRACT(json_column, '$.person.address.city') AS city
FROM users;-- 输出:"Beijing"
3)数组元素获取
{
"tags": ["MySQL", "Database", "JSON"]
}
SELECT JSON_EXTRACT(json_column, '$.tags[0]') AS first_tag,JSON_EXTRACT(json_column, '$.tags[2]') AS third_tag
FROM posts;-- 输出:
-- first_tag: "MySQL"
-- third_tag: "JSON"
4)技巧使用
-- JSON 字符串返回值默认带引号,可使用 JSON_UNQUOTE() 转换为普通字符串:
SELECT JSON_UNQUOTE(JSON_EXTRACT('{"name": "Alice"}', '$.name'));
-- 输出: Alice-- 简化
-- ->:等价于 JSON_EXTRACT()
-- ->>:等价于 JSON_UNQUOTE(JSON_EXTRACT())
SELECT profile->'$.address.city' AS city_json,profile->>'$.address.city' AS city_text
FROM users;-- 当路径不存在时返回默认值
SELECT COALESCE(JSON_EXTRACT(profile, '$.nickname'), '无名') AS nickname
FROM users;
5、正则表达式
REGEXP_SUBSTR
SELECT REGEXP_SUBSTR('Email: alice@example.com', '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}');
-- 输出: 'alice@example.com'
六、数据拆分
1、按分隔符拆分
SUBSTRING_INDEX(str, delimiter, count):分隔符截取
LEFT()、RIGHT():截取左右部分
UPDATE users
SETlast_name = SUBSTRING_INDEX(full_name, ',', 1),first_name = SUBSTRING_INDEX(full_name, ',', -1);
2、按位置拆分
-- 更新 order_prefix 列
UPDATE orders
SET order_prefix = LEFT(order_number, 3);-- 更新 order_suffix 列
UPDATE orders
SET order_suffix = SUBSTRING(order_number, 4);
七、数据求值
1、基本运算
加减乘除:+ - * /
2、聚合函数
-- COUNT():统计行数; SUM():计算总和; AVG():计算平均值
-- MIN()、MAX():最小最大值SELECT COUNT(*) AS total_users,AVG(age) AS avg_age,MAX(salary) AS max_salary
FROM employees;
3、数学函数
-- ROUND():四舍五入; CEIL()、FLOOP():向上向下取整
-- ABS():绝对值; POW()、SQRT():冥运算和平方根SELECT ROUND(123.4567, 2); -- 输出: 123.46
SELECT CEIL(123.45), FLOOR(123.45); -- 输出: 124, 123
SELECT ABS(-10); -- 输出: 10
SELECT POW(2, 3), SQRT(16); -- 输出: 8, 4
4、常见处理
1)日期计算
DATEDIFF():计算日期差
-- 输出: 2023-10-12 12:34:56
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
DATE_ADD()、DATE_SUB():日期加减
-- 输出: 2023-10-12 12:34:56
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
2)条件处理
CASE WHEN:多条件判断
SELECT CASE WHEN score >= 90 THEN 'A'WHEN score >= 80 THEN 'B'ELSE 'C'END AS grade
FROM exams;
ROW_NUMBER():每行分配唯一序号
SELECT ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank,name, salary
FROM employees;
RANK()、DENSE_RANK():计算排名
SELECT RANK() OVER (ORDER BY score DESC) AS rank,name, score
FROM students;
SUM()、OVER():计算累计和
SELECT month, revenue,SUM(revenue) OVER (ORDER BY month) AS cumulative_revenue
FROM sales;
变量计算累计和
SET @total := 0;
SELECT order_id, amount,(@total := @total + amount) AS running_total
FROM orders;
稍纵即逝谁为先,撸起袖子加油干。
相关文章:
菜鸟开发之MySQL常见字段值处理
仰天大笑出门去,我辈更要谱天曲。 SQL一日同风起,基础不夯注定倾。 众里寻它千百度,蓦然回首,那个错误还在吐。 Java开发该过程中性能问题是存在的,而数据处理则是占据大头,平时开发一定要注意代码质量和…...
ubuntu-学习笔记-nginx+php
nginxphp nginx下载nginx配置nginx.conf php其他 记录一下在ubuntu中nginxphp部署tp项目 nginx nginx就是正常下载 下载nginx sudo apt-get install nginx tp项目版本是3.2,通过设置路由,以域名/api.php/控制器/xxx的格式进行api的调用,文…...
【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)
文章目录 一、MySQL 用户管理1.1 用户管理1.11 mysql.user表详解1.12 添加用户1.13 修改用户权限1.14 删除用户1.15 密码问题 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件结构2.3 常用配置参数 三、MySQL远程连接四、数据库的查看、创建、删除4.1 查看数据库4.2 创建、删除…...
牛客网刷题(5)(HTML之元素<input>、表格<table>与描述列表<dl>、元素<label>)
目录 一、哪种输入类型定义滑块控件?元素(input) (1)官方解析。 (2)总结。 (3)牛客大佬总结。 (4)HTML5——元素(input)的…...
语音视频App协议安全实战:防御伪造/窃听/Deepfake攻击
一、SDP协议安全加固 1. SDP字段校验(防止参数篡改) 安全SDP生成示例(Node.js): const crypto require(crypto); function signSDP(sdp) { const hmac crypto.createHmac(sha256, SECRET_KEY); hmac.update(sd…...
Git系列之git checkout
git checkout 是 Git 中最常用的命令之一,主要用于切换分支、恢复文件或检出特定提交。以下是关于 git checkout 的所有指令、详细解释及实际应用场景的全面说明。 1. 切换分支 1.1 切换到现有分支 git checkout <branch-name>• 作用:切换到指定…...
IDEA(十一)调整新版本的工具栏显示Git操作(pull、commit、push、revert等)
目录 一、背景二、操作步骤2.1 开启新 UI 样式2.2 设置 Tool Window 工具栏 一、背景 好久没有更新 IDEA 了,更新之后发现 IDEA 的工具栏消失了。一番操作之后,终于把 IDEA 的工具栏的设置调整好了,在此进行记录调整步骤,供大家学…...
C++编程:进阶阶段—4.2对象
目录 4.2 对象特征 4.2.1 构造函数和析构函数 4.2.2 构造函数的分类 4.2.3 拷贝函数调用时机 4.2.4 构造函数调用规则 4.2.5 深拷贝与浅拷贝 4.2.6 初始化列表 4.2.7 类对象作为类成员 4.2.8 静态成员 4.2.9 成员变量和成员函数的存储 4.2.10 this指针 4.2.11 空指针…...
决策树的核心思想
一、决策树的核心思想 本质:通过特征判断对数据集递归划分,形成树形结构。目标:生成一组“若-则”规则,使数据划分到叶子节点时尽可能纯净。关键流程: 特征选择:选择最佳分裂特征(如信息增益最…...
TensorFlow.js 全面解析:在浏览器中构建机器学习应用
TensorFlow.js 全面解析:在浏览器中构建机器学习应用 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 TensorFlow.js 全面解析&#x…...
CI/CD—Jenkins配置Poll SCM触发自动构建
Poll SCM简介 在 Jenkins 等持续集成工具中,“Poll SCM” 是一种用于轮询软件配置管理(SCM)系统以检查代码变更的机制,以下是对它的详细介绍: 作用 “Poll SCM” 允许 Jenkins 定期检查指定的 SCM 系统(如 …...
《云原生技术:DeepSeek分布式推理的效能倍增器》
在当今人工智能飞速发展的时代,大语言模型的推理能力成为了衡量其性能的关键指标。DeepSeek作为人工智能领域的重要参与者,致力于提升模型的推理效率和准确性。而云原生技术的出现,为DeepSeek实现更高效的分布式推理提供了强大的支持。 云原…...
AI与SEO关键词智能解析
内容概要 人工智能技术正重塑搜索引擎优化的底层逻辑,其核心突破体现在关键词解析维度的结构性升级。通过机器学习算法对海量搜索数据的动态学习,AI不仅能够识别传统TF-IDF模型中的高频词汇,更能捕捉语义网络中隐含的关联特征。下表展示了传…...
OpenHarmony子系统开发 -- 构建系统编码规范与最佳实践
OpenHarmony子系统开发 -- 构建系统编码规范与最佳实践 概述 gn是generate ninja的缩写,它是一个元编译系统(meta-build system),是ninja的前端,gn和ninja结合起来,完成OpenHarmony操作系统的编译任务。 gn简介 目…...
1-002:MySQL InnoDB引擎中的聚簇索引和非聚簇索引有什么区别?
在 MySQL InnoDB 存储引擎 中,索引主要分为 聚簇索引(Clustered Index) 和 非聚簇索引(Secondary Index)。它们的主要区别如下: 1. 聚簇索引(Clustered Index) 定义 聚簇索引是表数…...
STM32之BKP
VBAT备用电源。接的时候和主电源共地,正极接在一起,中间连接一个100nf的电容。BKP是RAM存储器。 四组VDD都要接到3.3V的电源上,要使用备用电池,就把电池正极接到VBAT,负极跟主电源共地。 TEMPER引脚先加一个默认的上拉…...
c++的基础排序算法
一、快速排序 1. 选择基准值(Pivot) 作用 :从数组中选择一个元素作为基准(Pivot),用于划分数组。常见选择方式 : 固定选择最后一个元素(如示例代码)。随机选择…...
基于Spring3的抽奖系统
注:项目git仓库地址:demo.lottery 小五Z/Spring items - 码云 - 开源中国 目录 注:项目git仓库地址:demo.lottery 小五Z/Spring items - 码云 - 开源中国 项目具体代码可参考仓库源码,本文只讲解重点代码逻辑 一…...
基于qiime2的16S数据分析全流程:从导入数据到下游分析一条龙
目录 创建metadata 把数据导入qiime2 去除引物序列 双端合并 (dada2不需要) 质控 (dada2不需要) 使用deblur获得特征序列 使用dada2生成代表序列与特征表 物种鉴定 可视化物种鉴定结果 构建进化树(ITS一般不构建进化树…...
【Linux系统编程】基本IO函数
目录 1、open 函数2、create 函数3、write 函数4、read 函数5、lseek 函数6、access 函数7、unlink 函数8、remove 函数9、fcntl 函数写锁互斥锁示例读锁共享锁示例 1、open 函数 头文件 #include<sys/types.h> #include<sys/stat.h>#include<fcntl.h>…...
Deepseek应用技巧-chatbox搭建前端问答
目标:书接上回,由于本地私有化部署了deepseek的大模型,那怎么能够投入生产呢,那就必须有一个前端的应用界面,好在已经有很多的前人已经帮我们把前段应用给搭建好了,我们使用就可以啦,今天我们就…...
OpenAI API模型ChatGPT各模型功能对比,o1、o1Pro、GPT-4o、GPT-4.5调用次数限制附ChatGPT订阅教程
本文包含OpenAI API模型对比页面以及ChatGPT各模型功能对比表 - 截至2025最新整理数据:包含模型分类及描述;调用次数限制; 包含模型的类型有: Chat 模型(如 GPT-4o、GPT-4.5、GPT-4)专注于对话,…...
Fast DDS Security--秘钥交换
Fast DDS Security模块中默认使用Diffie-Hellman算法进行秘钥交换。Diffie-Hellman 算法(简称 DH 算法)是一个非常重要的加密协议,用于在不安全的通信通道中安全地交换密钥。该算法通过利用数学中的离散对数问题来生成共享密钥,使…...
从0开始的操作系统手搓教程33:挂载我们的文件系统
目录 代码实现 添加到初始化上 上电看现象 挂载分区可能是一些朋友不理解的——实际上挂载就是将我们的文件系统封装好了的设备(硬盘啊,SD卡啊,U盘啊等等),挂到我们的默认分区路径下。这样我们就能访问到了ÿ…...
基于muduo+mysql+jsoncpp的简易HTTPWebServer
一、项目介绍 本项目基于C语言、陈硕老师的muduo网络库、mysql数据库以及jsoncpp,服务器监听两个端口,一个端口用于处理http请求,另一个端口用于处理发送来的json数据。 此项目在实现时,识别出车牌后打包为json数据发送给后端服务…...
【Go学习实战】03-2-博客查询及登录
【Go学习实战】03-2-博客查询及登录 读取数据库数据初始化数据库首页真实数据分类查询分类查询测试 文章查询文章查询测试 分类文章列表测试 登录功能登录页面登录接口获取json参数登录失败测试 md5加密jwt工具 登录成功测试 文章详情测试 读取数据库数据 因为我们之前的数据都…...
《Python实战进阶》No20: 网络爬虫开发:Scrapy框架详解
No20: 网络爬虫开发:Scrapy框架详解 摘要 本文深入解析Scrapy核心架构,通过中间件链式处理、布隆过滤器增量爬取、Splash动态渲染、分布式指纹策略四大核心技术,结合政府数据爬取与动态API逆向工程实战案例,构建企业级爬虫系统。…...
2021 年 9 月青少年软编等考 C 语言六级真题解析
目录 T1. 合法出栈序列思路分析T2. 奇怪的括号思路分析T3. 区间合并思路分析T4. 双端队列思路分析T1. 合法出栈序列 题目链接:SOJ D1110 给定一个由不同小写字母构成的长度不超过 8 8 8 的字符串 x x x,现在要将该字符串的字符依次压入栈中,然后再全部弹出。要求左边的字…...
Linux:多线程(单例模式,其他常见的锁,读者写者问题)
目录 单例模式 什么是设计模式 单例模式介绍 饿汉实现方式和懒汉实现方式 其他常见的各种锁 自旋锁 读者写者问题 逻辑过程 接口介绍 单例模式 什么是设计模式 设计模式就是一些大佬在编写代码的过程中,针对一些经典常见场景,给定对应解决方案&…...
shell 脚本的编写学习
学习编写 Shell 脚本是 Linux/Unix 系统管理和自动化的一个非常有用的技能。Shell 脚本是一些 Shell 命令的集合,用户可以用它来自动执行任务、简化工作流程、管理系统等。下面是一个 Shell 脚本学习的入门指南: 1. Shell 脚本基础 Shell 脚本通常是以…...
