ORACLE函数介绍

ORACLE函数介绍

第一篇著名函数之单值函数

注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式。

  单值函数在查询中返回单个值,可被应用到selectwhere子句,start with以及connect by 子句和having子句。

(一).数值型函数(Number Functions)

数值型函数输入数字型参数并返回数值型的值。多数该类函数的返回值支持38位小数点,诸如:COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, and TANH 支持36位小数点。ACOS, ASIN, ATAN, and ATAN2支持30位小数点。

 

1、MOD(n1,n2) 返回n1n2的余数,如果n2=0则返回n1的值。

例如:SELECT MOD(24,5) FROM DUAL;

 

2、ROUND(n1[,n2]) 返回四舍五入小数点右边n2位后n1的值,n2缺省值为0,如果n2为负数就舍入到小数点左边相应的位上(虽然oracle documents上提到n2的值必须为整数,事实上执行时此处的判断并不严谨,即使n2为非整数,它也会自动将n2取整后做处理,但是我文档中其它提到必须为整的地方需要特别注意,如果不为整执行时会报错的)

例如:SELECT ROUND(23.56),ROUND(23.56,1),ROUND(23.56,-1) FROM DUAL;

 

3、TRUNC(n1[,n2] 返回截尾到n2位小数的n1的值,n2缺省设置为0,当n2为缺省设置时会将n1截尾为整数,如果n2为负值,就截尾在小数点左边相应的位上。

例如:SELECT TRUNC(23.56),TRUNC(23.56,1),TRUNC(23.56,-1) FROM DUAL;

 

(二).字符型函数返回字符值(Character Functions Returning Character Values)

  该类函数返回与输入类型相同的类型。

l         返回的CHAR类型值长度不超过2000字节;

l         返回的VCHAR2类型值长度不超过4000字节;

如果上述应返回的字符长度超出,oracle并不会报错而是直接截断至最大可支持长度返回。

 

l         返回的CLOB类型值长度不超过4G

对于CLOB类型的函数,如果返回值长度超出,oracle不会返回任何错误而是直接抛出错误。

 

1、LOWER(c) 将指定字符串内字符变为小写,支持CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOB类型

例如:SELECT LOWER('WhaT is tHis') FROM DUAL;

 

2、UPPER(c) 将指定字符串内字符变为大写,支持CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOB类型

例如:SELECT UPPER('WhaT is tHis') FROM DUAL;

 

3、LPAD(c1,n[,c2]) 返回指定长度=n的字符串,需要注意的有几点:

l         如果n<c1.length则从右到左截取指定长度返回;

l         如果n>c1.length and c2 is null,以空格从左向右补充字符长度至n并返回;

l         如果n>c1.length and c2 is not null,以指定字符c2从左向右补充c1长度至n并返回;

例如:SELECT LPAD('WhaT is tHis',5),LPAD('WhaT is tHis',25),LPAD('WhaT is tHis',25,'-') FROM DUAL;

最后大家再猜一猜,如果n<0,结果会怎么样

 

4、RPAD(c1,n[,c2]) 返回指定长度=n的字符串,基本与上同,不过补充字符是从右向左方向正好与上相反;

例如:SELECT RPAD('WhaT is tHis',5),RPAD('WhaT is tHis',25),RPAD('WhaT is tHis',25,'-') FROM DUAL;

 

5、TRIM([[LEADING||TRAILING||BOTH] c2 FROM] c1) 哈哈,被俺无敌的形容方式搞晕头了吧,这个地方还是看图更明了一些。

看起来很复杂,理解起来很简单:

l         如果没有指定任何参数则oracle去除c1头尾空格

例如:SELECT TRIM('   WhaT is tHis   ') FROM DUAL;

l         如果指定了c2参数,则oracle去掉c1头尾c2(这个建议细致测试,有多种不同情形的哟)

例如:SELECT TRIM('W' FROM 'WhaT is tHis w W') FROM DUAL;

l         如果指定了leading参数则会去掉c1头部c2

例如:SELECT TRIM(leading 'W' FROM 'WhaT is tHis w W') FROM DUAL;

l         如果指定了trailing参数则会去掉c1尾部c2

例如:SELECT TRIM(trailing 'W' FROM 'WhaT is tHis w W') FROM DUAL;

l         如果指定了both参数则会去掉c1头尾c2(跟不指定有区别吗?没区别!)

例如:SELECT TRIM(both 'W' FROM 'WhaT is tHis w W') FROM DUAL;

 

注意:c2长度=1

 

6、LTRIM(c1[,c2]) 千万表以为与上面那个长的像,功能也与上面的类似,本函数是从字符串c1左侧截取掉与指定字符串c2相同的字符并返回。如果c2为空则默认截取空格。

例如:SELECT LTRIM('WWhhhhhaT is tHis w W','Wh') FROM DUAL;

 

7、RTRIM(c1,c2)与上同,不过方向相反

例如:SELECT RTRIM('WWhhhhhaT is tHis w W','W w') FROM DUAL;

 

8、REPLACE(c1,c2[,c3]) c1字符串中的c2替换为c3,如果c3为空,则从c1中删除所有c2

例如:SELECT REPLACE('WWhhhhhaT is tHis w W','W','-') FROM DUAL;

 

9、SOUNDEX(c) 神奇的函数啊,该函数返回字符串参数的语音表示形式,对于比较一些读音相同,但是拼写不同的单词非常有用。计算语音的算法如下:

l         保留字符串首字母,但删除aehiowy

l         将下表中的数字赋给相对应的字母:

1bfpv

2cgkqsxz

3dt

4l

5mn

6R

l         如果字符串中存在拥有相同数字的2个以上(包含2个)的字母在一起(例如bf),或者只有hw,则删除其他的,只保留1个;

l         只返回前4个字节,不够用0填充

例如:SELECT SOUNDEX('dog'),soundex('boy') FROM DUAL;

10、SUBSTR(c1,n1[,n2]) 截取指定长度的字符串。稍不注意就可能充满了陷阱的函数。

n1=开始长度;

n2=截取的字符串长度,如果为空,默认截取到字符串结尾;

l         如果n1=0 then n1=1

l         如果n1>0,则oracle从左向右确认起始位置截取

例如:SELECT SUBSTR('What is this',5,3) FROM DUAL;

l         如果n1<0,则oracle从右向左数确认起始位置

例如:SELECT SUBSTR('What is this',-5,3) FROM DUAL;

l         如果n1>c1.length则返回空

例如:SELECT SUBSTR('What is this',50,3) FROM DUAL;

然后再请你猜猜,如果n2<1,会如何返回值呢

11、TRANSLATE(c1,c2,c3) 就功能而言,此函数与replace有些相似。但需要注意的一点是,translate是绝对匹配替换,这点与replace函数具有非常大区别。什么是绝对匹配替换呢?简单的说,是将字符串c1中按一定的格式c2替换为c3。如果文字形容仍然无法理解,我们通过几具实例来说明:

例如:

SELECT TRANSLATE('What is this','','-') FROM DUAL;

SELECT TRANSLATE('What is this','-','') FROM DUAL;

结果都是空。来试试这个:

SELECT TRANSLATE('What is this',' ',' ') FROM DUAL;

再来看这个:

SELECT TRANSLATE('What is this','ait','-*') FROM DUAL;

是否明白了点呢?Replace函数理解比较简单,它是将字符串中指定字符替换成其它字符,它的字符必须是连续的。而translate中,则是指定字符串c1中出现的c2,将c2中各个字符替换成c3中位置顺序与其相同的c3中的字符。明白了?Replace是替换,而translate则像是过滤。

 

(三).字符型函数返回数字值(Character Functions Returning Number Values)

本类函数支持所有的数据类型

 

1、INSTR(c1,c2[,n1[,n2]]) 返回c2c1中位置

l         c1:原字符串

l         c2:要寻找的字符串

l         n1:查询起始位置,正值表示从左到右,负值表示从右到左 (大小表示位置,比如3表示左面第3处开始,-3表示右面第3处开始)。黑黑,如果为0的话,则返回的也是0

l         n2:第几个匹配项。大于0

例如:SELECT INSTR('abcdefg','e',-3) FROM DUAL;

 

2、LENGTH(c) 返回指定字符串的长度。如果

例如:SELECT LENGTH('A123中') FROM DUAL;

猜猜SELECT LENGTH('') FROM DUAL;的返回值是什么

 

(四).日期函数(Datetime Functions)

本类函数中,除months_between返回数值外,其它都将返回日期。

 

1、ADD_MONTHS() 返回指定日期月份+n之后的值,n可以为任何整数。

例如:SELECT ADD_MONTHS(sysdate,12),ADD_MONTHS(sysdate,-12) FROM DUAL;

 

2、CURRENT_DATE 返回当前session所在时区的默认时间

例如:

SQL> alter session set nls_date_format = 'mm-dd-yyyy' ;

SQL> select current_date from dual;

 

3、SYSDATE 功能与上相同,返回当前session所在时区的默认时间。但是需要注意的一点是,如果同时使用sysdatecurrent_date获得的时间不一定相同,某些情况下current_date会比sysdate快一秒。经过与xyf_tck(兄台的大作ORACLE的工作机制写的很好,深入浅出)的短暂交流,我们认为current_date是将current_timestamp中毫秒四舍五入后的返回,虽然没有找到文档支持,但是想来应该八九不离十。同时,仅是某些情况下会有一秒的误差,一般情况下并不会对你的操作造成影响,所以了解即可。

例如:SELECT SYSDATE,CURRENT_DATE FROM DUAL;

4、LAST_DAY(d) 返回指定时间所在月的最后一天

例如:SELECT last_day(SYSDATE) FROM DUAL;

 

5、NEXT_DAY(d,n) 返回指定日期后第一个n的日期,n为一周中的某一天。但是,需要注意的是n如果为字符的话,它的星期形式需要与当前session默认时区中的星期形式相同。

例如:三思用的中文ntnls_language值为SIMPLIFIED CHINESE

SELECT NEXT_DAY(SYSDATE,5) FROM DUAL;

SELECT NEXT_DAY(SYSDATE,'星期四') FROM DUAL;

两种方式都可以取到正确的返回,但是:

SELECT NEXT_DAY(SYSDATE,'Thursday') FROM DUAL;

则会执行出错,提供你说周中的日无效,就是这个原因了。

 

6、MONTHS_BETWEEN(d1,d2) 返回d1d2间的月份差,视d1,d2的值大小,结果可正可负,当然也有可能为0

例如:

SELECT months_between(SYSDATE, sysdate),

       months_between(SYSDATE, add_months(sysdate, -1)),

       months_between(SYSDATE, add_months(sysdate, 1))

 FROM DUAL;

 

7、ROUND(d[,fmt]) 前面讲数值型函数的时候介绍过ROUND,此处与上功能基本相似,不过此处操作的是日期。如果不指定fmt参数,则默认返回距离指定日期最近的日期。

例如:SELECT ROUND(SYSDATE,'HH24') FROM DUAL;

8、TRUNC(d[,fmt]) 与前面介绍的数值型TRUNC原理相同,不过此处也是操作的日期型。

例如:SELECT TRUNC(SYSDATE,'HH24') FROM DUAL;

(五).转换函数(Conversion Functions)

转换函数将指定字符从一种类型转换为另一种,通常这类函数遵循如下惯例:函数名称后面跟着待转换类型以及输出类型。

 

1、TO_CHAR() 本函数又可以分三小类,分别是

l         转换字符->字符TO_CHAR(c):将nchar,nvarchar2,clob,nclob类型转换为char类型;

例如:SELECT TO_CHAR('AABBCC') FROM DUAL;

 

l         转换时间->字符TO_CHAR(d[,fmt]):将指定的时间(data,timestamp,timestamp with time zone)按照指定格式转换为varchar2类型;

例如:SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;

 

l         转换数值->字符TO_CHAR(n[,fmt]):将指定数值n按照指定格式fmt转换为varchar2类型并返回;

例如:SELECT TO_CHAR(-100, 'L99G999D99MI') FROM DUAL;

 

2、TO_DATE(c[,fmt[,nls]]) char,nchar,varchar2,nvarchar2转换为日期类型,如果fmt参数不为空,则按照fmt中指定格式进行转换。注意这里的fmt参数。如果ftm'J'则表示按照公元制(Julian day)转换,c则必须为大于0并小于5373484的正整数。

例如:

SELECT TO_DATE(2454336, 'J') FROM DUAL;

SELECT TO_DATE('2007-8-23 23:25:00', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL;

 

3、TO_NUMBER(c[,fmt[,nls]]) char,nchar,varchar2,nvarchar2型字串按照fmt中指定格式转换为数值类型并返回。

例如:SELECT TO_NUMBER('-100.00', '9G999D99') FROM DUAL;

 

(六).其它辅助函数(Miscellaneous Single-Row Functions)

 

1、DECODE(exp,s1,r1,s2,r2..s,r[,def]) 可以把它理解成一个增强型的if else,只不过它并不通过多行语句,而是在一个函数内实现if else的功能。

exp做为初始参数。s做为对比值,相同则返回r,如果s有多个,则持续遍历所有s,直到某个条件为真为止,否则返回默认值def(如果指定了的话),如果没有默认值,并且前面的对比也都没有为真,则返回空。

毫无疑问,decode是个非常重要的函数,在实现行转列等功能时都会用到,需要牢记和熟练使用。

 

例如:select decode('a2','a1','true1','a2','true2','default') from dual;

 

2、GREATEST(n1,n2,...n) 返回序列中的最大值

例如:SELECT GREATEST(15,5,75,8) "Greatest" FROM DUAL;

 

3、LEAST(n1,n2....n)   返回序列中的最小值

例如:SELECT LEAST(15,5,75,8) LEAST FROM DUAL;

 

4、NULLIF(c1,c2)

Nullif也是个很有意思的函数。逻辑等价于:CASE WHEN c1 = c2 THEN NULL ELSE c1 END

例如:SELECT NULLIF('a','b'),NULLIF('a','a') FROM DUAL;

 

5、NVL(c1,c2) 逻辑等价于IF c1 is null THEN c2 ELSE c1 ENDc1,c2可以是任何类型。如果两者类型不同,则oracle会自动将c2转换为c1的类型。

例如:SELECT NVL(null, '12') FROM DUAL;

 

6、NVL2(c1,c2,c3) 大家可能都用到nvl,但你用过nvl2吗?如果c1非空则返回c2,如果c1为空则返回c3

例如:select nvl2('a', 'b', 'c') isNull,nvl2(null, 'b', 'c') isNotNull from dual;

 

7、SYS_CONNECT_BY_PATH(col,c) 该函数只能应用于树状查询。返回通过c1连接的从根到节点的路径。该函数必须与connect by 子句共同使用。

例如:

create table tmp3(

rootcol varchar2(10),

nodecol varchar2(10)

);

 

insert into tmp3 values ('','a001');

insert into tmp3 values ('','b001');

insert into tmp3 values ('a001','a002');

insert into tmp3 values ('a002','a004');

insert into tmp3 values ('a001','a003');

insert into tmp3 values ('a003','a005');

insert into tmp3 values ('a005','a008');

insert into tmp3 values ('b001','b003');

insert into tmp3 values ('b003','b005');

 

select lpad(' ', level*10,'=') ||'>'|| sys_connect_by_path(nodecol,'/')

 from tmp3

 start with rootcol = 'a001'

connect by prior nodecol =rootcol;

 

8、SYS_CONTEXT(c1,c2[,n]) 将指定命名空间c1的指定参数c2的值按照指定长度n截取后返回。

Oracle9i提供内置了一个命名空间USERENV,描述了当前session的各项信息,其拥有下列参数:

l         CURRENT_SCHEMA:当前模式名;

l         CURRENT_USER:当前用户;

l         IP_ADDRESS:当前客户端IP地址;

l         OS_USER:当前客户端操作系统用户;

等等数十项,更详细的参数列还请大家直接参考Oracle Online Documents

 

例如:SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') FROM DUAL;

 

ORACLE函数介绍

第二篇非著名函数之单值函数

注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式。

  单值函数在查询中返回单个值,可被应用到selectwhere子句,start with以及connect by 子句和having子句。

(一).数值型函数(Number Functions)

数值型函数输入数字型参数并返回数值型的值。多数该类函数的返回值支持38位小数点,诸如:COS, COSH, EXP, LN, LOG, SIN, SINH, SQRT, TAN, and TANH 支持36位小数点。ACOS, ASIN, ATAN, and ATAN2支持30位小数点。

 

1、ABS(n) 返回数字的绝对值

例如:SELECT ABS(-1000000.01) FROM DUAL;

 

2、COS(n) 返回n的余弦值

例如:SELECT COS(-2) FROM DUAL;

 

3、ACOS(n) 反余弦函数,n between -1 and 1,返回值between 0 and pi

例如:SELECT ACOS(0.9) FROM DUAL;

 

4、BITAND(n1,n2) 位与运算,这个太有意思了,虽然没想到可能用到哪里,详细说明一下:

假设3,9做位与运算,3的二进制形式为:00119的二进制形式为:1001,则结果是0001,转换成10进制数为1

例如:SELECT BITAND(3,9) FROM DUAL;

 

5、CEIL(n) 返回大于或等于n的最小的整数值

例如:SELECT ceil(18.2) FROM DUAL;

考你一下,猜猜ceil(-18.2)的值会是什么呢

 

6、FLOOR(n) 返回小于等于n的最大整数值

例如:SELECT FLOOR(2.2) FROM DUAL;

再猜猜floor(-2.2)的值会是什么呢

 

7、BIN_TO_NUM(n1,n2,....n) 二进制转向十进制

例如:SELECT BIN_TO_NUM(1),BIN_TO_NUM(1,0),BIN_TO_NUM(1,1) FROM DUAL;

 

8、SIN(n) 返回n的正玄值,n为弧度。

例如:SELECT SIN(10) FROM DUAL;

 

9、SINH(n) 返回n的双曲正玄值,n为弧度。

例如:SELECT SINH(10) FROM DUAL;

 

10、ASIN(n) 反正玄函数,n between -1 and 1,返回值between pi/2 and -pi/2

例如:SELECT ASIN(0.8) FROM DUAL;

 

11、TAN(n) 返回n的正切值,n为弧度

例如:SELECT TAN(0.8) FROM DUAL;

 

12、TANH(n) 返回n的双曲正切值,n为弧度

例如:SELECT TANH(0.8) FROM DUAL;

 

13、ATAN(n) 反正切函数,n表示弧度,返回值between pi/2 and -pi/2

例如:SELECT ATAN(-444444.9999999) FROM DUAL;

 

14、EXP(n) 返回en次幂,e = 2.71828183 ...

例如:SELECT EXP(3) FROM DUAL;

 

15、LN(n) 返回n的自然对数,n>0

例如:SELECT LN(0.9) FROM DUAL;

 

16、LOG(n1,n2) 返回以n1为底n2的对数,n1 >0 and not 1 n2>0

例如:SELECT LOG(1.1,2.2) FROM DUAL;

 

17、POWER(n1,n2) 返回n1n2次方。n1,n2可以为任意数值,不过如果m是负数,则n必须为整数

例如:SELECT POWER(2.2,2.2) FROM DUAL;

 

18、SIGN(n) 如果n<0返回-1,如果n>0返回1,如果n=0返回0.

例如:SELECT SIGN(14),SIGN(-14),SIGN(0) FROM DUAL;

 

19、SQRT(n) 返回n的平方根,n为弧度。n>=0

例如:SELECT SQRT(0.1) FROM DUAL;

 

(二).字符型函数返回字符值(Character Functions Returning Character Values)

  该类函数返回与输入类型相同的类型。

l         返回的CHAR类型值长度不超过2000字节;

l         返回的VCHAR2类型值长度不超过4000字节;

如果上述应返回的字符长度超出,oracle并不会报错而是直接截断至最大可支持长度返回。

 

l         返回的CLOB类型值长度不超过4G

对于CLOB类型的函数,如果返回值长度超出,oracle不会返回任何错误而是直接抛出错误。

 

1、CHR(N[ USING NCHAR_CS]) 返回指定数值在当前字符集中对应的字符

例如:SELECT CHR(95) FROM DUAL;

 

2、CONCAT(c1,c2) 连接字符串,等同于||

例如:SELECT concat('aa','bb') FROM DUAL;

 

3、INITCAP(c)   将字符串中单词的第一个字母转换为大写,其它则转换为小写

例如:SELECT INITCAP('whaT is this') FROM DUAL;

 

4、NLS_INITCAP(c) 返回指定字符串,并将字符串中第一个字母变大写,其它字母变小写

例如:SELECT NLS_INITCAP('中华miNZHu') FROM DUAL;

它还具有一个参数:Nlsparam用来指定排序规则,可以忽略,默认状态该参数为当前session的排序规则。

 

(三).字符型函数返回数字值(Character Functions Returning Number Values)

本类函数支持所有的数据类型

4、ASCII(c) chr函数的用途刚刚相反,本函数返回指定字符在当前字符集下对应的数值。

例如:SELECT ASCII('_') FROM DUAL;

 

(四).日期函数(Datetime Functions)

本类函数中,除months_between返回数值外,其它都将返回日期。

1、CURRENT_TIMESTAMP([n]) 返回当前session所在时区的日期和时间。n表示毫秒级的精度,不大于6

例如:SELECT CURRENT_TIMESTAMP(3) FROM DUAL;

 

2、LOCALTIMESTAMP([n]) 与上同,返回当前session所在时区的日期和时间。n表示毫秒级的精度,不大于6

例如:SELECT LOCALTIMESTAMP(3) FROM DUAL;

 

3、SYSTIMESTAMP([n]) 与上同,返回当前数据库所在时区的日期和时间,n表示毫秒级的精度,>0 and <6

例如:SELECT SYSTIMESTAMP(4) FROM DUAL;

 

4、DBTIMEZONE 返回数据库的当前时区

例如:SELECT DBTIMEZONE FROM DUAL;

 

5、SESSIONTIMEZONE 返回当前session所在时区

例如:SELECT SESSIONTIMEZONE FROM DUAL;

 

6、EXTRACT(key from date) key=(year,month,day,hour,minute,second) 从指定时间提到指定日期列

例如:SELECT EXTRACT(year from sysdate) FROM DUAL;

 

7、TO_TIMESTAMP(c1[,fmt]) 将指定字符按指定格式转换为timestamp格式。

例如:SELECT TO_TIMESTAMP('2007-8-22', 'YYYY-MM-DD HH:MI:SS') FROM DUAL;

 

(五).转换函数(Conversion Functions)

转换函数将指定字符从一种类型转换为另一种,通常这类函数遵循如下惯例:函数名称后面跟着待转换类型以及输出类型。

 

l         BIN_TO_NUM(n1,n2...n) 将一组位向量转换为等价的十进制形式。

例如:SELECT BIN_TO_NUM(1,1,0) FROM DUAL;

 

l         CAST(c as newtype) 将指定字串转换为指定类型,基本只对字符类型有效,比如char,number,date,rowid等。此类转换有一个专门的表列明了哪种类型可以转换为哪种类型,此处就不作酹述。

例如:SELECT CAST('1101' AS NUMBER(5)) FROM DUAL;

 

l         CHARTOROWID(c) 将字符串转换为rowid类型

例如:SELECT CHARTOROWID('A003D1ABBEFAABSAA0') FROM DUAL;

 

l         ROWIDTOCHAR(rowid) 转换rowid值为varchar2类型。返回串长度为18个字节。

例如:SELECT ROWIDTOCHAR(rowid) FROM DUAL;

 

l         TO_MULTI_BYTE(c) 将指定字符转换为全角并返回char类型字串

例如:SELECT TO_MULTI_BYTE('ABC abc 中华') FROM DUAL;

 

l         TO_SINGLE_BYTE(c) 将指定字符转换为半角并返回char类型字串

例如:SELECT TO_SINGLE_BYTE('ABC abc中华') FROM DUAL;

 

(六).其它辅助函数(Miscellaneous Single-Row Functions)

1、COALESCE(n1,n2,....n)   返回序列中的第一个非空值

例如:SELECT COALESCE(null,5,6,null,9) FROM DUAL;

 

2、DUMP(exp[,fmt[,start[,length]]])

dump是个功能非常强悍的函数,对于深入了解oracle存储的人而言相当有用。所以对于我们这些仅仅只是应用的人而言就不知道能将其应用于何处了。此处仅介绍用法,不对其功能做深入分析。

如上所示,dump拥有不少参数。其本质是以指定格式,返回指定长度的exp的内部表示形式的varchar2值。fmt4种格式:8||10||16||17,分别表示8进制,10进制,16进制和单字符,默认为10进制。start参数表示开始位置,length表示以,分隔的字串数。

例如:SELECT DUMP('abcdefg',17,2,4) FROM DUAL;

 

3、EMPTY_BLOB,EMPTY_CLOB 这两个函数都是返回空lob类型,通常被用于insertupdate等语句以初始化lob列,或者将其置为空。EMPTY表示LOB已经被初始化,只不过还没有用来存储数据。

4、NLS_CHARSET_NAME(n) 返回指定数值对应的字符集名称。

例如:SELECT NLS_CHARSET_NAME(1) FROM DUAL;

 

5、NLS_CHARSET_ID(c) 返回指定字符对应的字符集id

例如:SELECT NLS_CHARSET_ID('US7ASCII') FROM DUAL;

 

6、NLS_CHARSET_DECL_LEN(n1,n2) 返回一个NCHAR值的声明宽度(以字符为单位).n1是该值以字节为单位的长度,n2是该值的字符集ID

例如:SELECT NLS_CHARSET_DECL_LEN(100, nls_charset_id('US7ASCII')) FROM DUAL;

 

7、SYS_EXTRACT_UTC(timestamp) 返回标准通用时间即格林威治时间。

例如:SELECT SYS_EXTRACT_UTC(current_timestamp) FROM DUAL;

 

8、SYS_TYPEID(object_type) 返回对象类型对应的id

例如:这个这个,没有建立过自定义对象,咋做示例?

 

9、UID 返回一个唯一标识当前数据库用户的整数。

例如:SELECT UID FROM DUAL;

 

10、USER 返回当前session用户

例如:SELECT USER FROM DUAL;

 

11、USERENV(c) 该函数用来返回当前session的信息,据oracle文档的说明,userenv是为了保持向下兼容的遗留函数。oracle公司推荐你使用sys_context函数调用USERENV命名空间来获取相关信息,所以大家了解下就行了。

例如:SELECT USERENV('LANGUAGE') FROM DUAL;

 

12、VSIZE(c) 返回c的字节数。

例如:SELECT VSIZE('abc中华') FROM DUAL;

ORACLE函数介绍

第三篇著名函数之聚合函数

注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式。

  聚合函数可被用于select,order by以及having子句中。其运算可以基于group by的结果,也可以直接对所有记录进行运算。当然,这种类型语句相信大家平常也用的比较多,概念性的就不多介绍了,有一点需要注意的是,除了countgrouping之后,其它的统计运算均会忽略值为null的列。

  为更好演示此类函数应用,我们需要首先构建一个测试表,如下:

create table tmp1(col varchar2(10),value number(5));

insert into tmp1 values ('test1',60);

insert into tmp1 values ('test2',120);

insert into tmp1 values ('test3',460);

insert into tmp1 values ('test4',225);

insert into tmp1 values ('test5',119);

insert into tmp1 values ('test6',350);

insert into tmp1 values ('test7',23);

insert into tmp1 values ('test1',120);

insert into tmp1 values ('test3',69);

insert into tmp1 values ('test4',89);

insert into tmp1 values ('test6',145);

 

后续章节示例中也均以此表做例。

  注意,多数聚合函数都支持DISTINCT子句(distinct是什么?过滤记录集中重复记录用的),如果不指定则默认针对所有计录,举个最简单的例子:select count(col),count(distinct col) from tmp1

  本类函数中部分函数同时也属于分析函数。其做为分析函数时的具体用法将会在后面章节介绍,本节不做描述。

1、AVG([distinct|all]n) 求取记录集中的平均值。

例如:SELECT col, avg(value) FROM tmp1 GROUP BY col ORDER BY col

 

2、COUNT([distinct|all]col) 该函数返回查询涉及到的记录行数。

例如:

SELECT col, count(0) FROM tmp1 GROUP BY col ORDER BY col;

SELECT count(col), count(distinct col) FROM tmp1;

 

3、DENSE_RANK(n1[,n2]...) WITHIN GROUP (ORDER BY col1 [desc|asc] [nulls first|last] [,col2 [desc|asc] [nulls first|last]]...) 计算指定值在记录集中的排序值。函数的参值必须一一对应group中的列,并且二者数据类型应该一致。至于order by子句中的nulls first|last则是用来设置记录集中值为null的列的排序在前或在后。

例如:计算数值100在记录集中的排序值。

SELECT dense_rank(100) within group( order by value) FROM tmp1

 

4、RANK() 参数及形式完全与上同,二区最大的区别是:RANK函数在处理指定数值在记录集中的排序值时,如果值有重复,则后面的排序值会跳过这个值,直接从当前排序值+重复记录数开始,而DENSE_RANK则不会,排序值依然是个连续的序列。提到这个,在后面讲分析函数讲到row_number()时大家会又发现不同,先刨个坑,后面再填。

例如:
      
insert into tmp1 values ('test2',120);

SELECT dense_rank(121) within group( order by value) FROM tmp1;

SELECT rank(121) within group( order by value) FROM tmp1;

 

5、FIRST() 此函数格式描述看起来极复杂无比,其实也确实复杂无比。其本质是从DENSE_RANK返回的集合中取出排在第一的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录,功能与FIRST_VALUE相同。

例如:

SELECT col,

       MIN(value) KEEP(DENSE_RANK FIRST ORDER BY col) "Min Value",

       MAX(value) KEEP(DENSE_RANK LAST ORDER BY col) "Max Value"

 FROM tmp1

 GROUP BY col

 

6、LAST 形式参数等均与上同,不过就是把FIRST换成LAST即可。FIRST是取第一行,LAST则是取最后一行。

例如:

 

7、MAX([distinct|all] col) 取同组序列数据集中最大值。

例如:

SELECT col, MAX(value) "Max Value", MIN(value) "Min Value"

 FROM tmp1

 GROUP BY col

 

8、MIN([distinct|all] col) 取同组序列数据集中最小值。形式参数均与上同,不详述

例如:

SELECT col, MAX(value) "Max Value", MIN(value) "Min Value"

 FROM tmp1

 GROUP BY col

 

9、SUM([distinct|all] col) 取指定列所在分组序列的值的和并返回。

例如:SELECT col, SUM(value) "Sum Value" FROM tmp1 GROUP BY col

 

10、GROUPING(col) cuberollup子句的辅助函数,并且必须配合cuberollup才能使用。用来确定当前记录行是否是由cuberollup生成,如果是则返回1,不则返回0

例如:

SELECT col, sum(value), grouping(value)

 FROM tmp1

 GROUP BY rollup(col, value)

 

 

ORACLE函数介绍

第四篇非著名函数之聚合函数

注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式。

  聚合函数可被用于select,order by以及having子句中。其运算可以基于group by的结果,也可以直接对所有记录进行运算。当然,这种类型语句相信大家平常也用的比较多,概念性的就不多介绍了,有一点需要注意的是,除了countgrouping之后,其它的统计运算均会忽略值为null的列。

  注意,多数聚合函数都支持DISTINCT子句(distinct是什么?过滤记录集中重复记录用的),如果不指定则默认针对所有计录,举个最简单的例子:select count(col),count(distinct col) from tmp1

  本类函数中部分函数同时也属于分析函数。其做为分析函数时的具体用法将会在后面章节介绍,本节不做描述。

l         CUME_DIST(expr[,expr]...) WITHIN GROUP

 (ORDER BY

    expr [DESC | ASC] [NULLS {FIRST | LAST}]

      [,expr [DESC | ASC] [NULLS {FIRST | LAST}]]...)非常有意思的一个函数。查询指定数值在指定分组序列中的相对位置,返回值是介于 0 1 之间的小数值。我们后面还会再讲几个相关的函数,均是实现类型功能,只是值的表现形式不同。

例如:SELECT CUME_DIST(120) WITHIN GROUP (ORDER BY value) FROM TMP1

 

l         GROUP_ID() 该函数必须配合group by子句使用。主要是用来区分group by 生成的记录集中是否是被重复生成的记录,如果该条记录是则返回1,否则返回0

例如:SELECT t.col, group_id() FROM TMP1 t GROUP BY col, ROLLUP(col)

 

l         PERCENT_RANK ( expr [, expr]... ) WITHIN GROUP

( ORDER BY

 expr [ DESC | ASC ] [NULLS { FIRST | LAST }]

 [, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...)本函数语法及形式与cume_dist非常相似,也是返回指定数据在指定分组序列中所占的相对位置,不过与cume_dist不同的是。不管指定值与分组序列中某值是否重复,均将此值视为序列一部分,而cume_dist则不同。如果指定值与分组序列中某值重复,则将二值视为一个值处理(上帝保佑,但愿俺讲明白了,废话不说,大家通过示例来理解吧)

例如:SELECT PERCENT_RANK(120) WITHIN GROUP( ORDER BY value) FROM TMP1

 

l         PERCENTILE_CONT(n) WITHIN GROUP (ORDER BY col [DESC|ASC]) 根据输入值返回该值对应的分组序列中数值。输入值应该是介于01之间。原因请参照前面的PERCENT_RANK函数。

如果分组序列中没有存在对应值的话,会根据如下规则来计算返回值:

 if (CRN = FRN = RN) then

    (value of expression from row at RN)

 else

    (CRN - RN) * (value of expression for row at FRN) +

    (RN - FRN) * (value of expression for row at CRN)

 

例如:

SELECT col, max(value), min(value), sum(value),

 PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY value) a,

 PERCENTILE_CONT(0.8) WITHIN GROUP(ORDER BY value) b

 FROM TMP1

 group by col;

 

l         PERCENTILE_DISC(n) WITHIN GROUP (ORDER BY col [DESC|ASC]) 语法与形式与上例相同,不过在计算方法上略有差异。如果分组序列中没有对应值的话,那么将会返回该序列中最近最大的一个值。

 

相对而言,我认为某些情况下本函数被应用的机率还是相当大地,起码比上述几个函数的应用范围会广。

 

例如:

SELECT col, max(value), min(value),

 PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY value) a,

 PERCENTILE_DISC(0.8) WITHIN GROUP(ORDER BY value) b

 FROM TMP1

 group by col;

 

l         STDDEV([DISTINCT|ALL] n) 该函数返回样本的标准偏差。

例如:SELECT col, STDDEV(value) FROM TMP1 GROUP BY col;

 

l         STDDEV_SAMP(n) 语法与形式与上同,其与STDDEV函数最大的区别是,如果该分组序列只有一行的话,则STDDEV_SAMP函数返回空值,而STDDEV则返回0

例如:SELECT col, STDDEV(value),STDDEV_SAMP(value) FROM TMP1 GROUP BY col;

 

l         STDDEV_POP(n) 返回该分组序列总体标准偏差。

例如:SELECT col, STDDEV_POP(value) FROM TMP1 GROUP BY col;

 

l         VAR_POP(n) 该函数返回分组序列的总体方差,VAR_POP进行如下计算:(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)

例如:SELECT col, VAR_POP(value) FROM TMP1 GROUP BY col;

 

l         VAR_SAMP(n) 与上类似,该函数返回分组序列的样本方差,,其计算公式为:(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / (COUNT(expr) - 1)

例如:SELECT col, VAR_POP(value),VAR_SAMP(value) FROM TMP1 GROUP BY col;

 

l         VARIANCE(n) 该函数返回分组序列方差,Oracle计算该变量如下:

如果表达式中行数为1,则返回0,如果表达式中行数大于1,则返回VAR_SAMP

例如:SELECT col, VAR_SAMP(value),VARIANCE(value) FROM TMP1 GROUP BY col;

 

 

ORACLE函数介绍

第五篇分析函数简述

注:N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略,fmt表示格式。

  分析函数计算基于group by的列,分组查询出的行被称为"比照(window)",在根据over()执行过程中,针对每一行都会重新定义比照。比照为"当前行(current row)"确定执行计算的行的范围。这点一定要理解清楚。它是分析函数生成数据的原理。如果此处模糊,那么你在应用分析函数时恐就不会那么得心应手了。

  分析函数与前面章节中讲到的聚合函数非常相似,不同于聚合函数的地方在于它们每个分组序列均返回多行。在本节示例中会同时应用两种函数做对比,以更好体现二者的差异。通过本章节练习相信大家就会注意到,部分聚合函数和分析函数是同一个命令,事实确实如此。如果从语法格式上区分的话,没加over()的即是聚合函数,加了over()即是分析函数:)

  有一点需要注意哟,除了order by子句的运算外,分析函数在SQL语句中将会最后执行。因此,分析函数只能应用于select的列或order by子句中(记住喽,千万别扔到什么wheregroup byhaving之类的地方了)。也正因此,同名的函数在做为聚合函数和分析函数时得出的结果可能不相同,就是因为此处运算逻辑不同造成的。

  同时,部分分析函数在选择列时支持distinct,如果你指定了该参数,则over条件中就只能指定partition子句,而不能再指定order by 子句了。

  分析函数的语法结构比较复杂,但多数函数都具有相同的语法结构,所以先在之前进行统一介绍,后续单个函数介绍时就不过多说明函数语法结构了。

  基本上所有的分析函数均是这种格式:

  函数名称 ([参数]) OVER (analytic_clause)

analytic_clause包含:[partition 子句][ order 子句 [window子句]]

l         Partition 子句:Partition by exp1[ ,exp2]...

Partition没啥说的,功能强大参数少,主要用于分组,可以理解成select中的group by。不过它跟select语句后跟的group by 子句并不冲突。

 

l         Order子句:Order by exp1[asc|desc] [ ,exp2 [asc|desc]]... [nulls first|last]。部分函数支持window子句。

Order by的参数基本与select中的order by相同。大家按那个理解就是了。Nulls first|last是用来限定nulls在分组序列中的所在位置的,我们知道oracle中对于null的定义是未知,所以默认ordery的时候nulls总会被排在最前面。如果想控制值为null的列的话呢,nulls first|last参数就能派上用场了。

 

l         Window子句:En,贴个图吧

 

         看起来复杂其实简单,而且应用的机率相当的低,不详细介绍了。

 

 

ORACLE函数介绍

第六篇著名函数之分析函数

l         AVG([DISTINCT|ALL] expr) OVER(analytic_clause) 计算平均值。

例如:

--聚合函数

SELECT col, AVG(value) FROM tmp1 GROUP BY col ORDER BY col;

--分析函数

SELECT col, AVG(value) OVER(PARTITION BY col ORDER BY col)

 FROM tmp1

 ORDER BY col;

 

l         SUM ( [ DISTINCT | ALL ] expr ) OVER ( analytic_clause )

例如:

--聚合函数

SELECT col, sum(value) FROM tmp1 GROUP BY col ORDER BY col;

--分析函数

SELECT col, sum(value) OVER(PARTITION BY col ORDER BY col)

 FROM tmp1

 ORDER BY col;

 

l         COUNT({* | [DISTINCT | ALL] expr}) OVER (analytic_clause) 查询分组序列中各组行数。

例如:

--分组查询col的数量

SELECT col,count(0) over(partition by col order by col) ct FROM tmp1;

 

l         FIRST() DENSE_RANK返回的集合中取出排在第一的行。

例如:

--聚合函数

SELECT col,

       MIN(value) KEEP(DENSE_RANK FIRST ORDER BY col) "Min Value",

       MAX(value) KEEP(DENSE_RANK LAST ORDER BY col) "Max Value"

 FROM tmp1

 GROUP BY col;

--分析函数

SELECT col,

       MIN(value) KEEP(DENSE_RANK FIRST ORDER BY col) OVER(PARTITION BY col),

       MAX(value) KEEP(DENSE_RANK LAST ORDER BY col) OVER(PARTITION BY col)

 FROM tmp1

 ORDER BY col;

可以看到二者结果基本相似,但是ex1的结果是group by后的列,而ex2则是每一行都有返回。

 

l         LAST()与上同,不详述。

例如:见上例。

 

l         FIRST_VALUE (col) OVER ( analytic_clause ) 返回over()条件查询出的第一条记录

例如:

insert into tmp1 values ('test6','287');

SELECT col,

       FIRST_VALUE(value) over(partition by col order by value) "First",

       LAST_VALUE(value) over(partition by col order by value) "Last"

 FROM tmp1;

 

l         LAST_VALUE (col) OVER ( analytic_clause ) 返回over()条件查询出的最后一条记录

例如:见上例。

 

l         LAG(col[,n][,n]) over([partition_clause] order_by_clause) lag是一个相当有意思的函数,其功能是返回指定列coln1行的值(如果前n1行已经超出比照范围,则返回n2,如不指定n2则默认返回null),如不指定n1,其默认值为1

例如:

SELECT col,

       value,

       LAG(value) over(order by value) "Lag",

       LEAD(value) over(order by value) "Lead"

 FROM tmp1;

 

l         LEAD(col[,n][,n]) over([partition_clause] order_by_clause) 与上函数正好相反,本函数返回指定列coln1行的值。

例如:见上例

 

l         MAX (col) OVER (analytic_clause) 获取分组序列中的最大值。

例如:

--聚合函数

SELECT col,

      Max(value) "Max",

       Min(value) "Min"

 FROM tmp1

 GROUP BY col;

--分析函数

SELECT col,

       value,

       Max(value) over(partition by col order by value) "Max",

       Min(value) over(partition by col order by value) "Min"

 FROM tmp1;

l         MIN (col) OVER (analytic_clause) 获取分组序列中的最小值。

例如:见上例。

 

l         RANK() OVER([partition_clause] order_by_clause) 关于RANKDENSE_RANK前面聚合函数处介绍过了,这里不废话不,大概直接看示例吧。

例如:

insert into tmp1 values ('test2',120);

SELECT col,

       value,

       RANK() OVER(order by value) "RANK",

       DENSE_RANK() OVER(order by value) "DENSE_RANK",

       ROW_NUMBER() OVER(order by value) "ROW_NUMBER"

 FROM tmp1;

 

l         DENSE_RANK () OVER([partition_clause] order_by_clause)

例如:见上例。

 

l         ROW_NUMBER () OVER([partition_clause] order_by_clause) 这个函数需要多说两句,通过上述的对比相信大家应该已经能够看出些端倪。前面讲过,dense_rank在做排序时如果遇到列有重复值,则重复值所在行的序列值相同,而其后的序列值依旧递增,rank则是重复值所在行的序列值相同,但其后的序列值从+重复行数开始递增,而row_number则不管是否有重复行,(分组内)序列值始终递增

例如:见上例。

 

 

ORACLE函数介绍

第七篇非著名函数之分析函数

l         CUME_DIST() OVER([partition_clause] order_by_clause) 返回该行在分组序列中的相对位置,返回值介于01之间。注意哟,如果order by的列是desc,则该分组内最大的行返回列值1,如果order byasc,则该分组内最小的行返回列值1

例如:SELECT col, value, CUME_DIST() OVER(ORDER BY value DESC) FROM tmp1;

 

l         NTILE(n) OVER([partition_clause] order_by_clause) 

ntile是个很有意思的统计函数。它会按照你指定的组数(n)对记录做分组

例如:SELECT t.*,ntile(5) over(order by value desc) FROM tmp1 t;

 

l         PERCENT_RANK() OVER([partition_clause] order_by_clause) CUME_DIST类似,本函数返回分组序列中各行在分组序列的相对位置。其返回值也是介于01之间,不过其起始值始终为0而终结值始终为1

例如:SELECT col, value, PERCENT_RANK() OVER(ORDER BY value) FROM tmp1;

 

l         PERCENTILE_CONT(n) WITHIN GROUP (ORDER BY col [DESC|ASC]) OVER(partition_clause)

本函数功能与前面聚合函数处介绍的完全相同,只是一个是聚合函数,一个是分析函数。

例如:

--聚合函数

SELECT col, max(value), min(value), sum(value),

       PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY value) a,

       PERCENTILE_CONT(0.8) WITHIN GROUP(ORDER BY value) b

 FROM TMP1

 group by col;

