SQL单行函数详解:字符、数字、日期、转换与通用函数全解析

**摘要:**本文全面解析SQL单行函数的使用方法,涵盖字符函数(大小写处理、字符处理)、数字函数(数学运算、聚合计算)、日期函数(时间处理、格式转换)、转换函数(数据类型转换)和通用函数(条件判断、空值处理)。通过丰富的实例演示各类函数的语法和应用场景,帮助读者掌握SQL函数的核心概念和实际应用技巧。

函数是SQL的一个非常强有力的特性,函数能够用于下面的目的:

  • 执行数据计算
  • 修改单个数据项
  • 操纵输出进行行分组
  • 格式化显示的日期和数字
  • 转换列数据类型

SQL函数有输入参数,并且总有一个返回值

单行函数:

  • 操纵数据项
  • 接受多个参数并返回一个值
  • 作用于每一个返回行
  • 每行返回一个结果
  • 可以修改数据类型
  • 可以嵌套
  • 接受多个参数,参数可以是一个列或者一个表达式

function name (arg1,arg2,...)

字符函数:

大小写处理函数

|----------------------|------------|---------------------------------------------------|
| 函数 | 描述 | 实例 |
| LOWER(s) | LCASE(S) | 将字符串S转换为小写 | 将字符串OLDLU转换为小写: SELECT LOWER("OLDLU"); --> oldlu |
| UPPER(s) |UCASE(s) | 将字符串s转换为大写 | 将字符串oldlu转换为大写: SELECT UPPER("oldlu"); --> OLDLU |

字符处理函数

|----------------------------|--------------------------------|-----------------------------------------------------------------------|
| 函数 | 描述 | 实例 |
| LENGTH(s) | 返回字符串s的长度 | 返回字符串oldlu的字符数: SELECT LENGTH("RUNOOB"); --> 6 |
| CONCAT(s1,s2...sn) | 字符串s1,s2等多个字符串合并为一个字符串 | 合并多个字符串: SELECT CONCAT("sxt","teacher","oldlu"); --> sxtteacheroldlu |
| LPAD(s1,len,s2) | 在字符串s1的开始处填充字符串s2,使字符串长度达到len | 将字符串x填充到abc字符串的开始处: SELECT LPAD('oldlu',8,'x'); --> xxxoldlu |
| LTRIM(s) | 去掉字符串s开始处的空格 | 去掉字符串oldlu开始处的空格: SELECT LTRIM(" oldlu"); --> oldlu |
| REPLACE(s,s1,s2) | 将字符串s2替代字符串s中的字符串s1 | 将字符串oldlu中的字符o替换为字符O: SELECT REPLACE('oldlu','o','O'); --> Oldlu |
| REVERSE(s) | 将字符串s的顺序反过来 | 将字符串abc的顺序反过来: SELECT REVERSE('abc'); --> cba |
| RPAD(s1,len,s2) | 在字符串s1的结尾处添加字符串s2,使字符串的长度达到len | 将字符串xx填充到oldlu字符串的结尾处: SELECT RPAD('oldlu',8,'x'); --> oldluxxx |
| RTRIM(s) | 去掉字符串s结尾处的空格 | 去掉字符串oldlu的末尾空格: SELECT RTRIM("oldlu "); --> oldlu |
| SUBSTR(s, start,length) | 从字符串s的start位置截取长度为length的子字符串 | 从字符串OLDLU中的第2个位置截取3个字 符: SELECT SUBSTR("OLDLU", 2,3); --> LDL |
| SUBSTRING(s, start,length) | 从字符串s的start位置截取长度为length的子字符串 | 从字符串 OLDLU中的第2个位置截取3个字符: SELECT SUBSTRING("OLDLU", 2,3) --> LDL |
| TRIM(s) | 去掉字符串s开始和结尾处的空格 | 去掉字符串 lodlu 的首尾空格: SELECT TRIM(" lodlu "); --> oldlu |

数字函数

