Oracle之函数

本文深入讲解了SQL中的各种函数,包括单行函数如数值、字符、日期和转换函数,以及多行函数,如聚合函数。详细介绍了每个函数的使用方法和应用场景,通过实例帮助读者理解和掌握。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、单行函数(对列中某个值处理)

1.数值函数

函数

描述

示例

ABS(X)

X的绝对值

ABS(-8)=8

ACOS(X)

X的反余弦

ACOS(1)=0

COS(X)

余弦

COS(1)=0.54030230586814

CEIL(X)

大于或等于X的最小值

CEIL(45.25)=46

FLOOR(X)

小于或等于X的最大值

FLOOR(9.98)=9

LOG(X,Y)

X为底Y的对数

LOG(2,4)=2

MOD(X,Y)

X除以Y的余数

MOD(8,3)=2

POWER(X,Y)

X的Y次幂

POWER(2,3)=8

ROUND(X[,Y])

X在第Y位四舍五入(在缺省 y 时,默认 y=0;y 是负整数,四舍五入到小数点左边|y|位)

ROUND(3.456,2)=3.46  ROUND(351.654,-2)=400

SQRT(X)

X的平方根

SQRT(4)=2

TRUNC(X[,Y])

X在第Y位截断(在缺省 y 时,默认 y=0;y 是负整数,从到小数点左边|y|位开始截断)

TRUNC(3.456,2)=3.45

TRUNC (351.654,-2)=300

2.字符函数

函数

描述

ASCII(X)

返回字符X的ASCII码

CHR(number)返回数字number的ASCII值

CONCAT(X,Y)

连接字符串X和Y

