SQL-字符串函数、数值函数、日期函数

在 SQL 中,函数是处理数据的重要工具,可分为字符串函数数值函数日期函数三大类。它们用于对字符串、数字和日期类型的数据进行转换、计算或提取信息,极大提升了数据处理的灵活性。以下是详细讲解:

一、字符串函数

字符串函数用于处理字符型数据(如VARCHARCHAR类型),实现拼接、截取、转换等操作。

1. 字符串拼接:CONCAT(str1, str2, ...)
  • 功能:将多个字符串拼接为一个字符串。

  • 语法CONCAT(字符串1, 字符串2, ...)

  • 示例

    sql

    复制代码
    SELECT CONCAT('Hello', ' ', 'SQL'); -- 结果:'Hello SQL'
    SELECT CONCAT(name, '_', workno) AS user_code FROM emp; -- 拼接姓名和工号作为用户编码
  • 注意事项

    • 若任一参数为NULL,结果为NULL(如CONCAT('a', NULL)返回NULL)。
    • 部分数据库支持CONCAT_WS(分隔符, str1, str2),用指定分隔符拼接(如CONCAT_WS(',', 'a', 'b')返回'a,b')。
2. 大小写转换:LOWER(str) / UPPER(str)
  • 功能

    • LOWER(str):将字符串转为全小写。
    • UPPER(str):将字符串转为全大写。
  • 语法LOWER(字符串)UPPER(字符串)

  • 示例

    sql

    复制代码
    SELECT LOWER('MySqL'); -- 结果:'mysql'
    SELECT UPPER(name) AS upper_name FROM emp; -- 将姓名转为大写
  • 注意事项 :仅对字母有效,非字母字符(如数字、符号)不处理(如LOWER('123A!')返回'123a!')。

3. 填充函数:LPAD(str, length, padstr) / RPAD(str, length, padstr)
  • 功能

    • LPAD(str, length, padstr):从字符串左侧用padstr填充,直到总长度为length
    • RPAD(str, length, padstr):从字符串右侧用padstr填充,直到总长度为length
  • 语法LPAD(原字符串, 目标长度, 填充字符)

  • 示例

    sql

    复制代码
    SELECT LPAD('123', 5, '0'); -- 结果:'00123'(左侧补0至长度5)
    SELECT RPAD(workno, 6, '*') FROM emp; -- 工号右侧补*至长度6
  • 注意事项

    • 若原字符串长度大于length,会截断超出部分(如LPAD('123456', 3, '0')返回'123')。
    • 填充字符padstr可为空,但无实际意义。
