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()),需注意兼容性。
相关推荐
木心操作3 小时前
nodejs动态创建sql server表
前端·javascript·sql
养生技术人3 小时前
Oracle OCP认证考试题目详解082系列第50题
运维·数据库·sql·oracle·database·开闭原则
来碗原味的小米粥吧8 小时前
sql题目基础50题
linux·数据库·sql
武昌库里写JAVA16 小时前
Java设计模式之工厂模式
java·vue.js·spring boot·后端·sql
奥尔特星云大使1 天前
MySQL 备份基础(一)
数据库·sql·mysql·备份·mysql备份
A阳俊yi2 天前
Spring——编程式事务
数据库·sql·spring
编程充电站pro2 天前
SQL 多表查询常用语法速查:INNER JOIN / LEFT JOIN / RIGHT JOIN
数据库·sql
杨云龙UP2 天前
SQL Server数据库事务日志问题的诊断与解法(从膨胀到瘦身)
运维·数据库·sql·sqlserver·serverless
青衿先生2 天前
返璞归真-SQL基本语法
数据库·sql
DashingGuy2 天前
hive、spark任务报错或者异常怎么排查以及定位哪段sql
hive·sql·spark