`
jeelee
  • 浏览: 629669 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle学习笔记(第三章:常用函数)

阅读更多
Avg(num):求平均值
Count(*) :求总数
Sum(num):汇总
Max(x):求最大值,x  :数值型,字符型
Min(x):求最小值,x  :数值型,字符型
Sign(num):正负值,正值返回 1 ,负值返回 -1,0 返回 0
例如:select sign(-100) from dual;查询结果为 -1
Decode(表达式,value1,result1,value2,result,..default)
例如:select decode(sex,’0’,’女’,’1’,’男’,’未知’) from empm;
借助sign()和decode()函数可以比较两个数的大小。例如,比较两个数,返回较大的值:select decode(sign(x-y),-1,y,1,x,0,0) from tab1;

随机函数 dbms_random
关于这些函数及DBMS_RANDOM包的文件都包含在SQLPlus中:
select text   from all_source
where name = 'DBMS_RANDOM'
and type = 'PACKAGE' order by line;
   ◆ TYPE      num_array
   ◆ PROCEDURE terminate
   ◆ PROCEDURE seed
   ◆ PROCEDURE initialize
   ◆ FUNCTION random
   ◆ FUNCTION value RETURN NUMBER;
   ◆ FUNCTION value (low IN NUMBER, high IN NUMBER) RETURN NUMBER;
   ◆ FUNCTION normal RETURN NUMBER;
   ◆ FUNCTION string (opt char, len NUMBER) RETURN VARCHAR2;
   VALUE函数的第一种形式返回一个大于或等于0且小于1的随机数;第二种形式返回一个大于或等于LOW,
   小于HIGH的随机数。下面是其用法的一个示例:
SQL> select dbms_random.value, dbms_random.value(55,100) from dual;
VALUE            DBMS_RANDOM.VALUE(55,100)
--------------------------------------------
0.434982180314862       73.9457320892544

NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有
68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。
最后,是STRING函数。它返回一个长度达60个字符的随机字符串。参数OPT可以是列表2显示的值中的任何一
个单个字符。
e.g:dbms_random.string('a',8)
第一个参数的含义:
'u', 'U' - 返回全是大写的字符串
'l', 'L' - 返回全是小写的字符串
'a', 'A' - 返回大小写结合的字符串
'x', 'X' - 返回全是大写和数字的字符串
'p', 'P' - 返回键盘上出现字符的随机组合
第二个参数表示返回的字符串长度。
select dbms_random.value()  num from dual   -- num[0,1)
select dbms_random.value(10,100)  num from dual  -- num[p1,p2)
SELECT dbms_random.STRING('a',8)FROM dual --大小写混合,长度为 8
SELECT dbms_random.STRING('u',8)FROM dual --全是大写,长度为 8
SELECT dbms_random.STRING('l',8)FROM dual --全是小写,长度为 8
SELECT dbms_random.STRING('x',8)FROM dual --返回全是大写和数字的字符串,长度为 8
SELECT dbms_random.STRING('p',8)FROM dual --返回键盘上出现字符的随机组合,长度为 8
SELECT dbms_random.NORMAL FROM dual;
dbms_random.random 方法
random返回的是BINARY_INTEGER类型值,产生一个任意大小的随机数
与dbms_random.value 的区别举例:
Order By dbms_random.value;
这条语句功能是实现记录的随机排序
另外:
dbms_random.value 和
dbms_random.random 两者之间有什么区别?
1。Order By dbms_random.value ,为结果集的每一行计算一个随机数,dbms_random.value 是结果集的一
个列(虽然这个列并不在select list 中),然后根据该列排序,得到的顺序自然就是随机的啦。
2。看看desc信息便知道vlue和random这两个函数的区别了,value返回的是number类型,并且返回的值介
于1和0之间,而random返回的是BINARY_INTEGER类型(以二进制形式存储的数字,据说运算的效率高于
number但我没测试过,但取值范围肯定小于number,具体限制得查数据了)
如果你要实现随机排序,还是用value函数吧

sys_guid():自动产生一个 序列
例如:select sys_guid() from dual;
upper(c) :转换成大写;
lower(c):转换成小写
initcap(str):将字符串中的每个单词的首字母转换成大写,其余的转换成小写
concat():连接字符串,等价于 || 操作符
substr(str,start,len):截取字符串
Lpad(str,len,str2):在str左边加字符串str,长度为len
例如:select lpad('xx',6,'y') from dual;结果是:yyyyxx
Rpad(str,len,str):在str右边加字符串str,长度为len
Trim(str):将字符串str的左右两边的空格去掉
Trim([ leading | trailing | both ] ‘str1’ from ‘str2’):将字符串str2的前面=边|后边|左右两边的字符str1去掉,默认是both左右两边,如果没有str2则默认是去掉空格
例如:select trim('x' from 'xaaax') from dual;结果为:aaa,select trim(leading 'x' from 'xaaax') from dual;结果为:aaax,select trim(leading  from  ‘      aaax') from dual;结果为:aaax前面的空格去掉了
Ltrim(),Rtrim():表示去掉左边的和右边的字符。
Length(),lengthb():求字符串的长度,其中lengthb()是一字节为单位
例如:Select length(‘汉字’) from dual;结果为2,select lengthb(‘汉字’) from dual;结果为:4
Translate(str1,str2,str3):将字符串str1中的字符串替换为str3,等长度的替换
例如:select translate('abcdeabc','ab','XY') from dual;将abdceabc中的ab替换为XY,注意是等长度的替换,换种写法:select translate('abcdeabc','ab','XYZ’) from dual;意义相同,结果也一样,都是XYcdeXYc不等长度的替换用replace()函数
Replace():将字符串str1中的字符串替换为str3,不等长度的替换
例如:select translate('abcdeabc','ab','XYZ’) from dual;结果为XYZcdeXYZ
Instr(str1,str2,[start] [nth]):在字符串str1中查找str2从start开始找,第nth次出现的位置,如果start,nth省略,表示从第一个位置开始找,第一次出现的位置
例如:select instr('abcdefabcdabcd','a',1,2) from dual;结果为:7
Round(n1,n2):四舍五入法,n2表示保留几位小数,如果省略了n2表示四舍五入保留整数
Trunc(n1,n2):表示无条件的舍弃,n2表示保留几位小数,如果省略了n2表示保留整数
Round(),Trunc() 函数还可以用在日期类型的数据上,
round()函数将该天的时间设置为0点﹐如果该时间是下午之后﹐设置为次日的0点
trunc()函数与round()函数类似﹐只是它将任何时间(包括午夜过后1秒)都设置为0点,这样两日期相减得到整天数
floor(n) 返回小于或等于 n 的 最大整数
ceil(n) 返回大于或等于 n 的 最小整数
mod(1600,300) 求余数
add_months(date,n):增加n 个月
months_between(date1,date2):两个日期相差几个月
next_day(date,n):n表示 1—7,表示周日至周六,函数返回下一个周几的日期
例如:select next_day(sysdate,1) from dual;下一个周一是多少号
Last_day(date):本月最后一天的日期
Chr(c):转换成ASCII值
Ascii(c):将ASCII值转化成CHAR字符
greatest('str1','str2','str3'....):比较一组值的大小,返回最大值,不同于max
Nvl(x,y):对空值替换,如果x是null,则返回y,否则返回x,x,y数据类型要一致
Nvl2(x,y,z) :对空值替换,如果x是null,则返回y,否则返回z,x,y数据类型要一致,x,z数据类型可以不一致
STDDEV():标准差
VARIANCE() :方差
Nullif(表达式1﹐表达式2) Oracle 9i新增函数,意义比较两个表达式如果相等则返回空值(null)﹐不相等返回 表达式1
Coalesce(表达式1﹐表达式2﹐表达式3...表达式n):Oracle 9i新增函数,功能﹕返回第一个不为空的表达式值
例如:select  coalesce(addr,tel1,tel2) from empm;
case 表达式 ﹕Case 表达式 when value1 then valuea when value2 then valueb when value3 then valuec… else valuez;功能与coalesce()函数完全相同
例如:select distinct case emp_nm
when 'lyj' then 'lyjdb'
when 'Lucy' then 'ABC'
when 'Jake' then 'Jake.Lea'
else emp_nm
END AS "姓名"
from empm;
to_char(),to_number(),to_date():数据类型转换函数
to_char():将日期转换成字符,显示格式如下:
年:YYYY , YYY , YY , Y , YEAR , YYYYBC , YYYYB.C.,例如:select to_char(sysdate,’YEAR’) FROM DUAL;其中YYYYBC , YYYYB.C.表示公元,SELECT to_char(SYSDATE,'YYYYB.C.') FROM dual
月:MM,MONTH,fmMM 例如:SELECT to_char(SYSDATE,'fmMM') FROM dual;
日:DDD,DD,D,DAY,DY (DDD、DD可加入fm删除多余空间)例如:SELECT to_char(SYSDATE,'fmDDDDDDDD') FROM dual;
时:hh ,hh12 ,hh24
分:mi
秒:ss
AM,PM 上午,下午
例如:SELECT TO_CHAR(SYSDATE,'yyyy/mm/dd')||to_char(SYSDATE,'AM')||to_char(SYSDATE,'HH12:MI:SS') FROM dual
关于时间的处理:
SELECT SYSDATE  FROM DUAL  取当前系统时间
Select trunc(sysdate) from dual 取当前日期
Select trunc(sysdate,’MM’) from dual 取当前月的第一天
Select trunc(sysdate,’YYYY’) from dual取当年的元旦
Select to_char(sysdate,’ss’) from dual取当前时间秒部分
Select to_char(sysdate,’mi’) from dual取当前时间分钟部分
Select to_char(sysdate,’HH24’) from dual取当前时间秒小时部分
Select to_char(sysdate,’DD’) from dual取当前时间日期部分
Select to_char(sysdate,’MM’) from dual取当前时间月部分
Select to_char(sysdate,’YYYY’) from dual取当前时间年部分
Select to_char(sysdate,’w’) from dual取当前时间是一个月中的第几周(从1日开始算)
Select to_char(sysdate,’ww’) from dual取当前时间是一年中的第几周(从1.1开始算)
Select to_char(sysdate,’iw’) from dual取当前时间是一年中的第几周(按实际日历的)
Select to_char(sysdate,’d’) from dual取当前时间是一周的第几天,从星期天开始,周六结束
Select to_char(sysdate,'day') from dual 取当前日是星期几,和数据库设置的字符集有关,会输出’Tuesday’
Select to_char(sysdate,'ddd') from dual 当前日是一年中的第几天
Select Add_months(sysdate,12) from dual 取一年后的今天
Select sysdate-(sysdate-100) from dual 取两个日期之间的天数
Select (sysdate-(sysdate-100))*1440 from dual 取两个日期之间的分钟数
Select (sysdate-(sysdate-100))*1440*60 from dual 取两个日期之间的秒数
Select months_between(sysdate,sysdate-100) from dual 取两个日期间隔的月份
Select last_day(sysdate) from dual 取当前月的最后天
Select next_day(sysdate,’1’) from dual 取当前日之后第一个星期天,里面的’1’表示取星期日,如果今天正好是星期日,则会显示下一个星期日

Regexp_substr():正则 表达式oracle 10g 函数
例如:SELECT regexp_substr('123-456-7890','-[^-]+-') "regexp_substr" FROM dual;
rollup(),rand(),cube() , 分析函数 ,这三个函数在 9i 以后的版本中可以使用:
cube(col1,col2…):例子如下,同过以下几个例子,可以看出cube()函数的用途
SELECT sex,dept_no,round(AVG(age),2)  FROM empm
GROUP BY sex,dept_no ORDER BY sex,dept_no ;-- 通过 sex , dept_no 统计平均年龄

SELECT sex,dept_no,round(AVG(age),2)  FROM empm
GROUP BY cube(sex),dept_no ORDER BY sex,dept_no ;-- 先通过 sex 统计平均年龄,再通过 dept_no 统计平均年龄

SELECT sex,dept_no,round(AVG(age),2)  FROM empm
GROUP BY cube(sex,dept_no) ORDER BY sex,dept_no ; -- 分别通过 sex,dept_no统计平均年龄

SELECT sex,round(AVG(age),2) FROM empm
GROUP BY sex ORDER BY sex;-- 通过 sex 统计平均年龄

SELECT dept_no,round(AVG(age),2) FROM empm
GROUP BY dept_no ORDER BY dept_no;-- 通过 dept_no 统计平均年龄

从上面的结果中我们很容易发现,每个统计资料所对应的行都会出现null,我们如何来区分到底是根据那个字段做的汇总呢,这时候,oracle的grouping函数就粉墨登场了.如果当前的汇总记录是利用该字段得出的,grouping函数就会返回1,否则返回0,例如:
SELECT decode(grouping(sex),1,'sex') sex,decode(grouping(dept_no),1,'dept') dept,round(AVG(age),2)  FROM empm
GROUP BY cube(sex,dept_no) ORDER BY sex,dept_no ;

SELECT sex,dept_no,round(AVG(age),2)  FROM empm
GROUP BY cube(sex,dept_no) ORDER BY sex,dept_no ;
Cube()函数与rollup() 函数的区别在于: rollup()函数只根据第一个参数汇总,而 cube() 可以根据所有参数汇总,都出现在group by 语句之后;两者用法相同

rank() , dense_rank() , row_number(),percent_rank()
三者的区别在于:rank()如果出现两个相同的数据,那么后面的数据就会直接跳过这个排名,
而dense_rank()则不会,常用该函数进行名次统计,差别更大的是,row_number()哪怕是两个数据完全相同,排名也会不一样,
这个特性在我们想找出对应没个条件的唯一记录的时候又很大用处. percent_rank() 排序后,出现的位置所占百分之几
例子:
Rank():
SELECT emp_no,age, rank() over(ORDER BY age DESC) FROM empm;
SELECT sex,dept_no,round(avg(age)), rank() over(ORDER BY round(avg(age)) DESC) FROM empm
GROUP BY sex,dept_no;
Dense_rank():
SELECT emp_no,age, dense_rank() over(ORDER BY age DESC) FROM empm ;
SELECT sex,dept_no,round(avg(age)), dense_rank() over(ORDER BY round(avg(age)) DESC) FROM empm
GROUP BY sex,dept_no;
Row():
SELECT emp_no,age, row_number() over(ORDER BY age DESC) FROM empm ;
SELECT sex,dept_no,round(avg(age)), row_number() over(ORDER BY round(avg(age)) DESC) FROM empm
GROUP BY sex,dept_no;
Percent_rank():
SELECT emp_no,age, percent_rank() over(ORDER BY age DESC) FROM empm ;
SELECT sex,dept_no,round(avg(age)), percent_rank() over(ORDER BY round(avg(age)) DESC) FROM empm
GROUP BY sex,dept_no;

Lag()和Lead()函数介绍:
Lag(col,n,value):表示col列的前n笔资料,如果没有,则用value显示
SELECT emp_no,dept_no,age,lag(age,2,0) over(PARTITION BY dept_no ORDER BY emp_no) lag_age FROM empm;--前2笔资料
Lead(col,n,value): 表示col列的后n笔资料,如果没有,则用value显示
SELECT emp_no,dept_no,age,lead(age,2,0) over(PARTITION BY dept_no ORDER BY emp_no) lag_age FROM empm;--后2笔资料

Ratio_to_report():函数,每行总数的百分比,格式为:Ratio_to_report(expr) OVER (query_partition_clause)
SELECT sex,dept_no,ratio_to_report(AVG(age)) over(PARTITION BY sex) FROM empm GROUP BY dept_no,sex ORDER BY sex,dept_no;


常用的分析函数如下所列:
row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
lag() over(partition by ... order by ...)
lead() over(partition by ... order by ...)

按性别统计最大年龄和最小年龄
select distinct sex,max(age) over(partition by sex) max_age,min(age) over(partition by sex) min_age from empm;

NLSSORT(),用来进行语言排序
拼音 :
SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_PINYIN_M')
笔划 :
SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_STROKE_M')
部首 :
SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_RADICAL_M')

获得IP:
select sys_context('userenv','ip_address') from dual;
select utl_inaddr.get_host_address from dual;
分享到:
评论

相关推荐

    ORACLE经典学习笔记

    第一章 ORACLE 命令 第二章 ORACLE 卸载 第三章 ORACLE 用户管理 第四章 数据字典 第五章 SQLServer和Oracle的常用函数对比 第六章 SQL 函数

    Oracle 10g 学习笔记

    │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置listener.ora【避免出现ORA-12514错误】.txt │ 贴子树状态存储结构.jpg │ 贴子树状态存储结构.sql │ ├─01...

    韩顺平oracle学习笔记

    韩顺平oracle学习笔记 第0讲:如何学习oracle 一、如何学习oracle Oracle目前最流行的数据库之一,功能强大,性能卓越。学习oracle需要具备一定基础: 1.学习过一门编程语言(如:java ,c) 2.最好学习过一门别的...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    Java/JavaEE 学习笔记

    Oracle学习笔记...............121 前言....................................121 第一章 Selecting Rows.....................124 第二章 Limiting Selected Rows.......127 第三章 Single Row Functions.............

    J2EE学习笔记(J2ee初学者必备手册)

    Oracle学习笔记...............121 前言....121 第一章 Selecting Rows.....................124 第二章 Limiting Selected Rows.......127 第三章 Single Row Functions..........127 第四章 Displaying Data from ...

    炼数成金 课程+教材 Oracle数据库职业直通车-Oracle入门学习教学视频 谭怀远老师.txt

    第3课 Oracle数据库的安装和配置 第4课 Oracle数据库的参数文件,控制文件,数据文件和日志文件 第5课 Oracle体系架构简述 第6课 Oracle数据库的对象(1) 第7课 Oracle数据库的对象(2) 第8课 复杂一些的SQL语句 ...

    Oracle笔记

    第三天 6 简单查询 7 练习题 10 第四天 12 连接查询 12 数据分组 max,min,avg,sum,count 13 Oracle中的多表查询 14 Oracle-SQL-1999语法 16 第五天 17 union,union all,intersect,minus 17 字符函数 18 第六天 19 ...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    丛书名: 学习笔记 出版社:清华大学出版社 ISBN:9787302282082 上架时间:2012-5-9 出版日期:2012 年5月 开本:16开 页码:564 版次:1-1 所属分类:计算机 > 软件与程序设计 > JAVA(J#) > Java 编辑推荐   ...

    oracle数据库笔记

    第三讲 用户、模式和表 24 一. 用户和模式 24 1.模式 24 2.模式对象 24 3.用户 24 (1)创建用户 24 (2)授权 24 (3)删除用户及该模式下对象 26 二. 表 26 1. 数据类型 26 (1)字符型 26 (2)数值型 26 (3)...

    2009达内SQL学习笔记

    大多数SQL实现支持以下类型的函数: 文本处理, 算术运算, 日期和时间, 数值处理。 Null:空值 空值当成无穷大处理,所有空值参与的运算皆为空。 空值与空值并不相等,因为空值不能直接运算。 如:prod_price...

    PL/SQL学习笔记

    第三章 存储过程和函数 什么是过程?所有的pl/sql都叫过程 创建存储过程: create or replace procedure p1 (v1 int ,v2 int)--存储过程的参数列表 as --声明局部变量 begin null; end; 调用过程 1.declare调用 2....

    Java学习笔记-个人整理的

    {3}常用类}{67}{chapter.3} {3.1}Object类}{67}{section.3.1} {3.1.1}\ttfamily toString}{67}{subsection.3.1.1} {3.1.2}\ttfamily equals}{67}{subsection.3.1.2} {3.1.3}\ttfamily hashCode}{68}{subsection...

    程序员考试刷题-java8-ocp-study-notes:跟踪OCPJava8书籍学习指南的存储库

    学习指南后的体验是积极的,并鼓励我继续学习认证的第二部分。 它涵盖了 100% 掌握考试所需的知识,但最重要的是有助于以有效的方式掌握内容。 这个笔记 记下这些笔记是为了帮助我学习本书中涵盖的所有主题,并将...

    ITPUB电子杂志第11期-论坛精华内容选辑

    1.Oracle基本数据类型存储格式浅析 2.一次SQL Tuning引出来的not in , not exists 语句的N种写法 3.REF CURSOR 小结 4.日期转换函数的格式参数大小写规则 5.Oracle数据库字符集问题解析 ...7.oracle常用命令(学习笔记)

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

Global site tag (gtag.js) - Google Analytics