--分析函数

SELECT col,

       value,

       sum(value) over(partition by col) "Sum",

       PERCENTILE_CONT(0.5) WITHIN GROUP( ORDER BY value) OVER(PARTITION BY col) "CONTa",

       PERCENTILE_CONT(0.8) WITHIN GROUP( ORDER BY value) OVER(PARTITION BY col) "CONTb"

 FROM TMP1;

 

l         PERCENTILE_DISC(n) WITHIN GROUP (ORDER BY col [DESC|ASC]) OVER(partition_clause)

本函数功能与前面聚合函数处介绍的完全相同,只是一个是聚合函数,一个是分析函数。

例如:

--聚合函数

SELECT col, max(value), min(value), sum(value),

       PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY value) a,

       PERCENTILE_DISC(0.8) WITHIN GROUP(ORDER BY value) b

 FROM TMP1

 group by col;

--分析函数

SELECT col,

       value,

       sum(value) over(partition by col) "Sum",

       PERCENTILE_DISC(0.5) WITHIN GROUP( ORDER BY value) OVER(PARTITION BY col) "CONTa",

       PERCENTILE_DISC(0.8) WITHIN GROUP( ORDER BY value) OVER(PARTITION BY col) "CONTb"

 FROM TMP1;

 

l         RATIO_TO_REPORT(col) over ([partition_clause]) 本函数计算本行col列值在该分组序列sum(col)中所占比率。如果col列为空,则返回空值。

