【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 PASSWORDCREATE 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的值

相关推荐
AI人工智能+电脑小能手14 小时前
【大白话说Java面试题 第80题】【Mysql篇】第10题:MySQL 在什么条件下索引失效?
java·开发语言·mysql·adb·面试
whn197714 小时前
ORACLE异常sql解析的案例
数据库·sql·oracle
夏贰四14 小时前
用好数据建模工具能解决哪些问题?如何正确选用建模工具?
大数据·数据库·数学建模·数据建模工具
小欣加油14 小时前
Hadoop开发环境搭建
大数据·数据库·hadoop
我是一颗柠檬14 小时前
【MySQL全面教学】MySQL存储过程与函数Day11(2026年)
数据库·后端·mysql
浪客灿心14 小时前
MySQL用户管理及c语言链接
mysql
霸道流氓气质14 小时前
外部系统回调的异步处理架构:接收、落库、MQ消费、推送的完整设计
数据库·架构
程序猿乐锅14 小时前
【MySQL | 第三篇】MySQL存储引擎详解
数据库·mysql
TDengine (老段)14 小时前
TDengine 数据文件格式 — TSDB 文件集的物理结构与块编码
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据