【MySQL】一些内置函数(时间函数、字符串函数、数学函数等,学会了有妙用)
内置函数
- 前言
- 正式开始
- 时间函数
- 显示当前日期、时间、日期时间的
- 日期计算
- 相差多少天
- 示例
- 创建一张表,记录生日
- 留言表
- 字符串函数
- charset
- concat
- instr(string, substring)
- ucase和lcase
- left(string, length)
- length求字符串长度
- replace(str, search_str, replace_str)
- trim、ltrim、rtrim
- 一些示例
- 要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分"
- 求学生表中学生姓名占用的字节数
- 将EMP表中所有名字中有S的替换成'上海'
- 截取EMP表中ename字段的第二个到第三个字符
- 以首字母小写的方式显示所有员工的姓名
- 数学函数
- abs
- bin
- hex
- conv(num, from_base, to_base)
- ceiling 和 floor
- format(一个小数, 指定小数位数)
- mod
- rand
- 其他函数
- user
- database
- md5
- ifnull(val1, val2)

前言
MySQL中内置类很多函数,这些函数可以让我们在进行数据统计、查表、建表的时候更加方便,本篇将MySQL中的内置函数分为四类,分别是:
-
时间函数
-
字符串函数
-
数学函数
-
其他函数
正式开始
时间函数
讲下面这些(先不用细看):

简单介绍介绍。
首先声明一点,日期是指年月日,时间是指时分秒,日期时间是年月日时分秒。这在我前面的博客也是说过的。
显示当前日期、时间、日期时间的
current_date,当前日期,就是返回你调用这个函数时的日期:
不加括号也行,不过既然叫了函数那就最好把括号带上。
【注意】这些内置函数都要搭配着select使用,不然显示不出来:

关于select我就不说了,在前面博客已经详细说过了。
current_time,当前时间,就是返回你调用这个函数时的时间:
就不演示不带括号的了。
current_timestamp(),当前时间戳,时间和日期都会显示:
、
我前面在讲数据类型的时候,有个类型就叫做timestamp,默认值就是插入数据时的时间戳。
还有一个和这个时间戳很像,就是now:
其实就和current_timestamp一样的效果。
日期计算
两个,一个加一个减。
date_add,可以加年、月、日、时、分、秒。
还可以搭配前面的now来用:
会自动按照你给的类型来计算,类型不同结果也就不同。注意interval不能掉,还有类型也不能掉。
date_sub同理,就不说了。
相差多少天
date_diff,这个是计算两个日期之间相差多少天:

这个是用前者前去后者,故会出现负数的情况:

也可以嵌套调用:

统计工龄的时候就可以用这个函数。
时间的接口就讲这么些来两个例子。
示例
创建一张表,记录生日
生日一般精确到年月日就可以了,时分秒这里就不记录了。
创表:

里面的这些类型什么的我就不讲了,我前面的博客中有。
插入点数据:

因为id是自增的,所以不用手动插入。
再来嵌套调用:

能不能插入纯时分秒的呢?

竟然可以。
再来试一个:

竟然也可以。
我为啥说竟然呢?
因为我前面在讲数据类型的时候说过数据类型其实算是一种约束,MySQL对于数据匹配的要求是很严格的,但这里并没有那么严格,像隐式类型转换,把这当成例外。
其实可以理解成所有的时间函数底层用的都是一个函数,不过是要哪个显示哪个罢了。不过建议插入的时候类型为日期就用日期插,不要加时间。
留言表
平时很多软件都有评论区,评论有一个很重要的字段就是时间,比如说xxx发布于2023-10-23,其实原理就是客户点击发送,数据发送到后台服务器后,后台服务器将其转为sql语句对数据库做插入动作,这里就简单实现一个。

插入点数据:

这样就能把评论内容和评论时间拿到手。
如果显示时只想显示日期,就在sendtime外套个date就行:

再插入点:

来个问题:统计2分钟内发布过的帖子。
怎么确定表中的哪些数据是两分钟以内的?
找到当前时间的两分钟前的时间,假如说当前时间是 t 0 t_0 t0,当前时间的2分钟前是 t 1 t_1 t1,所以 t 1 t_1 t1的值就是 t 0 − 2 t_0 - 2 t0−2,对应图中就应该是这样:

此时在 t 1 ∼ t 0 t_1 \sim t_0 t1∼t0之内的帖子就是我们想要的,那这之中的帖子在时间上有什么特点呢?假如说帖子的时间是 t t t,那么就是这样:

这里t一定是小于 t 0 t_0 t0的,这点对于所有的帖子都会满足。
那么就好说了,只要让 t > t 1 t > t_1 t>t1就行了,也就是 t > t 0 − 2 t > t_0 - 2 t>t0−2,那么就会有两种解法:
t > t 0 − 2 t > t_0 - 2 t>t0−2 和 t + 2 > t 0 t + 2 > t_0 t+2>t0
都来试一试,插入点数据:

然后筛选:

再重新插入点:

筛选:

筛选:

可以看到都是ok的。
字符串函数
讲这些:

charset
charset,查看字符集:


再用一下我前面博客定义的一张表:


都是utf8的。因为我的配置文件搞了默认的字符集。
再显示一下数字的:

concat
concat,追加的函数,只要是字符串就能追加,不管字符串的内容,有点像C中的strcat,来点例子:


里面可以有多个串:

没啥难的。
instr(string, substring)
这个函数是用来查询substring是否在string中,如果在就会返回其在第一个字符的位置,如果不在就返回0。
例子:

这里1234在abcde12345efg中,1在其中的第六个位置,这里是从1开始的,不是从0开始的。
再来个不存在的:

有点像find_in_set,这个是用来查找某一项是否在一个集合当中,如果在会返回其在集合中的位置,如果不在会返回0。想了解一下的可以看我这篇博客:【MySQL】数据类型
ucase和lcase
这两个是用来转大小写的,u是up,转大;l是low,转小。
转大写:

其中不是字母的就不会管。
转小写:

left(string, length)
这个函数用来取string左边的length个字符。
演示:

那有没有right?

有的。
length求字符串长度

这里编码会导致结果有点和你想的不一样:

因为utf8下一个汉字占用3个字节。而且utf8还是变长的编码,一部分是1字节的,比如说我在其中加上一点英文字母:

其中你好占用6字节,abc占用3字节。
replace(str, search_str, replace_str)
这个函数在str中找到searche_str字符串并将searche_str替换成replace_str。
例如:

这里将123456789中的567替换成了你好。
trim、ltrim、rtrim
这三个用来去掉左右两边字符串的空格。
trim是两边都去掉,ltrim是只去掉左边的,rtrim是只去掉右边的。

有时可能因为网络传输而导致传输的字符串左右两侧出现一些空格,此时不能让这些左右两侧的空格保存在数据库中,不然如果是用户的密码的话,用户后面就没法认证了,而且如果出现了这种问题还很难查出来问题所在,因为空格不可显。此时就可以用trim剪掉两边的空格,来避免这些问题。
一些示例
下面的所有示例都要用到刚刚讲的一些内置函数。
要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分"
下面的两个例子,基于这张表的:

就是改一下打印格式,打印的时候不要像上面表中那样分格打印,而是全部拼接到一块,假如说是为了发短信要这样搞。
直接用一个concat:

但是这样搞出来很难看,加点东西:

这样就可以将所有的内容拼接一块发出去,没人对应一条信息。
求学生表中学生姓名占用的字节数
其实就是用length。

还是因为utf8中一个汉字3个字节。
再强调一下:length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)
将EMP表中所有名字中有S的替换成’上海’
下面的三个例子基于我前一篇中搞的这张表:

将EMP表中所有名字中有S的替换成’上海’,就是用replace:

这些内置函数并不会影响原表中的数据。
截取EMP表中ename字段的第二个到第三个字符
不能用left或者right,二者取不到中间的数,不过嵌套调用也能实现,不过比较麻烦。
用substring,这个函数前面没说,其实就和C++中string的substr一样,取子串的。

以首字母小写的方式显示所有员工的姓名
嵌套调用一下:

其中substring如果没有给第三个参数,就会将指定子串位置后面的所有子串全部返回。
用left拿到第一个字符,然后转成小写,再和后面的字符串拼接。
数学函数
这些:

演示一下:
abs
求绝对值的:

bin
求二进制的:
hex
求十六进制的:
conv(num, from_base, to_base)
指定num从from_base进制转换成to_base进制:
其实这里覆盖了前面的两个进制转换。
ceiling 和 floor
一个向上取整(ceiling,天花板的意思),一个向下取整(floor,地板)。说说啥意思。这两个都是针对小数的。
向上取整:只要有小数部分,就直接取大的值,比如说2.1,就直接直接转成3。转成最近的大的数。再比如说-2.1,那就回转成-2,转成比原数大的最近的整数,也就是-2。看这张图:
如果是2.5,向上取整就是3,如果是-2.9,线上取整为-2。
这就是向上取整。向下取整,只要有小数,就取小的值,比如说下图中2.1,取的是2,-2.1取的是-3:
如果是-2.9,向下取整为-3,如果是2.9,向下取整为2。
看这两个函数的例子,向上的:

向下的:

还有两中取整,一种是0向取整,还有一种是小学都学过的四舍五入。
0向取整,其实也很常见,就是直接舍弃掉小数部分,在C语言中很常见,比如两个整数的除法,9/2,得到的数应该是4.5,但是语言中是直接去掉0.5,得到4。再比如说-3.6,0向取整就是-3,图是这样的:

format(一个小数, 指定小数位数)
这个是对于小数有用,指定多少位小数:

上面就是保留两位小数。
再来个保留五位小数的:

mod
取模的函数:

关于负数取模咋做的我这里就不说了,重点不在这,不会的同学自行搜一搜。
rand
产生随机数的函数,产生的数的范围是[0, 1.0):

如果你想要你指定范围的数,乘以几然后加加减减就行,比如说我想要0 ~ 100的:

如果不想要小数部分就直接用format:

其他函数
user
查询当前以什么身份登录:

database
当前选中的是哪个数据库:

md5
加密的东西,其实也不算加密,就是形成一个数据摘要,我前面在讲HTTPS的时候带过一嘴:

这个函数会形成一个摘要,所有的字符串形成的摘要都是等长的,但基本上不可能出现两个不同字符串产生相同摘要的情况,但是同一个字符串的摘要是相同的:

两个字符串哪怕是差了一个字符结果也都会相差很多:

一般数据库中不会直接保存用户的登录密码,一般都是先形成摘要然后再保存到数据库中,这样如果数据库被黑了,其中的数据黑客拿到后没法轻松的获取到用户的密码,这样用户的重要信息就不会泄漏。用户登录的时候是用密码先形成摘要,然后如果数据库有这个摘要就会登陆成功,如果没有这个摘要就认证失败。
还有一个password函数:

形成的摘要更长,password用的也是比md5多一点。
password形成的摘要也都是等长的。
ifnull(val1, val2)
这个函数和三木运算符有点像,如果val1是NULL就会返回val2,如果不是NULL就会返回val1,就好比val1 == NULL ? val2 :val1。
例子:


这个函数有些地方还是很有用的,我下一篇讲符合查询的时候就会用到。
这篇就介绍这么多。
到此结束。。。
相关文章:
【MySQL】一些内置函数(时间函数、字符串函数、数学函数等,学会了有妙用)
内置函数 前言正式开始时间函数显示当前日期、时间、日期时间的日期计算相差多少天示例创建一张表,记录生日 留言表 字符串函数charsetconcatinstr(string, substring)ucase和lcaseleft(string, length)length求字符串长度replace(str, search_str, replace_str)tri…...
QtC++与QColumnView详解
介绍 在 Qt 中,QColumnView 是用于显示多列数据的控件,它提供了一种多列列表视图的方式,类似于文件资源管理器中的详细视图。QColumnView 是基于模型/视图架构的,通常与 QFileSystemModel 或自定义模型一起使用。 以下是关于 QC…...
微信小程序配置企业微信的在线客服
配置企业微信后台 代码实现 <button tap"openCustomerServiceChat">打开企业微信客服</button>methods: {openCustomerServiceChat(){wx.openCustomerServiceChat({extInfo: {url: 你刚才的客服地址},corpId: 企业微信的id,showMessageCard: true,});} …...
深入理解Java AQS:从原理到源码分析
目录 AQS的设计原理1、队列节点 Node 和 FIFO队列结构2、state 的作用3、公平锁与非公平锁 AQS 源码解析1、Node节点2、acquire(int)3、release(int)4、自旋(Spin)5、公平性与 FIFO 基于AQS实现的几种同步器1、ReentrantLock:可重入独占锁2、…...
【数据结构(四)】栈(1)
文章目录 1. 关于栈的一个实际应用2. 栈的介绍3. 栈的应用场景4. 栈的简单应用4.1. 思路分析4.2. 代码实现 5. 栈的进阶应用(实现综合计算器)5.1. 栈实现一位数计算(中缀表达式)5.1.1. 思路分析5.1.2. 代码实现 5.2. 栈实现多位数计算(中缀表达式)5.2.1. 解决思路5.2.2. 代码实…...
实验(四):指令部件实验
一、实验内容与目的 实验要求: 利用CP226实验仪上的小键盘将程序输入主存储器EM,通过指令的执行实现微程序控制器的程序控制。 实验目的: 1.掌握模型机的操作码测试过程; 2.掌握模型机微程序控制器的基本结构以及程序控制的基本原…...
【Android11】在内置的Tvsettings的界面中显示以太网Mac地址
【Android11】在内置的Tvsettings的界面中显示以太网Mac地址 了解Preference必要信息步骤:1. 在设置页面的xml文件中增加一个Preference ,这是要显示出来的设置项2. 在strings.xml文件中增加我们在第一步新设置的值3. 为新加的设置项增加一个新的XXXPref…...
在Oracle 11g 数据库上设置透明数据加密(TDE)
本文回答2个问题: 11g下简明的TDE设置过程由于11g不支持在线TDE,介绍2中11g下的加密表空间的迁移方法 设置表空间TDE之前 表空间没有加密时,很容易探测到明文数据: create tablespace unsectbs datafile unsectbs.dbf size 10…...
互动直播 之 视频帧原始数据管理
目录 一、视频帧管理 1、存储图片数据的数据结构 1.1)、图片数据首地址...
基于tcp协议及数据库sqlite3的云词典项目
这个小项目是一个网络编程学习过程中一个阶段性检测项目,过程中可以有效检测我们对于服务器客户端搭建的能力,以及一些bug查找能力。项目的一个简单讲解我发在了b站上,没啥心得,多练就好。 https://t.bilibili.com/86524470252640…...
C/C++内存管理(1):C/C++内存分布,C++内存管理方式
一、C/C内存分布 1.1 1.2 二、C内存管理方式 C可以通过操作符new和delete进行动态内存管理。 2.1 new和delete操作内置类型 int main() {int* p1 new int;// 注意区分p2和p3int* p2 new int(10);// 对*p2进行初始化 10int* p3 new int[10];// p3 指向一块40个字节的int类…...
11 redis中分布式锁的实现
单机锁代码 import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.con…...
循环链表3
插入函数——插入数据,在链表plsit的pos位置插入val数据元素 位置pos(在无特别说明的情况下)是从0开始计数的 要改变链表结构,就要依赖前驱,每个前驱的next存储着下一个数据结点的地址,也就是依靠前驱的ne…...
如何修改百科内容?百度百科内容怎么修改?
百科词条创建上去是相当不易的,同时修改也是如此,一般情况下,百科词条是不需要修改的,但是很多时候企业或是人物在近期收获了更多成就或是有更多的变动,这个时候就需要补充维护词条了,如何修改百科内容&…...
mysql8.0英文OCP考试第131-140题
Q131.You have upgraded the MySQL binaries from 5.7.28 to 8.0.18 by using an in-place upgrade. Examine the message sequence generated during the first start of MySQL 8.0.18: 。。。[System]。。。/usx/sbin/mysqld (mysqld 8.0.18-commercial) starting as proces…...
MySQL数据库——存储过程-条件处理程序(通过SQLSTATE指定具体的状态码,通过SQLSTATE的代码简写方式 NOT FOUND)
目录 介绍 案例 通过SQLSTATE指定具体的状态码 通过SQLSTATE的代码简写方式 NOT FOUND 介绍 条件处理程序(Handler)可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体语法为: DECLARE handler_action HANDLER FOR c…...
信号的处理时机(内核态,用户态,如何/为什么相互转换,内核空间,cpu寄存器),信号的处理流程详细介绍+抽象图解
目录 信号的处理时机 引入 思考 -- 什么时候才能算合适的时候呢? 用户态转为内核态 引入 内核地址空间 引入 思考 -- 进程为什么能切换成内核态呢? 虚拟地址空间 注意点 原理 (总结一下) 为什么如何进入内核态 引入 介绍 底层原理(int 80) cpu的寄存器 用…...
【JavaEE】Spring的创建和使用(保姆级手把手图解)
一、创建一个Spring项目 1.1 创建一个Maven项目 1.2 添加 Spring 框架支持 在pom.xml中添加 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE&…...
MyBatis:关联查询
MyBatis 前言关联查询附懒加载对象为集合时的关联查询 前言 在 MyBatis:配置文件 文章中,最后介绍了可以使用 select 标签的 resultMap 属性实现关联查询,下面简单示例 关联查询 首先,先创建 association_role 和 association_…...
第十二章 控制值的转换
文章目录 第十二章 控制值的转换介绍处理特殊 XML 字符文字和 SOAP 编码格式的转义形式 示例防止泄漏的另一种方法 第十二章 控制值的转换 类和属性参数 ESCAPE CONTENT XMLTIMEZONE DISPLAYLIST VALUELIST XMLDEFAULTVALUE XMLLISTPARAMETER XMLSTREAMMODE 介绍 支…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...



、






