【MYSQL】 内置函数--详解

一.日期函数

获得年月日:

获得时分秒

获取时间戳

描述当前日期时间

在日期的基础上加日期:

在日期的基础上减去时间:

计算两个日期之间相差多少天

date表示得的日期(年月日)

  • 日期:年月日
  • 时间:时分秒

练习:

创建一张表,记录生日

创建留言表:

插入数据:

只显示日期和时间

显示所有留言信息,发布日期只显示日期,不用显示时间

请查询在2分钟内发布的帖子

这张图方便大家理解

想查最近N分钟内的数据,核心逻辑是:

  1. 要么 sendtime > 现在 - N分钟

  2. 要么 sendtime + N分钟 > 现在


二.字符串函数

获取字符集

获取emp表的ename列的字符集

连接字符串

instr(string, substrin)返回substring在string中出现的位置,没有返回0

转换大写

转换小写

left(string2, length) 从string2左边起取length个字符

strcmp(string1, string2) 逐字符比较两字符串大小

strcmp 的核心原理

strcmp 比较两个字符串的原理可以总结为:按字符逐位比较,一旦分出大小立即停止,全部相同才返回相等。

返回值 含义 记忆口诀
1 string1 > string2 前面的大于后面 → 1
-1 string1 < string2 前面的小于后面 → -1
0 两个完全相同 一样 → 0

显示表中信息(按指定格式显示)

显示格式:"XXX的语文是XXX分,数学XXX分,英语XXX分"

求学生表中学生姓名占用的字节数

length 函数返回字符串长度,以字节为单位。

复制代码
strcmp(string1, string2)    → 逐字符比较两字符串大小  
  • 是多字节字符则计算多个字节数。
  • 是单字节字符则算作一个字节。比如:字母,数组算作一个字节 ,中文表示多个字节数(与字符集编码有关)

将EMP表中所有名字中有S的替换成'上海'

截取EMP表中ename字段的第二个到第三个字符

以首字母小写的方式显示所有员工的姓名

去除空格:

三.数学函数

绝对值

十进制转二进制

把对应的数字转换成十六进制

进制转换

向上取整

向上取整:

:向 +∞ 方向取整,取大于等于它的最小整数。。

向下取整

向 -∞ 方向取整,取小于等于它的最大整数

保留小数位数(小数四舍五入)

产生随机数

产生0~100,1~100的是随机数

模运算(取模、求余)

0向取整 (也叫 向零取整 / 截断取整)

定义是:向 0 的方向取整,直接丢弃小数部分。

TRUNCATE(x, 0) 或 CAST(x AS SIGNED) 或 DIV 来实现 0 向取整。

sql 复制代码
 TRUNCATE 函数
-- 正数:直接截断小数
SELECT TRUNCATE(3.9, 0);   -- 结果: 3
SELECT TRUNCATE(3.1, 0);   -- 结果: 3
SELECT TRUNCATE(3.0, 0);   -- 结果: 3

-- 负数:也是直接截断(朝 0 方向)
SELECT TRUNCATE(-3.1, 0);  -- 结果: -3
SELECT TRUNCATE(-3.9, 0);  -- 结果: -3
SELECT TRUNCATE(-3.0, 0);  -- 结果: -3
2. CAST 转换为整数
-- 正数
SELECT CAST(3.9 AS SIGNED);   -- 结果: 3
SELECT CAST(3.1 AS SIGNED);   -- 结果: 3

-- 负数
SELECT CAST(-3.9 AS SIGNED);  -- 结果: -3
SELECT CAST(-3.1 AS SIGNED);  -- 结果: -3
 CAST(... AS UNSIGNED) 只能处理非负数,负数会变成 0。

3. 整数除法 DIV(整除)

-- 正数
SELECT 9 DIV 2;    -- 9 ÷ 2 = 4.5 → 0向取整 → 4
SELECT 7 DIV 2;    -- 7 ÷ 2 = 3.5 → 3

-- 负数
SELECT -9 DIV 2;   -- -9 ÷ 2 = -4.5 → 0向取整 → -4
SELECT -7 DIV 2;   -- -7 ÷ 2 = -3.5 → -3

四. 其它函数

user()

查询当前用户

database()

显示当前正在使用的数据库

md5(str)

对一个字符串进行md5摘要,摘要后得到一个32位字符串

对一个字符串进行md5摘要,摘要后得到一个32位字符串

password()

select password('用户名');

MySQL数据库使用该函数对用户加密

"对用户加密" :不是对数据加密,而是对用户登录密码加密存储

mysql5.7旧版:

MySQL 做的事情是:

  1. 输入:字符串 "root"

  2. 计算:用 MySQL 特有的哈希算法(两次 SHA1 + 特殊格式)

  3. 输出:固定 41 位字符串 *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B

这个结果不是"加密后的密码",而是"密码的哈希指纹"。

  • 旧版 MySQL(5.x 及以前) :PASSWORD() 函数用于计算 MySQL 用户密码的哈希值,常用于 SET PASSWORD 或 CREATE USER 语句中。

  • 新版 MySQL(8.0 及以上) :出于安全考虑,MySQL 官方移除了 PASSWORD() 函数 。如果你在 MySQL 8.0+ 中执行 SELECT PASSWORD('root');,就会报告语法错误(Error 1064),因为系统根本不认识这个函数了。

如果你需要做密码相关操作,请使用以下替代方案:

目的 推荐方法 示例
计算字符串的哈希值(普通加密) SHA2() 或 MD5() SELECT SHA2('root', 256);
创建用户并设置密码(推荐) CREATE USER ... IDENTIFIED BY ... CREATE USER 'test'@'localhost' IDENTIFIED BY 'root';
修改用户密码(推荐) ALTER USER ... IDENTIFIED BY ... ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
验证用户密码(应用程序) 使用 SHA2() 等自己加盐存储 SELECT SHA2(CONCAT('salt', 'root'), 256);

适合mysql8.0及以上

sql 复制代码
 使用 SHA2 进行哈希(更安全,返回 64 位十六进制字符串)
SELECT SHA2('root', 256);  
-- 结果: '4813494d137e1631bba301d5acab6e7bb7aa74ce1185d456565ef51d737677b2'

-- 使用 MD5(较短,但安全性不如 SHA2)
SELECT MD5('root');        
-- 结果: '63a9f0ea7bb98050796b649e85481845'

操作用户密码的正确方式(系统级):

sql 复制代码
-- 创建新用户并设置密码
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'secure_password';

-- 修改现有用户密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_root_password';

-- 或者(旧风格,不推荐)
SET PASSWORD FOR 'root'@'localhost' = 'new_password';  -- 某些版本仍支持,但推荐 ALTER USER

ifnull(val1, val2)

如果val1为null,返回val2,否则返回val1的值

相关推荐
Web3&Basketball4 小时前
DeepSeek V4.1 Flash 实测:Token 砍半、Search API 跑通
数据库·人工智能·python·大模型·api调用·deepseek·推理优化
川石课堂软件测试4 小时前
涨薪技术|0到1学会性能测试第9课-HTTP响应统计
数据库·功能测试·网络协议·http·kubernetes·单元测试·测试用例
竣达技术4 小时前
Modbus 转 SNMP 协议转换器|自定义协议 + SNMP TRAP 主动上报
运维·服务器·网络·数据库·安全
VX_bysjlw9855 小时前
基于协同过滤的美食推荐系统的设计与实现32221-计算机毕设原创(免费领源码+带部署教程)
java·spring boot·redis·mysql·tomcat·maven·mybatis
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 18 PostgreSQL基本索引原理与创建
数据库·笔记·postgresql
l1t5 小时前
DeepSeek总结的本地优先的分析不需要数据库服务器
运维·服务器·数据库·人工智能·duckdb
十碗饭吃不饱5 小时前
MySQL InnoDB RR 隔离下二级索引临键锁引发 INSERT 锁超时 全链路解析
java·数据库·mysql
Gh0st_Lx6 小时前
【2】MySQL 为什么使用 B+树
数据库·b树·mysql
我不会插花弄玉6 小时前
8. 复合查询【由浅入深-MySQL】
android·数据库·mysql