4. 去除空格:TRIM(str)
  • 功能:去除字符串头部和尾部的空格(默认);也可指定去除特定字符。

  • 语法

    • 去除空格:TRIM(字符串)
    • 去除指定字符:TRIM(字符 FROM 字符串)(如TRIM('*' FROM '**abc**')
  • 示例

    sql

    复制代码
    SELECT TRIM('  SQL  '); -- 结果:'SQL'(去除首尾空格)
    SELECT TRIM('x' FROM 'xxHelloxx'); -- 结果:'Hello'(去除首尾的x)
  • 注意事项 :仅去除头部和尾部的字符,中间的不处理(如TRIM(' a b c ') 返回'a b c')。

5. 截取子串:SUBSTRING(str, start, length)
  • 功能 :从字符串的start位置开始,截取length长度的子串(start从 1 开始计数)。

  • 语法SUBSTRING(原字符串, 起始位置, 截取长度)

  • 示例

    sql

    复制代码
    SELECT SUBSTRING('Database', 3, 4); -- 结果:'taba'(从第3位开始,取4个字符)
    SELECT SUBSTRING(idcard, 1, 6) AS area_code FROM emp; -- 截取身份证前6位(地区码)
  • 注意事项

    • 起始位置start为负数时,从字符串尾部开始计算(如SUBSTRING('abcde', -3, 2)返回'cd')。
    • length省略,默认截取到字符串末尾(如SUBSTRING('abcde', 3)返回'cde')。
6. 字符串长度:LENGTH(str)
  • 功能:返回字符串的字节长度(注意:中文在 UTF-8 编码下占 3 字节)。

  • 示例

    sql

    复制代码
    SELECT LENGTH('SQL'); -- 结果:3(3个字母,每个1字节)
    SELECT LENGTH('数据库'); -- 结果:9(3个中文,UTF-8下每个3字节)

二、数值函数

数值函数用于对数值型数据(如INTFLOATDECIMAL)进行计算,实现取整、求和、随机数生成等操作。

1. 取整函数:CEIL(x) / FLOOR(x)
  • 功能

    • CEIL(x):向上取整(返回大于等于x的最小整数)。
    • FLOOR(x):向下取整(返回小于等于x的最大整数)。
  • 示例

    sql

    复制代码
    SELECT CEIL(2.1); -- 结果:3;CEIL(-2.1) → -2
    SELECT FLOOR(2.9); -- 结果:2;FLOOR(-2.9) → -3
2. 四舍五入:ROUND(x, d)
  • 功能 :将数值x四舍五入保留d位小数(d默认为 0,即取整数)。

  • 示例

    sql

    复制代码
    SELECT ROUND(3.14159, 2); -- 结果:3.14(保留2位小数)
    SELECT ROUND(123.45, -1); -- 结果:120(d为负数时,对整数部分四舍五入)
3. 取余数:MOD(x, y)
  • 功能 :返回x除以y的余数(等价于x % y)。

  • 示例

    sql

    复制代码
    SELECT MOD(10, 3); -- 结果:1(10 ÷ 3 余1)
    SELECT MOD(-10, 3); -- 结果:-1(余数符号与被除数一致)
  • 注意事项 :若y为 0,返回NULL(除数不能为 0)。

4. 随机数:RAND()
  • 功能:生成 0~1 之间的随机浮点数(包含 0,不包含 1)。

  • 示例

    sql

    复制代码
    SELECT RAND(); -- 示例结果:0.7834521(每次调用结果不同)
    SELECT RAND(10); -- 传入种子(如10),生成固定序列的随机数(相同种子结果相同)
  • 应用场景 :生成随机验证码(结合字符串函数):

    sql

    复制代码
    -- 生成6位随机数字验证码
    SELECT LPAD(FLOOR(RAND() * 1000000), 6, '0'); -- 结果:'058392'(不足6位补0)
5. 绝对值:ABS(x)
  • 功能 :返回x的绝对值。

  • 示例

    sql

    复制代码
    SELECT ABS(-123); -- 结果:123;ABS(0) → 0
6. 截断:TRUNCATE(x, d)
  • 功能 :将数值x截断(不是四舍五入)到d位小数。

  • 示例

    sql

    复制代码
    SELECT TRUNCATE(3.14159, 2); -- 结果:3.14(直接截断,不四舍五入)
    SELECT TRUNCATE(123.456, 0); -- 结果:123

三、日期函数

日期函数用于处理日期时间类型数据(如DATEDATETIME),实现日期获取、计算、格式化等操作。

1. 获取当前日期时间:CURDATE() / CURTIME() / NOW()
  • 功能

    • CURDATE():返回当前日期(格式:YYYY-MM-DD)。
    • CURTIME():返回当前时间(格式:HH:MM:SS)。
    • NOW():返回当前日期时间(格式:YYYY-MM-DD HH:MM:SS)。
  • 示例

    sql

    复制代码
    SELECT CURDATE(); -- 结果:'2025-09-14'
    SELECT CURTIME(); -- 结果:'10:30:45'
    SELECT NOW(); -- 结果:'2025-09-14 10:30:45'
2. 提取日期部分:YEAR(date) / MONTH(date) / DAY(date)
  • 功能:从日期中提取年、月、日。

  • 示例

    sql

    复制代码
    SELECT YEAR('2025-09-14'); -- 结果:2025
    SELECT MONTH(NOW()); -- 结果:9(当前月份)
    SELECT DAY(entrydate) AS join_day FROM emp; -- 提取员工入职的日
3. 日期加减:DATE_ADD(date, INTERVAL expr unit) / DATE_SUB(date, INTERVAL expr unit)
  • 功能

    • DATE_ADD:对日期增加指定时间间隔(年、月、日等)。
    • DATE_SUB:对日期减少指定时间间隔。
  • 常用单位YEAR(年)、MONTH(月)、DAY(日)、HOUR(时)、MINUTE(分)等。

  • 示例

    sql

    复制代码
    -- 计算30天后的日期
    SELECT DATE_ADD(CURDATE(), INTERVAL 30 DAY); -- 结果:'2025-10-14'
    
    -- 计算3个月前的日期
    SELECT DATE_SUB(NOW(), INTERVAL 3 MONTH); -- 结果:'2025-06-14 10:30:45'
4. 日期差:DATEDIFF(end_date, start_date)
  • 功能 :计算两个日期之间的天数差(结果 = end_date - start_date)。

  • 示例

    sql

    复制代码
    -- 计算入职天数(当前日期 - 入职日期)
    SELECT name, DATEDIFF(CURDATE(), entrydate) AS work_days FROM emp;
    
    -- 计算两个固定日期的差
    SELECT DATEDIFF('2025-12-31', '2025-01-01'); -- 结果:364
  • 注意事项

    • 仅计算日期部分,忽略时间(如DATEDIFF('2025-01-02 23:59', '2025-01-01 00:00')返回1)。
    • end_date < start_date,结果为负数。
5. 日期格式化:DATE_FORMAT(date, format)
  • 功能 :将日期按指定格式转换为字符串(format为格式符,如%Y表示 4 位年,%m表示 2 位月)。

  • 常用格式符

    • %Y:4 位年(如 2025);%y:2 位年(如 25)
    • %m:2 位月(01-12);%d:2 位日(01-31)
    • %H:24 小时制时(00-23);%h:12 小时制时(01-12)
  • 示例

    sql

    复制代码
    SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s'); -- 结果:'2025年09月14日 10:35:20'
    SELECT DATE_FORMAT(entrydate, '%Y-%m') AS join_month FROM emp; -- 入职年月(如2020-03)

总结与注意事项

  1. 参数类型匹配 :函数参数需与数据类型一致(如日期函数需传入日期型,否则可能返回NULL)。
  2. NULL 处理 :若输入为NULL,多数函数返回NULL(如CONCAT(NULL, 'a')NULL)。
  3. 性能影响 :在WHERE子句中对字段使用函数(如WHERE YEAR(entrydate) = 2020)可能导致索引失效,建议优化为WHERE entrydate BETWEEN '2020-01-01' AND '2020-12-31'
  4. 数据库差异 :部分函数在不同数据库中语法不同(如 SQL Server 用GETDATE()获取当前时间,而非NOW()),需注意兼容性。
相关推荐
sensenlin911 小时前
Mybatis中SQL全大写或全小写影响执行性能吗
数据库·sql·mybatis
xqlily6 小时前
SQL 数据库简介
数据库·sql
森林-6 小时前
MyBatis 从入门到精通(第三篇)—— 动态 SQL、关联查询与查询缓存
sql·缓存·mybatis
小虾米vivian6 小时前
达梦:将sql通过shell脚本的方式放在后台执行
服务器·数据库·sql
武昌库里写JAVA7 小时前
Mac下Python3安装
java·vue.js·spring boot·sql·学习
java干货9 小时前
MyBatis 的“魔法”:Mapper 接口是如何找到并执行 SQL 的?
数据库·sql·mybatis
寻星探路9 小时前
数据库造神计划第八天---增删改查(CRUD)(4)
数据库·sql·mysql
Moshow郑锴10 小时前
SpringBootCodeGenerator使用JSqlParser解析DDL CREATE SQL 语句
spring boot·后端·sql
emma羊羊1 天前
【SQL注入】延时盲注
数据库·sql·网络安全