例如:

SELECT col, value,

       RATIO_TO_REPORT(value) OVER(PARTITION BY col) "RATIO_TO_REPORT"

 FROM TMP1

 

l         STDDEV ([distinct|all] col) OVER (analytic_clause) 返回列的标准偏差。

例如:

--聚合函数

SELECT col, STDDEV(value) FROM TMP1 GROUP BY col;

--分析函数

SELECT col, value,

       STDDEV(value) OVER(PARTITION BY col ORDER BY value) "STDDEV"

 FROM TMP1;

 

l         STDDEV_SAMP(col) OVER (analytic_clause) 功能与上相同,与STDDEV不同地方在于如果该分组序列只有一行的话,则STDDEV_SAMP函数返回空值,而STDDEV则返回0

例如:

--聚合函数

SELECT col, STDDEV(value),STDDEV_SAMP(value) FROM TMP1 GROUP BY col;

--分析函数

SELECT col, value,

       STDDEV(value) OVER(PARTITION BY col ORDER BY value) "STDDEV",

       STDDEV_SAMP(value) OVER(PARTITION BY col ORDER BY value) "STDDEV_SAMP"

 FROM TMP1;

 

l         STDDEV_POP(col) OVER (analytic_clause) 返回该分组序列总体标准偏差

例如:

--聚合函数

SELECT col, STDDEV_POP(value) FROM TMP1 GROUP BY col;

--分析函数

SELECT col, value,

       STDDEV_POP(value) OVER(PARTITION BY col ORDER BY value) "STDDEV_POP"

 FROM TMP1;

 

l         VAR_POP(col) OVER (analytic_clause) 返回分组序列的总体方差,VAR_POP进行如下计算:(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)

例如:

--聚合函数

SELECT col, VAR_POP(value) FROM TMP1 GROUP BY col;

--分析函数

SELECT col, value,

       VAR_POP(value) OVER(PARTITION BY col ORDER BY value) "VAR_POP"

 FROM TMP1;

 

l         VAR_SAMP(col) OVER (analytic_clause) 与上类似,该函数返回分组序列的样本方差,,其计算公式为:(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / (COUNT(expr) - 1)

例如:

--聚合函数

SELECT col, VAR_SAMP(value) FROM TMP1 GROUP BY col;

--分析函数

SELECT col, value,

       VAR_SAMP(value) OVER(PARTITION BY col ORDER BY value) "VAR_SAMP"

 FROM TMP1;

 

l         VARIANCE(col) OVER (analytic_clause) 该函数返回分组序列方差,Oracle计算该变量如下:

如果表达式中行数为1,则返回0,如果表达式中行数大于1,则返回VAR_SAMP

例如:

--聚合函数

SELECT col, VAR_SAMP(value),VARIANCE(value) FROM TMP1 GROUP BY col;

--分析函数

SELECT col, value,

       VAR_SAMP(value) OVER(PARTITION BY col ORDER BY value) "VAR_SAMP",

       VARIANCE(value) OVER(PARTITION BY col ORDER BY value) "VARIANCE"

 FROM TMP1;

 

 

ORACLE函数介绍

第八篇综述  

  通过前面章节的练习我们可以对三类函数特征做些描述。

l         单值函数多数处理单个或多个值但只返回单个值(SYS_CONNECT_BY_PATH除外)

l         聚合函数多数处理多行并且各分组序列分别返回成一行。

l         分析函数多数处理多行并且每条记录均会有返回。

  需要注意不同类型函数可被应用的范围。

13、单值函数可应用范围最为广泛,select语句中的每一处都可被嵌入。

14、聚合函数通常会配合group by被应用于selecthaving子句,

15、分析函数只能应用于selectorder by子句。

  虽然我们前面介绍了百十多个函数,可是仍然并非全部,并且即使是我们介绍到的,也不能说所有函数都已经介绍了其全部的特色,比如:对于substrlengthinstrlike)等均有扩展形式。比如