INSTR(X,STR[,START][,N)

从X中查找子串str中的位置,可以指定从start开始,也可以指定从n开始

INITCAP(char)首字母转换成大写

LENGTH(X)

返回X的长度

LOWER(X)

X转换成小写

UPPER(X)

X转换成大写

LTRIM(X[,TRIM_STR])

把X的左边截去trim_str字符串,缺省截去空格

RTRIM(X[,TRIM_STR])

把X的右边截去trim_str字符串,缺省截去空格

LPAD(char1,n,char2)在字符串char1的左端填充字符串char2直到长度达到n;char2默认为空格,如果char1.length>n,则返回char1左端的n个字符
RPAD(char1,n,char2)在字符串char1的右端填充字符串char2直到长度达到n;char2默认为空格,如果char1.length>n,则返回char1左端的n个字符

TRIM([TRIM_STR  FROM]X)

把X的两边截去trim_str字符串,缺省截去空格

REPLACE(X,old,new)

在X中查找old,并替换成new

SUBSTR(X,start[,length])

返回X的字串,从start处开始,截取length个字符(下标从1开始,缺省length,默认到结尾)

    -- 返回字符ASCII码
    select ASCII('A') from dual; -- 65

    -- 返回数字的ASCII码CHR
    select CHR(65) from dual; -- A

    -- CONCAT字符拼接
    select CONCAT('hello', 'mark') from dual; -- hellomarko*******

    -- INSTR返回子串的位置
    select INSTR('hellotomandmark', 'm', 1) from dual; -- 8

    -- INITCAP首字母转大写
    select INITCAP('hello mark') from dual; -- Hello Mark

    -- LENGTH字符长度
    select LENGTH('mark') from dual; -- 4

    -- LOWER大写转小写
    select LOWER('MARK') from dual;--mark 

    -- UPPER小写转大写
    select UPPER('mark') from dual; -- MARK

    -- LTRIM左截取
    select LTRIM('*******hello', '*') from dual; -- hello

    -- RTRIM右截取
    select RTRIM('hello*******', '*') from dual; -- hello

    -- LPAD左填充
    select LPAD('hello', 12, '*') from dual; -- *******hello

    -- RPAD右填充
    select RPAD('hello', 12, '*') from dual; -- hello*******

    -- TRIM两端截取
    select TRIM('*' from '**hellomark**') from dual; -- hellomark
    select TRIM('  hellomark  ') from dual; -- hellomark(注:默认去掉空格)

    -- REPLACE字符替换
    select REPLACE('hellomark', 'mark', ' tom') from dual; -- hello tom

    -- SUBSTR字符截取
    select SUBSTR('marktom', 2, 3) from dual; -- ark(注:下标从1开始)

 3.日期函数

函数描述
SYSDATE返回系统当前日期和时间
NEXT_DAY(day,char)返回指定日期day后的第一个工作日char所对应的日期
LAST_DAY(day)返回day日期所指定月份中最后一天所对应的日期
ADD_MONTHS(day,n)返回day日期在n个月后(n为正数)或前(n为负数)的日期
MONTHS_BETWEEN(day1,day2)返回day1日期和day2日期之间相差得月份
ROUND(day[,fmt])返回日期的四舍五入结果。如果fmt指定年度,则7月1日为分界线;如果fmt指定月,则16日为分界线;如果指定天,则中午12:00为分界线,默认舍入到日
TRUNC(day,[,fmt])日期截断函数。如果fmt指定年度,则结果为本年度的1月1日;如果为月,则将结果为本月1日,默认截断到日
CURRENT_DATE返回当前会话时区所对应日期时间
EXTRACT从日期中获取所需要的特定数据(年|月|日)
    --当前时间 2019-01-07  21:07:56
    
    --查询3天后的日期
    select SYSDATE + 3 from dual; --2019-01-10 21:07:56

    -- NEXT_DAY,下一个char对应日期
    select NEXT_DAY(SYSDATE, '星期一') from dual; -- 2019-01-14 21:07:56

    -- LAST_DAY,指定day对应月份中最后一天
    select LAST_DAY(SYSDATE) from dual; -- 2019-01-31 21:09:09

    -- ADD_MONTHS,指定day对应月份加减n的日期
    select ADD_MONTHS(SYSDATE, 2) from dual; -- 2019-03-07 21:10:17

    -- MONTHS_BETWEEN,日期1和日期2相差月份
    select MONTHS_BETWEEN(SYSDATE, SYSDATE) from dual; -- 0
    select MONTHS_BETWEEN(ADD_MONTHS(SYSDATE, -2), ADD_MONTHS(SYSDATE, 2)) from dual; -- -4

    -- ROUND,日期的四舍五入
    select ROUND(SYSDATE) from dual; -- 2019-01-08 00:00:00
    select ROUND(SYSDATE, 'YEAR') from dual; -- 2019-01-01 00:00:00
    select ROUND(SYSDATE, 'MONTH') from dual; -- 2019-01-01 00:00:00

    -- TRUNC,日期截断
    select TRUNC(SYSDATE) from dual; -- 2019-01-07 00:00:00
    select TRUNC(SYSDATE, 'YEAR') from dual; -- 2019-01-01 00:00:00
    select TRUNC(SYSDATE, 'MONTH') from dual; -- 2019-01-01 00:00:00

    -- CURRENT_DATE,当前会话时区所对应日期时间
    select CURRENT_DATE from dual; -- 2019-01-07 21:14:26

    -- EXTRACT,从日期获取年|月|日
    select EXTRACT(YEAR from SYSDATE) from dual; -- 2019
    select EXTRACT(MONTH from SYSDATE) from dual; -- 1
    select EXTRACT(DAY from SYSDATE) from dual; -- 7

 4.转换函数

函数描述
TO_CHAR(d|n[,fmt])将一个数字或日期转换成字符串
TO_NUMBER(X,[,fmt])将字符型数据转换成数字型数据
TO_DATE(X,[,fmt])将字符型数据转换为日期型数据
CAST将一种built-in类型转换成另一种built-in类型
    -- TO_CHAR,数值或日期转字符
    select TO_CHAR(sal,'$9,999.99') from emp; -- 88
    select TO_CHAR(SYSDATE, 'yyyy-mm-dd hh:mm:ss') from dual; -- 2019-01-07 09:24:17
    select TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mm:ss') from dual;-- 2019-01-07 21:24:17

    -- TO_NUMBER,字符转数值
    select 100 + '10' from dual; --110(默认已经帮我们转换)
    select 100 + TO_NUMBER('10') from dual; -- 110
    select TO_NUMBER('mark') from dual; -- 无效数字

    -- TO_DATE,字符转日期
    select TO_DATE('2015-9-29', 'yyyy-mm-dd') from dual; -- 2015-09-29 00:00:00

    -- CAST,将一种字符转换成另一种字符
    select CAST('100' as NUMBER) + 10 from dual; -- 110
    select CAST(2 as char) || 'mark' from dual; -- 2mark
    select 2 || 'mark' from dual; -- 2mark(已经默认帮我们从数字转换成字符)

参数

示例

说明

9

999

指定位置处显示数字

.

9.9

指定位置返回小数点

,

99,99

指定位置返回一个逗号

$

$999

数字开头返回一个美元符号

EEEE

9.99EEEE

科学计数法表示

L

L999

数字前加一个本地货币符号

PR

999PR

如果数字式负数则用尖括号进行表示

5.通用函数

函数描述
SIGN(number)如果number大于0,SIGN则返回1;如果number小于0,SIGN则返回-1;如果number等于0,SIGN则返回0
decode(expression , search , result [, search , result]… [, default])IF语句的另一形式。将输入数值与参数列表比较,返回对应值。应用于将表的行转换成列以及IF语句无法应用的场合
TRUNC(number, [ decimal_places ])number是要截取的数字,decimal_places是要保留的小数位。这个参数必须是个整数。 如果此参数缺省,默认保留0位小数
GREATEST(expr1[,expr2]…)返回表达式中值最大的一个
LEAST(expr1[,expr2]…)返回表达式中值最小的一个
NULLIF(expr1,expr2)如果expr1=expr2;则返回null,否则返回expr1
NVL(expr1,expr2)如果expr1=null;则返回expr2,否则返回expr1
NVL2(expr1,expr2,expr3)如果expr1!=null;则返回expr2;如果expr1=null;则返回expr3
 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)  
  该函数的含义如下:  
  IF 条件=值1 THEN
  RETURN(翻译值1)
  ELSIF 条件=值2 THEN
  RETURN(翻译值2)
  ......
  ELSIF 条件=值n THEN
  RETURN(翻译值n)  
  ELSE
  RETURN(缺省值)
  END IF
    -- SIGN,大于0返回1,小于0返回-1,等于0返回0
    select SIGN(5) from dual; -- 1
    select SIGN(-8) from dual; -- -1
    select SIGN(0) from dual; -- 0

    -- TRUNC,数字截取
    select TRUNC(20.2183, 2) from dual; -- 20.21
    select TRUNC(20.1, 4) from dual; -- 20.1

    -- GREATEST,求最大值
    select GREATEST(54, 757, 80, 2, 4, 478) from dual; -- 757

    -- LEAST,求最小值
    select LEAST(5, 70, 54, 15, 35, 45) from dual; -- 5

    -- NULLIF,如果两个参数相等返回null,否则返回第一个
    select NULLIF(8, 8) from dual; -- NULL
    select NULLIF(20, 10) from dual; -- 20

    -- NVL,如果第一个参数等于null,返回第二个参数,否则返回第一个参数
    select NVL(20, 30) from dual; -- 20
    select NVL(NULL, 30) from dual; -- 30

    -- NVL2,如果第一个参数等于null,返回第三个参数。否则,返回第二个参数
    select NVL2(NULL, 20, 30) from dual; -- 30
    select NVL2('Hellomark', 20, 30) from dual; -- 20

 二、多行函数(对某列所有行进行处理)

函数描述
AVG计算某一列值的平均值
COUNT统计某一列中值的个数
MAX求某一列值中的最大值
MIN求某一列值中的最小值
SUM计算某一列值的总和
    --统计员工奖金总和
    select sum(comm) from emp; --会直接忽略空值
    --统计员工人数
    select count(1) from emp;
    --统计员工平均奖金
    select ceil(avg(comm)/count(1)) from emp;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值