|-----------------------------------|-----------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|
| 函数名 | 描述 | 实例 |
| ABS(x) | 返回x的绝对值 | 返回-1的绝对值: SELECT ABS(-1) --> 1 |
| ACOS(x) | 求x的反余弦值(参数是弧度) | SELECT ACOS(0.25); |
| ASIN(x) | 求反正弦值(参数是弧度) | SELECT ASIN(0.25); |
| ATAN(x) | 求反正切值(参数是弧度) | SELECT ATAN(2.5); |
| ATAN2(n, m) | 求反正切值(参数是弧度) | SELECT ATAN2(-0.8, 2); |
| AVG(expression) | 返回一个表达式的平均值,expression是一个字段 | 返回 Products表中Price字段的平均值: SELECT AVG(Price) AS AveragePrice FROM Products; |
| CEIL(x) | 返回大于或等于x的最小整数 | SELECT CEIL(1.5) --> 2 |
| CEILING(X) | 返回大于或等于x的最小整数 | SELECT CEILING(1.5); --> 2 |
| COS(x) | 求余弦值(参数是弧度) | SELECT COS(2); |
| COT(x) | 求余切值(参数是弧度) | SELECT COT(6); |
| COUNT(expression) | 返回查询的记录总数,expression参数是一个字段或者*号 | 返回Products表中products字段总共有多少条记录: SELECT COUNT(ProductID) AS NumberOfProducts FROM Products; |
| DEGREES(x) | 将弧度转换为角度 | SELECT DEGREES(3.1415926535898) --> 180 |
| n DIV m | 整除,n为被除数,m为除数 | 计算10除于5: SELECT 10 DIV 5; --> 2 |
| EXP(x) | 返回e的x次方 | 计算e的三次方: SELECTEXP(3); --> 20.085536923188 |
| FLOOR(x) | 返回小于或等于x的最大整数 | 小于或等于1.5的整数: SELECT FLOOR(1.5)' --> 1 |
| GREATEST(expr1,expr2, expr3, ...) | 返回列表中的最大值 | 返回以下数字列表中的最大值: SELECT GREATEST(3,12,34,8,25); --> 34 返回以下字符串列表中的最大值: SELECT GREATEST("Google", "Runoob","Apple"); --> Runoob |
| LEAST(expr1,expr2, expr3, ...) | 返回列表中的最小值 | 返回以下数字列表中的最小值: SELECT LEAST(3,12,34,8,25); --> 3 返回以下字符串列表中的最小值: SELECT LEAST("Google", "Runoob","Apple"); --> Apple |
| LN | 返回数字的自然对数,以e为底。 | 返回2的自然对数: SELECT LN(2); --> 0.6931471805599453 |
| LOG(x)或 LOG(base, x) | 返回自然对数(以e为底的对数),如果带有base参数,则base为指定带底数。 | SELECT LOG(20.085536923188); --> 3 SELECT LOG(2, 4); --> 2 |
| LOG10(x) | 返回以10为底的对数 | SELECT LOG10(100); --> 2 |
| LOG2(x) | 返回以2为底的对数 | 返回以2为底6的对数: SELECT LOG2(6); --> 2.584962500721156 |
| MAX(expression) | 返回字段expression中的最大值 | 返回数据表Products中字段Price的最大值: SELECT MAX(Price) AS LargestPrice FROM Products; |
| MIN(expression) | 返回字段expression中的最小值 | 返回数据表Products中字段Price的最小值: SELECT MIN(Price) AS MinPrice FROM Products; |
| MOD(x.y) | 返回x除以y以后的余数 | 5除于2的余数: SELECTMOD(5,2); --> 1 |
| PI() | 返回圆周率(3.141593) | SELECT PI(); --> 3.141593 |
| РОW(x,y) | 返回x的y次方 | 2的3次方: SELECT POW(2,3); --> 8 |
| POWER(x.y) | 返回x的y次方 | 2的3次方: SELECT POWER(2,3); --> 8 |
| RADIANS(x) | 将角度转换为弧度 | 180度转换为弧度: SELECT RADIANS(180) --> 3.1415926535898 |
| RAND() | 返回0到1的随机数 | SELECT RAND() --0.93099315644334 |
| ROUND(X) | 返回离x最近的整数 | SELECT ROUND(1.23456) --> 1 |
| SIGN(x) | 返回x的符号,x是负数、0、正数分别返回-1、0和1 | SELECT SIGN(-10) --> (-1) |
| SIN(x) | 求正弦值(参数是弧度) | SELECT SIN(RADIANS(30)) --> 0.5 |
| SQRT(x) | 返回x的平方根 | 25的平方根: SELECT SQRT(25) -->5 |
| SUM(expression) | 返回指定字段的总和 | 计算OrderDetails表中字段Quantity的总和: SELECT SUM(Quantity) AS TotalltemsOrdered FROM OrderDetails; |
| TAN(x) | 求正切值(参数是弧度) | SELECT TAN(1.75); --> -5.52037992250933 |
| TRUNCATE(x,y) | 返回数值x保留到小数点 后y位的值(与ROUND 最大的区别是不会进行四 舍五入) | SELECT TRUNCATE(1.23456,3) --> 1.234 |

ROUND(column|expression, n)函数

ROUND函数四舍五入列、表达式或者n位小数的值。如果第二个参数是0或者缺少,值

