MySQL 函数大全:从入门到面试通关

📅 2026/7/16 5:42:38
MySQL 函数大全:从入门到面试通关
文章目录快速导航到各章节章节内容 1. 日期函数获取日期时间、加减操作、日期差、实战案例 2. 字符串函数字符集、拼接、长度、替换、截取、大小写➗ 3. 数学函数绝对值、取整、随机数、进制转换️ 4. 其它函数用户信息、加密、空值处理 5. 实战 OJ统计逗号出现次数 6. 小总结函数分类总结表❓ 7. 经典面试题5道高频面试题及解答 1. 日期函数日期和时间函数是 MySQL 中非常常用的工具主要用于处理日期和时间类型的数据。 1.1 获取当前日期和时间-- 获取当前日期年月日selectcurrent_date();----------------|current_date()|----------------|2017-11-19|------------------ 获取当前时间时分秒selectcurrent_time();----------------|current_time()|----------------|13:51:21|------------------ 获取当前时间戳年月日 时分秒selectcurrent_timestamp();---------------------|current_timestamp()|---------------------|2017-11-1913:51:48|---------------------小贴士current_date()返回日期部分current_time()返回时间部分current_timestamp()返回完整的日期和时间。➕ 1.2 日期加减操作-- 在日期的基础上加天数selectdate_add(2017-10-28,interval10day);-----------------------------------------|date_add(2017-10-28,interval10day)|-----------------------------------------|2017-11-07|------------------------------------------- 在日期的基础上减天数selectdate_sub(2017-10-1,interval2day);---------------------------------------|date_sub(2017-10-1,interval2day)|---------------------------------------|2017-09-29|--------------------------------------- 1.3 计算日期差-- 计算两个日期之间相差多少天selectdatediff(2017-10-10,2016-9-1);------------------------------------|datediff(2017-10-10,2016-9-1)|------------------------------------|404|------------------------------------⚠️注意datediff()是时间1 - 时间2返回的是相差的天数。 1.4 实战案例案例1记录生日-- 创建一张表记录生日createtabletmp(idintprimarykeyauto_increment,birthdaydate);-- 添加当前日期insertintotmp(birthday)values(current_date());mysqlselect*fromtmp;----------------|id|birthday|----------------|1|2017-11-19|----------------案例2留言表-- 创建一个留言表mysqlcreatetablemsg(idintprimarykeyauto_increment,contentvarchar(30)notnull,sendtimedatetime);-- 插入数据mysqlinsertintomsg(content,sendtime)values(hello1,now());mysqlinsertintomsg(content,sendtime)values(hello2,now());mysqlselect*frommsg;----------------------------------|id|content|sendtime|----------------------------------|1|hello1|2017-11-1914:12:20||2|hello2|2017-11-1914:13:21|------------------------------------ 显示所有留言信息发布日期只显示日期不用显示时间selectcontent,date(sendtime)frommsg;-- 请查询在2分钟内发布的帖子select*frommsgwheredate_add(sendtime,interval2minute)now();理解------------------------------|-----------|-------------|------------------初始时间now()初始时间2min理解date_add(sendtime, interval 2 minute) now()表示如果sendtime加上2分钟后的时间大于当前时间说明该帖子是在2分钟内发布的。 2. 字符串函数字符串函数用于对字符串类型的数据进行处理和转换。 2.1 获取字符集-- 获取 emp 表的 ename 列的字符集selectcharset(ename)fromEMP; 2.2 字符串拼接-- 要求显示 exam_result 表中的信息显示格式XXX的语文是 XXX分数学 XXX分英语 XXX分selectconcat(name,的语文是,chinese,分数学是,math,分)as分数fromstudent; 2.3 获取字符串长度-- 求学生表中学生姓名占用的字节数selectlength(name),namefromstudent;理解length函数返回字符串长度以字节为单位。如果是多字节字符则计算多个字节数如果是单字节字符则算作一个字节。比如字母、数字算作一个字节中文表示多个字节数与字符集编码有关。在utf8中汉字占3个字节普通数字和字母占一个字节如abc123你好-- 12字节。 2.4 字符串替换-- 将 EMP 表中所有名字中有 S 的替换成 上海selectreplace(ename,S,上海),enamefromEMP;✂️ 2.5 字符串截取-- 截取 EMP 表中 ename 字段的第二个到第三个字符selectsubstring(ename,2,2),enamefromEMP;substring(str, pos, len)从pos位置开始截取len个字符。 2.6 大小写转换-- 以首字母小写的方式显示所有员工的姓名selectconcat(lcase(substring(ename,1,1)),substring(ename,2))fromEMP;思路先用substring取出第一个字符并转为小写再拼接上从第二个字符开始的剩余部分。➗ 3. 数学函数数学函数用于执行各种数学运算。 3.1 常用数学函数-- 绝对值selectabs(-100.2);-- 向上取整selectceiling(23.04);-- 向下取整selectfloor(23.7);-- 保留2位小数位数小数四舍五入selectformat(12.3456,2);-- 产生随机数selectrand(); 3.2 进制转换-- conv(num, from_base, to_base) 把一个数字从 from_base 进制转换成 to_base 进制-- 把10进制的10转化为2进制selectconv(10,10,2); 3.3 随机数应用-- 产生1-100之间的随机数selectrand()*100;-- 取整方式-- 1. 向0取整3.1 -- 3-3.1 -- -3-- 2. 向上取整4.1 -- 5-4.1 -- -4-- 3. 向下取整4.1 -- 4-4.1 -- -5-- 4. 四舍五入-- 设置固定小数位数selectformat(3.1415926,2);-- 3.14-- 产生1-100之间的随机整数selectformat(rand()*100,0);️ 4. 其它函数 4.1 用户与数据库信息-- 查询当前用户selectuser();-- 显示当前正在使用的数据库selectdatabase(); 4.2 加密函数-- 对一个字符串进行 md5 摘要摘要后得到一个32位字符串selectmd5(admin);----------------------------------|md5(admin)|----------------------------------|21232f297a57a5a743894a0e4a801fc3|------------------------------------ MySQL 数据库使用该函数对用户加密selectpassword(root);-------------------------------------------|password(root)|-------------------------------------------|*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B|-------------------------------------------安全提示在实际开发中密码通常使用md5()进行摘要存储而不是明文存储。❓ 4.3 空值处理-- 如果 val1 为 null返回 val2否则返回 val1 的值selectifnull(abc,123);----------------------|ifnull(abc,123)|----------------------|abc|----------------------1rowinset(0.01sec)selectifnull(null,123);---------------------|ifnull(null,123)|---------------------|123|---------------------1rowinset(0.00sec)应用场景ifnull常用于数据清洗当某个字段可能为NULL时可以设置一个默认值。 5. 实战 OJ 题目统计字符串中逗号出现的次数牛客题目查找字符串10,A,B中逗号,出现的次数cntselectlength(10,A,B)-length(replace(10,A,B,,,))ascomma_count;解题思路length(10,A,B)计算原字符串的总长度replace(10,A,B, ,, )将逗号替换为空字符串length(replace(...))计算去掉逗号后的字符串长度两者相减得到的就是逗号出现的次数 6. 小总结MySQL 函数主要分为四大类函数类别核心函数应用场景日期函数current_date()、date_add()、datediff()时间记录、统计、过期判断字符串函数concat()、substring()、replace()数据格式化、清洗、拼接➗数学函数abs()、ceiling()、floor()、rand()数值计算、随机数生成️其它函数md5()、ifnull()、user()加密、空值处理、系统信息面试重点日期函数中的datediff和date_add、字符串函数中的concat和substring、数学函数中的rand和format是面试中的高频考点。拓展练习牛客查找字符串’10,A,B’ 中逗号’,出现的次数cnt❓ 7. 经典面试题面试题1如何统计一个字符串中某个字符出现的次数解答使用length()和replace()函数组合。-- 统计字符串 hello world 中字母 l 出现的次数selectlength(hello world)-length(replace(hello world,l,))ascount;面试题2如何查询最近7天内发布的数据解答使用date_add()或datediff()函数。-- 方法1使用 date_addselect*fromorderswheredate_add(order_date,interval7day)now();-- 方法2使用 datediffselect*fromorderswheredatediff(now(),order_date)7;面试题3ifnull()和coalesce()有什么区别解答ifnull(val1, val2)如果val1为NULL返回val2否则返回val1。只能处理两个参数。coalesce(val1, val2, val3, ...)返回参数列表中第一个非NULL的值。可以处理多个参数。-- ifnull 示例selectifnull(null,默认值);-- 默认值-- coalesce 示例selectcoalesce(null,null,第三个值,第四个值);-- 第三个值面试题4如何生成一个随机密码或验证码解答结合rand()、floor()和字符串函数。-- 生成一个6位数字验证码selectfloor(rand()*900000100000)ascaptcha;-- 生成一个8位随机字符串包含数字和字母selectconcat(substring(ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,floor(rand()*36)1,1),substring(ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,floor(rand()*36)1,1),substring(ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,floor(rand()*36)1,1),substring(ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,floor(rand()*36)1,1),substring(ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,floor(rand()*36)1,1),substring(ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,floor(rand()*36)1,1),substring(ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,floor(rand()*36)1,1),substring(ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,floor(rand()*36)1,1))asrandom_password;面试题5如何对密码进行安全存储解答不要明文存储密码应该使用哈希函数进行加密。-- 注册时存储密码的哈希值insertintousers(username,password_hash)values(admin,md5(123456));-- 登录时验证密码select*fromuserswhereusernameadminandpassword_hashmd5(123456);⚠️注意在实际生产环境中建议使用更安全的SHA2()或bcrypt算法并且要加盐salt处理。最后的话MySQL 函数是面试中的基础但重要的知识点掌握好这些函数不仅能帮你提高通过面试的概率更能让你在实际开发中事半功倍。建议多动手练习把每个函数都敲一遍理解其原理和用法。