(七)substr:以字符为单位

(八)substrb:以字节为单位

(九)substrc:unicode完全字符为单位

(十)substr2:UCS2代码点为单位

(十一)substr4:UCS4代码点为单位

  它们对于字符的处理方式都是一致的,只不过在我们看来相同的字符在它们看来可能就不同,这就是不同编码的原因。关于unicode,ucs代码概念介绍可以看看这里:http://www.vscodes.com/article/5/104/2227.html

  Oracle中函数功能强大,分类细致,某些地方构思异常巧妙。

l         参数中的小数点

我们以CEIL为例

SELECT CEIL(12.8) FROM DUAL;

值是什么?

l         负数也有学问

我们先以LPAD函数为例。一个非常简单的补值单值函数。

SELECT LPAD('Let us go!',5,'-') FROM DUAL;

猜猜这个会返回什么值呢?

 

SELECT LPAD('Let us go!',20,'-') FROM DUAL;

猜猜这个又会返回什么值呢?

SELECT LPAD('Let us go!',-5,'-') FROM DUAL;

再猜猜这个会返回什么值呢?

再以SUBSTR为例:

SELECT SUBSTR('Let us go!',-5,5) FROM DUAL;

这个将要返回什么值呢?

 

SELECT SUBSTR('Let us go!',-5,-5) FROM DUAL;

这个又将会返回什么值呢?

 

l         小心隐藏参

我们仍然以LPAD为例:

SELECT LPAD('Let us go!',20) FROM DUAL;

猜猜这个返回什么值呢?

SELECT SUBSTR('Let us go!',-5) FROM DUAL;

这个将要返回什么值呢?

SELECT TRUNC(12.8251) FROM DUAL;

这个又将会返回什么值呢?

  诸如此类在oracle的函数中是比比旨是,比如:substr,instr,trim等等~~~~个中奥妙还需个自体会。

Oracle中还提供了一批函数用来操纵xml数据,比如:XMLAGG,XMLCOLATTVAL,XMLCONCAT,XMLFOREST,XMLSEQUENCE,XMLTRANSFORM,EXTRACT(XML),UPDATEXML等,功能强悍,不过演示环境搭建稍嫌复杂,三言二语也说不清楚,我这里就不多做介绍了。感兴趣的话可以查看oracle官方文档或者直接跟我交流。

如果以上种种仍然不能满足你的需求,你还可以通过自己创建function的方式来实现,创建的语法格式非常简单,不属于本章内容就不多做介绍了,如果你想找个示例的话,俺之前写过一个oracle下的邮件发送有相关示例可供你参考,地址如下:http://www.itpub.net/825426.html

  最后补充一句再强大的功能,还是需要能够灵活使用才能够体现其价值,所以了解并不是我们的目地,熟练应用才是我们的目标:)。

 

原文地址:https://www.cnblogs.com/zhahost/p/1428785.html