被四舍五入为整数。如果第二个参数是2值被四舍五入为两位小数。如果第二个参数是-2,

值被四舍五入到小数点左边两位。

sql 复制代码
SELECT ROUND(45.923,2), ROUND(45.923,0),ROUND(45.923,-1);

TRUNCATE(column|expression,n)函数

TRUNCATE函数的作用类似于ROUND函数。如果第二个参数是0或者缺少,值被截断为

整数。如果第二个参数是2,值被截断为两位小数。如果第二个参数是-2,值被截断到小数

点左边两位。与ROUND最大的区别是不会进行四舍五入。

sql 复制代码
SELECT TRUNCATE(45.923,2);

使用MOD(m,n)函数

MOD函数找出m除以n的余数。

示例:

所有job_id是SA_REP的雇员的名字,薪水以及薪水被5000除后的余数。

sql 复制代码
SELECT last_name, salary, MOD(salary, 5000) FROM employees
WHERE job_id = 'SA_REP';

日期函数

在MySQL中允许直接使用字符串表示日期,但是要求字符串的日期格式必须为:

YYYY-MM-DD HH:MI:SS或者YYYY/MM/DD HH:MI:SS

|-----------------------|---------------------------|-------------------------------------------------------|
| 函数名 | 描述 | 实例 |
| CURDATE() | 返回当前日期 | SELECT CURDATE(); -> 2018-09-19 |
| CURTIME() | 返回当前时间 | SELECT CURTIME(); -> 19:59:02 |
| CURRENT_DATE() | 返回当前日期 | SELECT CURRENT_DATE(); -> 2018-09-19 |
| CURRENT_TIME() | 返回当前时间 | SELECT CURRENT_TIME(); -> 19:59:02 |
| DATE() | 从日期或日期时间表达式中提取日期值 | SELECT DATE("2017-06-15"); -> 2017-06-15 |
| DATEDIFF(d1,d2) | 计算日期d1->d2之间相隔的天数 | SELECT DATEDIFF(2001-01-01', 2001-02-02') - > -32 |
| DAY(d) | 返回日期值d的日期部分 | SELECT DAY("2017-06-15"); -> 15 |
| DAYNAME(d) | 返回日期d是星期几,如Monday,Tuesday | SELECT DAYNAME('2011-11-11 11:11:11') -> Friday |
| DAYOFMONTH(d) | 计算日期d是本月的第几天 | SELECT DAYOFMONTH('2011-11-11 11:11:11") -> 11 |
| DAYOFWEEK(d) | 日期d今天是星期几,1星期日,2星期一,以此类推 | SELECT DAYOFWEEK('2011-11-11 11:11:11') -> 6 |
| DAYOFYEAR(d) | 计算日期d是本年的第几天 | SELECT DAYOFYEAR('2011-11-11 11:11:11') -> 315 |
| HOUR(t) | 返回t中的小时值 | SELECT HOUR('1:2:3') -> 1 |
| LAST_DAY(d) | 返回给定日期的那一月份的最后一天 | SELECT LAST DAY("2017-06-20"); -> 2017-06-30 |
| MONTHNAME(d) | 返回日期当中的月份名称,如November | SELECT MONTHNAME('2011-11-11 11:11:11') -> November |
| MONTH(d) | 返回日期d中的月份值,1到12 | SELECT MONTH( 2011-11-11 11:11:11') -> 11 |
| NOW() | 返回当前日期和时间 | SELECT NOW() -> 2018-09-19 20:57:43 |
| SECOND(t) | 返回t中的秒钟值 | SELECT SECOND('1:2:3') -> 3 |
| SYSDATE() | 返回当前日期和时间 | SELECT SYSDATE() -> 2018-09-19 20:57:43 |
| TIMEDIFF(time1,time2) | 计算时间差值 | SELECT TIMEDIFF("13:10:11", "13:10:10"); -> 00:00:01 |
| TO_DAYS(d) | 计算日期d距离000年1月1日的天数 | SELECT TO DAYS('0001-01-01 01:01:01') -> 366 |
| WEEK(d) | 计算日期d是本年的第几个星期,范围是0到53 | SELECT WEEK('2011-11-11 11:11:11') -> 45 |
| WEEKDAY(d) | 日期d是星期几,0表示星期一,1表示星期二 | SELECT WEEKDAY("2017-06-15"); -> 3 |
| WEEKOFYEAR(d) | 计算日期d是本年的第几个星期,范围是0到53 | SELECT WEEKOFYEAR('2011-11-11 11:11:11') -> 45 |
| YEAR(d) | 返回年份 | SELECT YEAR("2017-06-15"); -> 2017 |

转换函数

隐式数据类型转换

显示数据类型转换

依赖转换函数完成相关类型的转换

如:

DATE_FORMAT(date,format)将日期转换成字符串;

STR_TO_DATE(str,format)将字符串转换成日期;

|----|--------------------------|
| 格式 | 描述 |
| %a | 缩写星期名 |
| %b | 缩写月名 |
| %C | 月,数值 |
| %D | 带有英文前缀的月中的天 |
| %d | 月的天,数值(00-31) |
| %e | 月的天,数值(0-31) |
| %f | 微秒 |
| %H | 小时(00-23) |
| %h | 小时(01-12) |
| %I | 小时(01-12) |
| %i | 分钟,数值(00-59) |
| %j | 年的天(001-366) |
| %k | 小时(0-23) |
| %l | 小时(1-12) |
| %m | 月名 |
| %M | 月,数值(00-12) |
| %p | AM 或 PM |
| %r | 时间,12-小时(hh:mm:ssAM或PM) |
| %S | 秒(00-59) |
| %s | 秒(00-59) |
| %T | 时间,24-小时(hh:mm:ss) |
| %U | 周(00-53)星期日是一周的第一天 |
| %u | 周(00-53)星期一是一周的第一天 |
| %V | 周(01-53)星期日是一周的第一天,与%X使用 |
| %v | 周(01-53)星期一是一周的第一天,与%x使用 |
| %W | 星期名 |
| %w | 周的天(0=星期日,6=星期六) |
| %X | 年,其中的星期日是周的第一天,4位,与%V使用 |
| %x | 年,其中的星期一是周的第一天,4位,与%v使用 |
| %Y | 年,4位 |
| %y | 年,2位 |

示例:

STR_TO_DATE('2026年7月25日','%Y年%m月%d日')

--> 2026-07-30

DATE_FORMAT('2026-07-25','%Y年%m月%d日')

--> 2026年07月25日

通用函数

|----------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|
| 函数名 | 描述 | 实例 |
| IF(expr,v1,v2) | 如果表达式expr成立,返回结果v1;否则,返回结果v2。 | SELECT IF(1>0,'正确','错误") -> 正确 |
| IFNULL(v1,v2) | 如果v1的值不为NULL,则返回v1,否则返v2。 | SELECT IFNULL(null,'Hello Word') ->Hello Word |
| ISNULL(expression) | 判断表达式是否为NULL | SELECT ISNULL(NULL); -> 1 |
| NULLIF(expr1, expr2) | 比较两个参数是否相同,如果参数expr1与expr2相等返回NULL,否则返回 expr1 | SELECT NULLIF(25, 25); -> Null |
| COALESCE(expr1, expr2, ..... ,expr_n) | 返回参数中的第一个非空表达式(从左向右) | SELECT COALESCE(NULL,NULL, NULL,'bjsxt.com',NULL,'google.com'); -> bjsxt.com |
| CASE expression WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... WHEN conditionN THEN resultN ELSE result END | CASE表示函数开始,END表示函数结束。 如果condition1成立,则返回result1,如果condition2成立,则返回result2,当全部不成立则返回result,而当有一个成立之后,后面的就不执行了。 | SELECT CASE 'oldlu' WHEN 'oldlu' THEN OLDLU WHEN 'admin' THEN 'ADMIN' ELSE 'kevin' END; |

相关推荐
不剪发的Tony老师1 小时前
VeloxDB:一款免费开源的轻量级数据库管理工具
数据库·sql
dotnet901 小时前
批量生成所有表的修改脚本
数据库·sql·oracle
@Mike@1 小时前
06-数据库学习笔记(存储模型与数据压缩)
数据库·笔记·学习
南凉北往2 小时前
PandasAI连接LLM对MySQL数据库进行数据分析
数据库·mysql·数据分析
回眸不遇2 小时前
详谈 QT 布局 QLayout::SizeConstraint 和 QSizePolicy 对 QWidget 尺寸的影响
数据库·qt·系统架构
2601_965798472 小时前
MTDb Movie & TV Database Script Setup, Caching, and SEO Guide
linux·服务器·数据库·php
zdl6862 小时前
EasyMarkets:“机器人商业化仍待验证”
数据库·机器人
Freak嵌入式3 小时前
版本混乱 / 依赖缺失?uPyPi:MicroPython 版 PyPI,彻底解决库管理混乱
linux·服务器·数据库·单片机·嵌入式硬件·性能优化·依赖倒置原则
Elastic 中国社区官方博客3 小时前
Elastic 和 OpenAI 合作,将前沿智能引入非结构化企业数据
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai