尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

#4 MySQL 函数实操|日期函数|字符串函数|数学函数|空值处理

#4 MySQL 函数实操|日期函数|字符串函数|数学函数|空值处理 MySQL 函数实操日期函数字符串函数数学函数空值处理文章目录MySQL 函数实操日期函数字符串函数数学函数空值处理一、Markmap 思维导图二、准备练习数据2.1 创建数据库和订单表2.2 插入测试数据三、日期函数3.1 获取当前日期和时间3.2 提取年月日3.3 增加或减少日期3.4 计算日期差3.5 日期格式化3.6 字符串转换为日期四、字符串函数4.1 concat 字符串拼接4.2 concat_ws 使用分隔符拼接4.3 length 与 char_length4.4 截取字符串4.5 查找字符串位置4.6 清除两侧空格4.7 替换字符串4.8 大小写转换五、数学函数5.1 round 四舍五入5.2 ceil 与 floor5.3 abs 绝对值5.4 mod 取余数5.5 rand 随机数5.6 greatest 与 least六、计算订单金额七、空值处理函数7.1 ifnull7.2 nullif7.3 coalesce八、条件函数8.1 if 条件判断8.2 case 多条件判断九、函数与分组统计十、函数与 where 条件十一、常见问题11.1 为什么 concat 返回 null11.2 length 为什么不是字符数量11.3 日期计算为什么得到 null11.4 函数名必须使用小写吗十二、综合实操十三、常用函数速查表十四、实操检查清单总结一、Markmap 思维导图二、准备练习数据2.1 创建数据库和订单表createdatabaseifnotexistsfunction_demodefaultcharactersetutf8mb4;usefunction_demo;createtableshop_order(idbigintprimarykeyauto_incrementcomment订单编号,customer_namevarchar(30)notnullcomment客户姓名,phonevarchar(20)comment联系电话,product_namevarchar(100)notnullcomment商品名称,quantityintnotnulldefault1comment购买数量,unit_pricedecimal(10,2)notnullcomment商品单价,discountdecimal(4,2)comment折扣率,paid_atdatetimecomment支付时间,created_atdatetimenotnulldefaultcurrent_timestampcomment创建时间)engineinnodbdefaultcharsetutf8mb4comment函数练习订单表;2.2 插入测试数据insertintoshop_order(customer_name,phone,product_name,quantity,unit_price,discount,paid_at,created_at)values( 张三 ,13800000001,机械键盘,2,299.00,0.90,2026-09-10 10:30:00,2026-09-10 09:20:00),(李四,null,无线鼠标,1,129.00,null,null,2026-09-11 14:10:00),(王五,13800000003,显示器支架,3,189.00,0.85,2026-09-12 16:45:00,2026-09-12 15:00:00),(赵六,,usb扩展坞,1,259.90,1.00,2026-09-13 11:00:00,2026-09-13 10:25:00);select*fromshop_order;执行效果idcustomer_nameproduct_namequantityunit_pricediscountpaid_at1张三两侧有空格机械键盘2299.000.902026-09-10 10:30:002李四无线鼠标1129.00nullnull3王五显示器支架3189.000.852026-09-12 16:45:004赵六usb扩展坞1259.901.002026-09-13 11:00:00测试数据包含日期、中文、英文、空字符串和null。后续示例默认使用这四条记录。discount使用小数表示折扣例如0.90表示九折。三、日期函数3.1 获取当前日期和时间selectnow()as当前日期时间,curdate()as当前日期,curtime()as当前时间;执行效果示例当前日期时间当前日期当前时间2026-09-15 10:30:202026-09-1510:30:20now()返回当前日期和时间。curdate()只返回当前日期。curtime()只返回当前时间。实际结果由数据库服务器的当前时间和时区决定。3.2 提取年月日selectcreated_at,year(created_at)as年,month(created_at)as月,day(created_at)as日,hour(created_at)as时fromshop_order;year、month和day分别提取年月日。hour、minute和second可以提取时分秒。这些函数适合统计某年、某月或某小时的数据。3.3 增加或减少日期selectcreated_at,date_add(created_at,interval7day)as七天后,date_sub(created_at,interval1month)as一个月前fromshop_order;date_add在指定日期上增加时间间隔。date_sub从指定日期中减去时间间隔。常用单位包括day、month、year、hour和minute。月份天数不同按月计算时应注意月底日期变化。3.4 计算日期差selectid,datediff(2026-09-15,date(created_at))as创建至今相差天数,timestampdiff(minute,created_at,paid_at)as支付耗时分钟fromshop_order;执行效果示例id创建至今相差天数支付耗时分钟157024null331054235datediff只比较日期部分结果单位为天。timestampdiff可以指定minute、hour、day等单位。任意参与计算的值为null时结果通常也是null。3.5 日期格式化selectcreated_at,date_format(created_at,%Y年%m月%d日 %H:%i:%s)as中文时间fromshop_order;执行效果示例created_at中文时间2026-09-10 09:20:002026年09月10日 09:20:00%Y表示四位年份%m表示月份%d表示日期。%H表示 24 小时制小时%i表示分钟%s表示秒。MySQL 中分钟使用%i不要误写为%m。3.6 字符串转换为日期selectstr_to_date(2026/09/15 18:30,%Y/%m/%d %H:%i)as转换结果;执行效果2026-09-15 18:30:00str_to_date按指定格式解析字符串。输入字符串必须与格式描述基本一致。无法解析的值可能返回null或产生警告取决于 SQL 模式。四、字符串函数4.1 concat 字符串拼接selectconcat(customer_name,购买了,quantity,件,product_name)as订单描述fromshop_order;concat按顺序拼接多个值。数字会被自动转换成字符串。任意参数为null时concat的结果会变成null。4.2 concat_ws 使用分隔符拼接selectconcat_ws( - ,id,customer_name,phone)as联系信息fromshop_order;第一个参数是分隔符。concat_ws会跳过值为null的参数。空字符串不会被跳过仍会保留对应分隔位置。4.3 length 与 char_lengthselectproduct_name,length(product_name)as字节数,char_length(product_name)as字符数fromshop_order;执行效果示例product_name字节数字符数机械键盘124usb扩展坞126length返回字节数量。char_length返回字符数量。在utf8mb4中一个中文字符通常占 3 个字节。判断用户输入长度时通常更关注字符数。4.4 截取字符串selectproduct_name,substring(product_name,1,2)as前两个字符,left(product_name,2)as左侧两个字符,right(product_name,2)as右侧两个字符fromshop_order;substring(字符串, 起始位置, 长度)用于截取指定部分。MySQL 字符串位置从1开始。left和right适合从两端快速截取。4.5 查找字符串位置selectproduct_name,locate(鼠标,product_name)as出现位置fromshop_order;找到内容时返回第一次出现的位置。没有找到时返回0。locate的参数顺序是先写查找内容再写原字符串。4.6 清除两侧空格selectconcat([,customer_name,])as清理前,concat([,trim(customer_name),])as清理后fromshop_orderwhereid1;执行效果清理前清理后[ 张三 ][张三]trim默认删除字符串两端的普通空格。ltrim只处理左侧rtrim只处理右侧。它不会默认删除字符串中间的空格。4.7 替换字符串selectproduct_name,replace(product_name,无线,蓝牙)as新名称fromshop_order;replace将所有匹配内容替换为新内容。查询中的替换只改变显示结果不会修改原数据。真正修改表中数据需要配合update。4.8 大小写转换selectproduct_name,lower(product_name)as小写结果,upper(product_name)as大写结果fromshop_order;lower将英文字母转换为小写。upper将英文字母转换为大写。中文等没有大小写形式的字符不会发生变化。五、数学函数5.1 round 四舍五入selectunit_price,round(unit_price,0)as取整结果,round(unit_price,1)as保留一位小数fromshop_order;round(数值, 小数位数)按指定精度四舍五入。第二个参数为0时返回整数精度结果。显示精度不等于存储精度原字段值不会改变。5.2 ceil 与 floorselectceil(12.01)as向上取整,floor(12.99)as向下取整;执行效果向上取整向下取整1312ceil返回不小于原数的最小整数。floor返回不大于原数的最大整数。两者不是普通的四舍五入。5.3 abs 绝对值selectabs(-25)as绝对值;abs去掉数值的正负方向返回绝对值。常用于计算差值大小或距离。5.4 mod 取余数selectmod(10,3)as余数,10%3as运算符结果;两种写法都可以得到余数1。取余常用于判断奇偶数、循环分组等场景。除数不能为0。5.5 rand 随机数selectrand()as随机小数;rand()返回大于等于0且小于1的随机数。每次执行的结果通常不同。order by rand()可随机排序但在大表中性能较差。随机抽样应结合数据规模选择更合适的方案。5.6 greatest 与 leastselectgreatest(70,88,92)as最大值,least(70,88,92)as最小值;greatest返回参数中的最大值。least返回参数中的最小值。参数中包含null时MySQL 返回结果通常为null。六、计算订单金额结合数学运算和空值处理计算实际金额selectid,product_name,quantity,unit_price,ifnull(discount,1.00)as实际折扣,round(quantity*unit_price*ifnull(discount,1.00),2)as实付金额fromshop_order;执行效果idproduct_namequantityunit_price实际折扣实付金额1机械键盘2299.000.90538.202无线鼠标1129.001.00129.003显示器支架3189.000.85481.954usb扩展坞1259.901.00259.90数量乘以单价得到折扣前金额。折扣为null时使用1.00表示不打折。round(..., 2)将最终金额保留两位小数。七、空值处理函数7.1 ifnullselectcustomer_name,ifnull(phone,未填写)as联系电话fromshop_order;ifnull(值, 备用值)在第一个参数为null时返回备用值。第一个参数不是null时返回原值。空字符串不是null不会被ifnull替换。7.2 nullif先把空字符串转换为null再设置显示内容selectcustomer_name,ifnull(nullif(phone,),未填写)as联系电话fromshop_order;nullif(a, b)在两个参数相等时返回null。两个参数不相等时返回第一个参数。组合nullif和ifnull可以统一处理空字符串与空值。7.3 coalesceselectcustomer_name,coalesce(nullif(phone,),暂无电话)as联系方式fromshop_order;coalesce返回参数列表中第一个不为null的值。它可以接收两个以上参数比ifnull更通用。所有参数都是null时结果为null。八、条件函数8.1 if 条件判断selectcustomer_name,paid_at,if(paid_atisnull,未支付,已支付)as支付状态fromshop_order;执行效果customer_namepaid_at支付状态张三2026-09-10 10:30:00已支付李四null未支付王五2026-09-12 16:45:00已支付赵六2026-09-13 11:00:00已支付if(条件, 条件成立的值, 条件不成立的值)类似程序中的三元表达式。它适合简单的二选一判断。判断分支较多时使用case更清晰。8.2 case 多条件判断selectproduct_name,unit_price,casewhenunit_price250then高价商品whenunit_price150then中价商品else低价商品endas价格等级fromshop_order;执行效果product_nameunit_price价格等级机械键盘299.00高价商品无线鼠标129.00低价商品显示器支架189.00中价商品usb扩展坞259.90高价商品case按书写顺序判断多个when条件。命中第一个成立条件后不再继续判断。没有条件成立时返回else后的值。忘记书写else时不匹配的记录会返回null。九、函数与分组统计按创建日期统计订单数量和金额selectdate(created_at)as下单日期,count(*)as订单数量,round(sum(quantity*unit_price*ifnull(discount,1.00)),2)as订单金额fromshop_ordergroupbydate(created_at)orderby下单日期;date从日期时间中取出日期部分。ifnull避免折扣为空导致整条金额表达式为null。sum汇总同一天的订单金额。round将汇总金额保留两位小数。group by中使用的日期表达式应与查询含义保持一致。十、函数与 where 条件查询 2026 年 9 月创建的订单容易理解但可能影响索引使用的写法select*fromshop_orderwhereyear(created_at)2026andmonth(created_at)9;更适合索引范围查询的写法select*fromshop_orderwherecreated_at2026-09-01 00:00:00andcreated_at2026-10-01 00:00:00;对索引列直接调用函数可能使普通索引无法被有效使用。时间范围条件通常更容易利用created_at上的索引。结束时间使用下个月第一天的“小于”条件可以覆盖整个月。实际是否使用索引应通过explain检查。十一、常见问题11.1 为什么 concat 返回 nullconcat的任意参数为null时整体结果会变成null。可以先使用ifnull或coalesce提供备用值。也可以使用会跳过null参数的concat_ws。正确示例selectconcat(customer_name,,ifnull(phone,未填写))as联系信息fromshop_order;11.2 length 为什么不是字符数量length统计字节数。char_length统计字符数。中文、表情等字符可能占用多个字节。限制用户可见文字长度时通常使用char_length理解结果。11.3 日期计算为什么得到 null参与计算的日期字段可能本身为null。字符串日期格式可能无法被 MySQL 正确识别。可以先查询原始字段再使用ifnull或条件函数处理。不应随意用虚假日期替代未知日期。11.4 函数名必须使用小写吗MySQL 函数名通常不区分大小写。本文统一使用小写是为了保持代码风格一致。团队项目应选择统一规范并持续遵守。十二、综合实操需求生成订单摘要包括清理后的客户名、联系方式、中文日期、支付状态和实付金额。selectidas订单编号,trim(customer_name)as客户姓名,ifnull(nullif(phone,),未填写)as联系方式,product_nameas商品名称,concat(quantity,件)as购买数量,date_format(created_at,%Y年%m月%d日)as下单日期,if(paid_atisnull,未支付,已支付)as支付状态,round(quantity*unit_price*ifnull(discount,1.00),2)as实付金额fromshop_orderorderbycreated_at;trim清除客户名两侧多余空格。nullif将空字符串电话转换为null。ifnull为缺少的电话提供友好提示。date_format将日期转换为便于阅读的格式。if根据支付时间生成支付状态。多个函数可以组合使用但应注意表达式的可读性。效果图位置插入“综合订单摘要查询结果”截图。十三、常用函数速查表分类函数主要作用日期now()获取当前日期时间日期date_add()增加日期或时间间隔日期datediff()计算相差天数日期date_format()格式化日期字符串concat()拼接字符串字符串char_length()统计字符数量字符串substring()截取字符串字符串trim()清除两侧空格字符串replace()替换字符串内容数学round()四舍五入数学ceil()向上取整数学floor()向下取整数学abs()求绝对值空值ifnull()空值替换空值coalesce()返回第一个非空值条件if()二选一判断条件case多条件判断十四、实操检查清单创建函数练习数据库和订单表。使用当前时间、日期提取、日期加减和日期差函数。对比length与char_length的结果。练习字符串拼接、截取、查找、清理和替换。练习四舍五入、取整、绝对值和取余。使用ifnull、nullif和coalesce处理空值。使用if和case生成业务状态。完成订单摘要综合查询。总结日期函数负责获取、计算、提取和格式化时间。字符串函数可以完成拼接、统计、截取、清理和替换。数学函数适合数值取整、计算和范围控制。ifnull与coalesce用于提供空值备用内容。if适合简单判断case适合多分支业务规则。在索引字段上调用函数可能影响查询性能应结合explain验证。
返回列表