Oracle中的数值处理相关函数介绍

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51551008,谢谢!

1、概述

Oracle函数处理三种类型的数值:单值、值组和值列表。

这些函数跟串函数一样,用来更改数值或者是返回数值相关的信息。

数值类型区分如下:

  • 单值:只是一个数值,如常数值、PL/SqL等中的变量。数据库的一列和一行的一个数字等。Oracle的单值函数通常通过计算来更改这些值。
  • 值组:一系列数据行中的某一列的所有数值数据。Oracle值组函数提供的是整个组的信息,如求某一列的平均数。
  • 值列表:可能是一列数字,如1、2、3、4.5、PL\SQL等中的变量、或是列中的列值(类型为列表型)。

函数表示方法:

FUNCTION(value[,option])

[表示可选参数]。

如果一个列值不包含任何值,则此时是NULL而不是0,他是空的,在后面这会对函数造成一定的影响,后面会详细介绍。

请注意下面很多示例都是用一个常量来演示,实际使用中,直接将其替换为列即可。

2、单值函数

单值函数一般都比较简单,但是很常用。

2.1、四则运算

他们分别是“+”,“-”,“*”,“/”,很简单,大家都会,不多说,看下简单示例:

  1. select 3+2,3-2,3*2,3/2 from users;

结果很显然:5 1 6 1.5

2.2、NULL

我们想将上面的SQL改为与NULL一起运算看下结果如何:

  1. select 3+NULL,3-NULL,3*NULL,3/NULL from users;

结果将返回:NULL NULL NULL NULL

对,他们的结果都为空,事实上,任何包含NULLDE算术运算都会得到结果NULL。

所以,NULL是不同于0的,NULL不应用来计算。

那么,这也解释了WHERE子句中,不能将NULL与=一起使用:因为如果x=y时,若他们都是NULL,但都是未知的,而实际他们野可能是任何值,使用=是没有意义的。

2.3、NVL:空值置换

针对上面的NULL问题,其中一种解决方法就是使用NVL函数。

语法:

NVL(value,substitute)

如果value为NULL,则函数结果为substitute,反之,结果为value。

虽然值为NULL,是未知的,但很多时候可以作一些合理的假设。比如:某列表示某员工的工资,想要计算整个部门一月需要发多少工资,显然是可以预估的,比如采用平均值,这是就可以将NULL值置换为那个平均值,

可以看下使用例子:

  1. select nvl(NULL,123),nvl(0,123) from users;

结果输出:123 0

NVL的使用不限于数值,他们同样可以适用于其他数据类型,但是要保证value参数和substitute参数类型是相同的。

NVL2

类似的函数是NVL2,语法:

NVL2(e1,e2,e3)

此处e1永远不会被返回,如果e1不为NULL,就返回e2,反之,返回e3。

2.4、ABS:绝对值

绝对值这个概念很简单,也不多说了。

语法:

  1. AB(value)

2.5、CEIL

CEIL用于产生大于或等于当前值的最小整数,当原来那个值为负数时,要留意其结果,看下面示例即可。

语法:

  1. CEIL(value)

示例:

  1. select ceil(1),ceil(1.2),ceil(1.5),ceil(1.6),ceil(-2),ceil(-2.4),ceil(-2.5),ceil(-2.6) from users;

结果为:1 2 2 2 -2 -2 -2 -2

2.6、FLOOR

FLOOR与CEIL相反,返回小于或等于指定值的最大整数。

语法:

  1. FLOOR(value)

我们沿用上面的示例:

  1. select ceil(1),ceil(1.2),ceil(1.5),ceil(1.6),ceil(-2),ceil(-2.4),ceil(-2.5),ceil(-2.6) from users;

结果:1 1 1 1 -2 -3 -3 -3

2.7、MOD

MOD函数主要用于复杂任务的数据处理,确保一串数字的精确传送。

也就是求余。

格式:

  1. MOD(value,divisor)

参数可以是任意实数。

示例:

  1. select mod(50,10),mod(15,4),mod(12.3,5),mod(5.5,2.9),mod(-7,5),mod(0,5),mod(5,0),mod(7,-5) from users;

结果:0 3 2.3 2.6 -2 0 5 2

请注意上面值为0和负数时的结果。

很显然,当divisor为1时,如果value为整数,mod值为0;为0时,结果为value的值。

与MOD函数相似的函数是REMAINDER,不过他们机制不同:MOD在公式中使用FLOOR函数,而REMAINDER使用ROUND函数。

可以看下面的示例对比一下:

2.8、POWER

POWER用于求一个值的指数乘方。

语法:

  1. POWER(value,exponent)

例子:

  1. select power(2,-2),power(-3,-2),power(-3,0),power(-3,1),power(-3,2),power(-3,10),power(1.1,2) from users;

结果:0.25 0.11111111111 1 -3 9 59049 1.21

也就是数学问题了。

2.9、SQRT:求平方根

通过POWER,我们就可以求得一个数的平方根:POWER(value)

但是Oracle单独提供了一个球平方根的函数:sqrt。

语法:

  1. SQRT(value)

下面的SQL语句结果是一样的:

  1. select power(121,0.5) from users;
  2. select sqrt(121) from users;

他们结果都为 11

Oracle不支持虚数,所以这个value不能为负数,否则会返回错误。

2.10、EXP、LN和LOG

他们是与科学计算相关的函数,商业计算很少涉及。

EXP是e的幂运算;LN是自然对数或以e为底的对数。他们互为反函数。

LOG(e,value)=LN(value)

科学工作者自然会知道他们的含义,此处不多说。

2.11、ROUND和TRUNC

也是两个相关的函数。TRUNC按精读截取某个狮子,ROUND则根据给定的精读舍入数值。

语法:

  1. ROUND(value,precision)
  2. TRUNC(value,precision)

对于他们,还是看实际的例子来得比较快:

  1. select round(11,2),round(11.111,2),round(11.888,2),round(11,-1) from users;
  2. select trunc(11,2),trunc(11.111,2),trunc(11.888,2),trunc(11,-1) from users;

他们分别返回:

11    11.11    11.89    10

11    11.11    11.88    10

trunc是直接截取,而round会四舍五入处理。

precision参数可以为负数,表示精度移到小数点左边。

2.12、SIGN

ABS返回的是绝对值,即一个数的值大小,不带符号。而SIGN返回的符号。

语法:

  1. SIGN(value)

示例:

  1. select sign(-123),sign(0),sign(123) from users;

结果:-1    0    1

2.13 科学计算函数

一大波数学函数...

SIN、SINH、COS、COSH、TAN、TANH、ACOS、ATAN、ATAN2和ASIN。

我们实际使用是很少的。

如果你确实要使用,那么你数学功底一定不错,那么函数的语法又是很简单的,所以,这里不再演示他们的用法。

3、聚集函数

聚体函数一般用于统计,把一组值作为操作对象来获得某个结果。

3.1、组值函数中的NULL

我们要时刻考虑到NULL值会对我们的结果造成怎样的影响。

不同于单值函数,组值函数会忽略NULL值后计算得到结果。

很多时候,这样做事挺好的:如果我们是计算平均数的,使用AVG函数,那么忽略NULL的行计算结果,可能也正是我们期望的工作方式。

但是,倘若上面这个例子,我们不是使用AVG而是SUM,那问题可能就会变得严重了。越多的NULL值,我们所得结果就与我们期望得到的正确结果相差越大。

但是对于这个问题,我们可以借助MAX,MIN等函数,优化我们的处理方式。

当然,COUNT与其他函数会有所不同。

(1)count(*)始终返回总的数据条数

(2)count(field)返回当前字段中不为NULL的个数

组值函数很多时候会与单值函数结合使用。

3.2、常见组值函数

常用的组值函数是:AVG,COUNT,MAX,MIN,SUM

STDDEV和VARIANCE函数用于常规的统计学功能,分别是标准差和标准方差。

当然,他们也是SQL语言标准所支持的,此处不作介绍了,可以参考:SQL数据库语言总结及代码示例

3.3、组值函数中的DISTINCT

与ALL对应的就是DISTINCT,语法:

COUNT([DISTINCT|ALL] value)

DISTINCT会强制同名字段只统计一次。

默认使用的是ALL,即检查每一行。

4、列表函数

组值函数处理的是一列,而列表函数处理的是一行的一组列。

列表函数可以比较各列,然后选出我们希望得到的一列。

