一.日期函数

获得年月日:

获得时分秒

获取时间戳


描述当前日期时间

在日期的基础上加日期:



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

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

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

- 日期:年月日
- 时间:时分秒
练习:
创建一张表,记录生日


创建留言表:

插入数据:


只显示日期和时间

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

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

这张图方便大家理解

想查最近N分钟内的数据,核心逻辑是:
要么 sendtime > 现在 - N分钟
要么 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 做的事情是:
输入:字符串
"root"计算:用 MySQL 特有的哈希算法(两次 SHA1 + 特殊格式)
输出:固定 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的值

