mysql的内置函数
文章目录
- mysql的内置函数
- 时间函数
- 1. 返回值的数据类型和格式
- 2. 功能侧重点
- 3. 函数别名情况
- 我现在想给一个日期加上十天,然后输出加上十天之后的日期,我该怎么做?
- 我现在想给一个日期减去两天,然后输出减去两天之后的日期,我该怎么做?
- 我现在想计算两个日期之间相差多少天,我该怎么做?
- 我现在创建出了一个表用来记录生日,请问我如何向表中插入一条生日信息?
- 留言板问题
- 我现在想创建一个留言板,里面的每条记录属性包含id,留言的内容,还有留言的日期,我该怎么做?
- 我现在想往这个留言板中插入一条记录,让日期自动填充当前时间,我该怎么做?
- 我现在想给这个留言板添加一栏,用于存放发表评论的用户名,我该怎么做?
- 我想输出两分钟以内发出的所有帖子,我该怎么做?
- 字符串函数
- charset是什么意思?怎么用?
- concat是啥意思?怎么用?
- instr的作用是什么?怎么用?
- ucase和lcase的作用是什么?怎么用?
- left的作用是什么?怎么用?
- replace的作用是什么?怎么用?
- strcmp的作用是什么?怎么用?
- substring的作用是什么?怎么用?
- ltrim和rtrim的作用是什么?怎么用?
- 我现在想获取emp表的ename列的字符集,我该怎么做?
- 我想在数据库中,以特定格式展示student表中的信息,具体格式为:“XXX的语文是XXX分,数学是XXX分,英语是XXX分” ,我该怎么做?
- 我想求学生表中学生姓名占用的字节数 ,我该怎么做?
- 我想将EMP表ename栏所有名字中的S替换成上海,我该怎么做?
- 现在我想截取EMP表中ename字段的第二个到第三个字符 ,我该怎么做?
- 我想以首字母小写的方式显示所有员工的姓名,我该怎么做?
- 数学函数
- 取-100.2的绝对值
- 将23.04向上取整
- 将23.7向下取整
- 对12.3456保留2位小数位数(小数四舍五入)
- 产生随机数
- 将十进制数10转化成二进制数
- 将十进制数15转化成16进制数
- 将16进制数10转化成2进制数
- 求10除以-3的余数
- 我现在想生成一个1000以内的随机数
- 其他函数
- 我现在想对一个字符串信息进行摘要加密,我该怎么做?
- ifnull(val1, val2) 这个表达式的值是多少?
mysql的内置函数
时间函数
在 MySQL 中,有三个比较常见的时间函数CURRENT_DATE()
、CURRENT_TIME()
和 CURRENT_TIMESTAMP()
,这三个函数有啥区别呢?
1. 返回值的数据类型和格式
CURRENT_DATE()
:- 数据类型:
DATE
类型。 - 格式:返回当前日期,格式为
YYYY-MM-DD
,只包含年、月、日信息,不包含时间部分。例如,在 2024年7月15日执行该函数,返回值为2024-07-15
。
- 数据类型:
CURRENT_TIME()
:- 数据类型:
TIME
类型。 - 格式:返回当前时间,格式为
HH:MM:SS
,只包含时、分、秒信息,不包含日期部分 。比如,在 14点35分20秒执行该函数,返回值为14:35:20
。
- 数据类型:
CURRENT_TIMESTAMP()
:- 数据类型:
DATETIME
类型 。 - 格式:返回当前日期和时间,格式为
YYYY-MM-DD HH:MM:SS
,既包含年、月、日,又包含时、分、秒。例如,在 2024年7月15日 14点35分20秒执行该函数,返回值为2024-07-15 14:35:20
。
- 数据类型:
2. 功能侧重点
CURRENT_DATE()
:主要用于获取当前日期,适用于仅需要日期信息的场景,比如统计当天的销售记录、计算某日期范围内的天数等 。CURRENT_TIME()
:专注于获取当前时间,在记录操作具体时间点(只关注时间部分),或者进行时间相关的逻辑判断(如判断是否在某个时间段内)时会用到 。CURRENT_TIMESTAMP()
:提供完整的日期和时间信息,适用于需要精确记录事件发生的日期和具体时刻的场景,比如记录用户登录时间、订单创建时间等 。
3. 函数别名情况
CURRENT_DATE()
:有别名CURDATE()
,二者功能完全相同,可根据个人习惯选用。CURRENT_TIME()
:有别名CURTIME()
,可以互相替换使用。CURRENT_TIMESTAMP()
:和NOW()
功能基本一致,都返回当前的日期和时间。不过在某些特殊场景下,NOW()
返回的是语句开始执行的时间,CURRENT_TIMESTAMP()
返回的是函数执行时的时间。
虽然这三个函数都是获取当前相关的日期时间信息,但通过数据类型、格式以及功能侧重点的差异,能满足不同的业务需求。
我现在想给一个日期加上十天,然后输出加上十天之后的日期,我该怎么做?
select + date_add()函数
,其中 date_add()第一个参数传入日期,第二个参数传入interval + 日期增量 + 增量单位
像这个题,你想加10天,那第二个参数就是interval 10 day ,如果你想加2年,那第二个参数就是interval 2 year
我现在想给一个日期减去两天,然后输出减去两天之后的日期,我该怎么做?
select + date_sub()函数
,其中date_sub()函数第一个参数传入日期,第二个参数传入日期增量
我现在想计算两个日期之间相差多少天,我该怎么做?
select datediff('日期1', '日期2');
我现在创建出了一个表用来记录生日,请问我如何向表中插入一条生日信息?
insert into tmp(birthday) values(current_date());
留言板问题
我现在想创建一个留言板,里面的每条记录属性包含id,留言的内容,还有留言的日期,我该怎么做?
我现在想往这个留言板中插入一条记录,让日期自动填充当前时间,我该怎么做?
insert into msg(content, sendtime) values('这是一条评论', now());
我现在想给这个留言板添加一栏,用于存放发表评论的用户名,我该怎么做?
ALTER TABLE msg ADD COLUMN username VARCHAR(50);
我想输出两分钟以内发出的所有帖子,我该怎么做?
select * from msg where date_add(sendtime, interval 2 minute) > now();
字符串函数
charset是什么意思?怎么用?
如何查询msg表中nickname这一列的数据编码方式/采用的字符集?
select charset(nickname) from msg
concat是啥意思?怎么用?
concat可以将几个小字符串连接成一个大字符串,使用方法如下
instr的作用是什么?怎么用?
instr(string, substring )
用来返回substring 在string中出现的位置
ucase和lcase的作用是什么?怎么用?
ucase可以将小写字母转成大写字母,lcase可以将大写字母转化成小写字母
使用方法是select + ucase/lcase(‘字符串’);
left的作用是什么?怎么用?
语法:left(string2, length)
作用:从string2中的左边起截取length个字符
如果length的长度大于总长,或者lenth小于0,会出现在怎样的情况呢?
length的长度大于总长,那么会返回整个字符串,如果lenth小于0,返回值为空
replace的作用是什么?怎么用?
在str中用replace_str替换search str
如果原字符串中没有替换目标字符串search str ,此时我们执行replace操作,结果会怎样呢?
结果原字符串无事发生,然后输出
strcmp的作用是什么?怎么用?
作用是比较两个字符串是否相等,用法是select + strcmp + (‘字符串1’, ‘字符串2’);
请问上图中,为什么第一个结果是-1,第二个结果是1?
因为’aaa’第一个字符a的ASCII码比’bbb’第一个字符b的ASCII码小,所以第一个返回-1,第二个结果是1
substring的作用是什么?怎么用?
select substring(str, pos,length);
从str的pos下标开始,截取length长度的子字符串,然后返回输出
如果lenth的值小于0,或者pos+lenth的长度超过了str的总长度,执行substring(str, pos,length);之后会出现什么结果呢?
如果lenth的值小于0,会返回空
如果pos+lenth的长度超过了str的总长度,那就会一直截取到str的末尾
ltrim和rtrim的作用是什么?怎么用?
ltrim(string):去除字符串左侧(前)的空格
rtrim(string):去除字符串右侧(后)的空格
trim(string):去除字符串左右两侧(前和后)的空格
我现在想获取emp表的ename列的字符集,我该怎么做?
select charset(ename) from emp;
我想在数据库中,以特定格式展示student表中的信息,具体格式为:“XXX的语文是XXX分,数学是XXX分,英语是XXX分” ,我该怎么做?
利用contat将几个字符串连起来
SELECT CONCAT(name, '的语文是', chinese, '分,数学是', math, '分,英语是', english, '分') AS info FROM student;
我想求学生表中学生姓名占用的字节数 ,我该怎么做?
问题转化:我想查看表中每条记录的name属性信息各占多少字节,我该怎么做?
select lenth(name) from exam_result;
注意:lenth(str),并不是求str有多少个字符。而是求str占多少个字节
我想将EMP表ename栏所有名字中的S替换成上海,我该怎么做?
这个是原表
使用replace语句替换ename列中的关键字
提问:执行过replace语句之后,数据库中ename列中的关键字会被永久修改吗?
不会,这个操作的实际流程是,select先筛选,再对筛选之后的结果(形成一份新文件)进行replace操作
现在我想截取EMP表中ename字段的第二个到第三个字符 ,我该怎么做?
调用substring函数
select substring(ename, 2,1) from emp;
我想以首字母小写的方式显示所有员工的姓名,我该怎么做?
- 先使用 SUBSTRING(name, 1, 1) 提取姓名的首字母
- 再用 LOWER 函数将其转换为小写
- 接着使用 SUBSTRING(name, 2) 获取姓名从第二个字符开始的部分
- 最后用 CONCAT 函数将二者拼接起来。
select concat(lcase(SUBSTRING(name, 1, 1)), SUBSTRING(name, 2)) from emp;
数学函数
取-100.2的绝对值
select abs(-100.2);
将23.04向上取整
select ceiling(23.04);
ceiling的意思是天花板
将23.7向下取整
select floor(23.7);
floor的英文意思是地板
对12.3456保留2位小数位数(小数四舍五入)
select format(12.3456, 2);
产生随机数
select rand();
将十进制数10转化成二进制数
bin(decimal_number):用于将十进制数转换为二进制数,例如 bin(10) 会得到 ‘1010’
将十进制数15转化成16进制数
hex(decimalNumber):把十进制数转换成十六进制数,像 hex(15) 结果是 ‘F’ 。
将16进制数10转化成2进制数
conv(number, from_base, to_base):实现数的进制转换
其中number 是要转换的数,from_base 是当前进制,to_base 是目标进制
比如 conv(10, 10, 2) 可将十进制的 10 转换为二进制,得到 ‘1010’
conv(10, 2, 16) 可将二进制的 10 转换为16进制,得到 2
求10除以-3的余数
mod(number, denominator):求余函数,计算 number 除以 denominator 的余数
例如 mod(7, 3) 返回 1 。
解释图中的结果
在 MySQL 中,MOD()函数用于取模运算,其运算规则基于公式a mod b = a - (b * FLOOR(a / b))
,这里FLOOR 是向下取整函数 。以下是对图中三个运算的解释:
SELECT MOD(10, -3);
先计算 10 / -3 ,结果约为 -3.33 。
然后对 -3.33 向下取整,得到 -4 。
再根据公式计算 10 - (-3 * -4) = 10 - 12 = -2 ,但 MySQL 中取模结果符号与被除数一致 ,被除数是 10 ,所以最终结果为 1 。
SELECT MOD(-10, 3);
计算 -10 / 3 ,结果约为 -3.33 。
向下取整得到 -4 。
由公式可得 -10 - (3 * -4) = -10 + 12 = 2 ,按照 MySQL 规则,结果符号与被除数一致,最终结果为 -1 。
SELECT MOD(-10, -3);
计算 -10 / -3 ,结果约为 3.33 。
向下取整得到 3 。
依据公式计算 -10 - (-3 * 3) = -10 + 9 = -1 ,结果符号与被除数一致,最终结果就是 -1 。
我现在想生成一个1000以内的随机数
mysql中rand生成随机数的范围是多少?
在 MySQL 里,RAND()函数会生成一个范围在 0(包含)到 1(不包含)之间的随机浮点数
SELECT FLOOR(RAND() * 1000);
SELECT FLOOR(RAND() * 1000);
这条语句的执行结果是一个介于 0 到 999 之间的随机整数(包含 0 和 999)。
-
RAND()
:生成一个 0(包含)到 1(不包含)之间的随机浮点数,例如0.123
、0.987
等。 -
RAND() * 1000
:将随机数放大 1000 倍,结果变为 0(包含)到 1000(不包含)之间的浮点数,例如123.456
、999.999
等。 -
FLOOR(...)
:对结果进行向下取整,只保留整数部分,且不四舍五入。例如:- 若
RAND() * 1000
结果为123.456
,FLOOR
后得到123
; - 若结果为
999.999
,FLOOR
后得到999
; - 若结果为
0.123
,FLOOR
后得到0
。
- 若
因此,最终结果是 0 到 999 之间的随机整数,每次执行可能返回不同的值。
其他函数
我现在想对一个字符串信息进行摘要加密,我该怎么做?
用md5对密码进行加密:select md5('str')
md5是什么?
MD5(Message-Digest Algorithm 5)属于一种广泛使用的哈希函数,能够把任意长度的数据变换成固定长度(128 位)的哈希值。在数据库里,该函数常常被用于数据加密、数据完整性校验等场景。
添加一个新用户时,先对密码进行加密,然后插入insert into user (name, passwd) values ('zhangsan', md5('123456'));
其中md5(‘123456’)表示对密码’123456’进行加密,md5(‘123456’)作为参数,传入value,完成密码的插入
既然如此,那我插入的密码已经不是我最开始的密码了,我还能通过密码在数据库中检索到我刚刚插入的那条记录吗?
可以的兄弟,条件语句可以写成where passwd=md5(‘123456’),这样就能查到
ifnull(val1, val2) 这个表达式的值是多少?
这就是我们C语言中的if语句
if(val1==null) return val2;
else if(val1!=null) return val1;