比如,我们要获取同学们左右科目中最高的分数:

  1. select greatest(english,math,cpp) from grades;

函数GREATESTLEAST用于返回最大和最小的值。

语法:

GREATEST(value1,value2.value3...)

LEAST(value1,value2.value3...)

他们参数可以是多个,可以使用列、常量、计算结果等。

他们不仅限于数值类型中使用,也可以用于字符串类型。

函数COALESCE用于第一个非NULL的参数,如果所有参数都是NULL,则返回NULL。

语法:

COALESCE(value1,value2.value3...)

可以使用MAXMIN查找行,然后通过该行获取数据。

在计算和组合多个条件时,我们还要考虑到优先级,比如AND优先级高于OR,如果我们不确定优先级时,或者为了阅读更清晰,请加上括号。

更多相关内容

随着文章的更新,会逐渐补全下面的链接。

1、Oracle中的字符串类型及相关函数详解

2、Oracle中的正则表达式(及函数)详解

3、Oracle中的数值类型相关函数详解

4、Oracle中的日期相关函数详解

5、Oracle中的转换函数和变换函数详解

6、SQL数据库语言总结及代码示例

7、Oracle 12c Windows安装、介绍及简单使用(图文)

8、Oracle 12c 简单的jdbc使用

9、Oracle中的SQL分页查询原理和方法详解

博客会持续更新Oracle数据库相关文章。

时间: 2024-10-02 18:23:07

Oracle中的数值处理相关函数介绍的相关文章

【转】Oracle中dual表的用途介绍

原文:Oracle中dual表的用途介绍 [导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情. dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 select user from dual; 2.用来调用系统函数 select to_char(sysdate,'yyyy-mm

oracle中110个常用函数介绍

1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual; A A ZERO SPACE --------- --------- --------- --------- 65 97 48 32 2. CHR 给出整数,返回对应的字符; SQL> select chr(54740) zhao,chr(65) chr65 from dual; ZH C --

oracle中动态SQL使用详细介绍

Oracle编译PL/SQL程序块分为两个种:通常静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式,需要了解的朋友可以参考下 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进

Oracle中dual表的用途介绍

导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情.     dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 select user from dual; 2.用来调用系统函数 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') f

Oracle中的字符串类型及相关函数详解

1.概述 本文介绍String类型及相关的函数,基于当前最新的Oracle 12c 为基础作介绍. 下文将字符串简称为串. Oracle函数的工作方式有两种: 1.根据旧的对象创建新的对象--他们对原来的信息进行修改,如改变字母的大小写. 2.告诉用户有关的信息,如一个单词或句子中有几个字符. 后续会更新另外两种处理文本的方式:Oracle中的正则表达式 和 Oracle Text工具,等文章编辑完成,会在此处添加链接. Oracle中主要有两种字符串类型:CHAR和VARCHAR2,他们以字母

Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构struct timeval{time_t tv_sec; /***second***/susecond_t tv_usec;/***microsecond***/}到底microsecond是毫秒还是微秒?? 1秒=1000毫秒(3个零),1秒=1000 000微秒(6个零),1秒=1000 000 000纳秒(9个零),1秒=1000 000 000

oracle中Connect By用法介绍

为解决oracle中自连接查询不适合操作大表的情况,采用connect by 方式实现.oracle中可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 在结构化查询中应用. 基本语法: select ... from <TableName> where <Conditional1> connect by <Conditional2> start with <Conditional3> connect by

Sql与oracle中null值的区别

原贴链接请点击: 1 null值的介绍 NULL 是数据库中特有的数据类型,当一条记录的某个列为 NULL ,则表示这个列的值是未知的.是不确定的.既然是未知的,就有无数种的可能性.因此, NULL 并不是一个确定的值. 这是 NULL 的由来.也是 NULL 的基础,所有和 NULL 相关的操作的结果都可以从 NULL 的概念推导出来. 2 oracle中的null值介绍 在不知道具体有什么数据的时候,即未知,可以用NULL, 称它为空,ORACLE中,含有空值的表列长度为零.允许任何一种数据

【转】Oracle中如何用一条SQL快速生成10万条测试数据

转自http://blog.csdn.net/welken/article/details/4971887 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试数据的方法. 产生测试数据的SQL如下: SQL> select rownum as id,  2                 to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm