Oracle中常用的函数与表达式.ppt

上传人:汽*** 文档编号:571293381 上传时间:2024-08-09 格式:PPT 页数:70 大小:420.81KB
返回 下载 相关 举报
Oracle中常用的函数与表达式.ppt_第1页
第1页 / 共70页
Oracle中常用的函数与表达式.ppt_第2页
第2页 / 共70页
Oracle中常用的函数与表达式.ppt_第3页
第3页 / 共70页
Oracle中常用的函数与表达式.ppt_第4页
第4页 / 共70页
Oracle中常用的函数与表达式.ppt_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《Oracle中常用的函数与表达式.ppt》由会员分享,可在线阅读,更多相关《Oracle中常用的函数与表达式.ppt(70页珍藏版)》请在金锄头文库上搜索。

1、第第1414章章 OracleOracle中的函数与表达式中的函数与表达式Oracle中提供了大量的内置函数,以处理各种形式的中提供了大量的内置函数,以处理各种形式的运算。这些函数涵盖了字符串运算、数值运算、日期运算等运算。这些函数涵盖了字符串运算、数值运算、日期运算等方面。同样,方面。同样,Oracle允许使用数值运算、逻辑运算等基本的允许使用数值运算、逻辑运算等基本的表达式运算,另外,提供了表达式运算,另外,提供了SQL标准所规定的特殊判式。标准所规定的特殊判式。lOracle中的字符串函数;中的字符串函数;lOracle中的数学函数;中的数学函数;lOracle中的日期函数;中的日期函数

2、;第第1414章章 OracleOracle中的函数与表达式中的函数与表达式lOracle中的聚合函数;中的聚合函数;lOracle中的运算表达式;中的运算表达式;lOracle中的特殊判式;中的特殊判式;lOracle中的高级函数中的高级函数分析函数与窗口函数。分析函数与窗口函数。14.1 Oracle14.1 Oracle中的字符串函数中的字符串函数Oracle提供了丰富的字符串函数,本小节将通过实例提供了丰富的字符串函数,本小节将通过实例讲述讲述Oracle中各字符串函数的使用。中各字符串函数的使用。14.1.1 lpad()14.1.1 lpad()函数函数lpad()函数用于左补全字

3、符串。在某些情况下,预期的函数用于左补全字符串。在某些情况下,预期的字符串为固定长度,而且格式统一,此时可以考虑使用字符串为固定长度,而且格式统一,此时可以考虑使用lpad()函数。例如,深市股票代码都以函数。例如,深市股票代码都以0开头,并且都为开头,并且都为6位,可位,可以利用以利用lpad格式化股票代码,以保证股票代码的格式。格式化股票代码,以保证股票代码的格式。select lpad(21,6,0) stock_code from dual;需要注意的是,当原字符串的长度大于预期长度时,实需要注意的是,当原字符串的长度大于预期长度时,实际进行的是截取字符串操作。际进行的是截取字符串操作

4、。select lpad(1234567,6,0) stock_code from dual;14.1.2 rpad()14.1.2 rpad()函数函数与与lpad()函数相反,函数相反,rpad()函数从右端补齐字符串。函数从右端补齐字符串。select rpad(abc, 10, *) from dual; 注意与说明:注意与说明:lpad()和和rpad()都用于填充字符串,都用于填充字符串,lpad()从左端进行填充,而从左端进行填充,而rpad()从右端进行填充,但是,二者从右端进行填充,但是,二者在最终截取字符串时,都是从左端开始截取。在最终截取字符串时,都是从左端开始截取。se

5、lect rpad(abcdefg, 6, *) from dual;14.1.3 lower()14.1.3 lower()函数函数返回小写字符串返回小写字符串lower()函数用于返回字符串的小写形式。函数用于返回字符串的小写形式。lower()函数函数在查询语句中经常扮演重要角色。例如,对于用户名和密码在查询语句中经常扮演重要角色。例如,对于用户名和密码的校验来说,用户名一般并不区分大小写,用户无论输入了的校验来说,用户名一般并不区分大小写,用户无论输入了大写还是小写形式,都被认为是合法用户。因此,在数据库大写还是小写形式,都被认为是合法用户。因此,在数据库查询时,应该将数据库中用户名与

6、用户输入的用户名进行统查询时,应该将数据库中用户名与用户输入的用户名进行统一。一。select user_id, user_name from t_users where lower(user_name) = lower(Alex);14.1.4 upper()14.1.4 upper()函数函数返回大写字符串返回大写字符串upper()函数用于返回字符串的大写形式。与函数用于返回字符串的大写形式。与lower()函函数类似,数类似,upper()函数也可以用在查询语句中,以统一数据函数也可以用在查询语句中,以统一数据库和查询条件的一致性。库和查询条件的一致性。select user_id,

7、user_name from t_users where upper(user_name) = upper(ALEX);注意与说明:注意与说明:upper()函数和函数和lower()函数只针对英文字函数只针对英文字符其作用,因为只有英文字符才有大小写之分。符其作用,因为只有英文字符才有大小写之分。14.1.5 initcap ()14.1.5 initcap ()函数函数单词首字母大写单词首字母大写initcap()函数将单词的首字母大写。函数将单词的首字母大写。select initcap(big) from dual;需要注意的是,需要注意的是,initcap()函数不能自动识别单词函数

8、不能自动识别单词 select initcap(bigbigtiger) from dual;initcap()函数会将参数中的非单词字符作为单词分隔符函数会将参数中的非单词字符作为单词分隔符select initcap(big_big_tiger) from dual; select initcap(big/big/tiger) from dual; select initcap(big big tiger) from dual; 14.1.6 length()14.1.6 length()函数函数返回字符串长度返回字符串长度length()函数用于返回字符串的长度。函数用于返回字符串的长度

9、。select length(abcd ) from dual;空字符串的长度不是空字符串的长度不是0,而是,而是null。因为空字符串被视。因为空字符串被视作作null,所以,所以,length(null)返回的仍然是返回的仍然是null。select length() from dual;对其其他数据类型,照样可以通过对其其他数据类型,照样可以通过length()函数来获得函数来获得其长度。其长度。length()函数会首先将参数转换为字符串,然后计函数会首先将参数转换为字符串,然后计算其长度。算其长度。select length(12.51) from dual;14.1.7 subst

10、r()14.1.7 substr()函数函数截取字符串截取字符串substr()函数用于截取字符串。该函数可以指定截取的函数用于截取字符串。该函数可以指定截取的起始位置,截取长度,可以实现灵活的截取操作,因此,成起始位置,截取长度,可以实现灵活的截取操作,因此,成为字符串操作中最常用的函数之一。为字符串操作中最常用的函数之一。例如,对于字符串例如,对于字符串“1234567890”,现欲截取自第,现欲截取自第5位位开始的开始的4个字符。个字符。select substr(1234567890, 5, 4) from dual;需要注意的是,需要注意的是,Oracle中字符位置从中字符位置从1开

11、始,而不是像开始,而不是像某些编程语言(如某些编程语言(如Java)那样从)那样从0开始。开始。 如果不指定长度,那么如果不指定长度,那么substr()函数将获取起始位置参函数将获取起始位置参数至字符串结尾处的所有字符。数至字符串结尾处的所有字符。 select substr(1234567890, 5) from dual; 14.1.8 instr()14.1.8 instr()函数函数获得字符串出现的位获得字符串出现的位置置instr()函数用于获得子字符串在父字符串中出现的位置。函数用于获得子字符串在父字符串中出现的位置。select instr(big big tiger, big

12、) from dual;可以指定额外的参数,以命令该函数从指定位置开始搜可以指定额外的参数,以命令该函数从指定位置开始搜索。索。 select instr(big big tiger, big, 2) from dual; 还可以指定出现次数参数,以指定是第几次搜索到子字还可以指定出现次数参数,以指定是第几次搜索到子字符串。符串。select instr(big big tiger, big, 2, 2) from dual;14.1.9 ltrim()14.1.9 ltrim()函数函数删除字符串首部空格删除字符串首部空格ltrim()中的中的l代表代表left。该函数用于删除字符串左端的空

13、。该函数用于删除字符串左端的空白符。白符。select ltrim( abc) from dual; 需要注意的是,空白符不仅仅包括了空格符,还包括需要注意的是,空白符不仅仅包括了空格符,还包括TAB键、回车符和换行符。键、回车符和换行符。14.1.10 rtrim()14.1.10 rtrim()函数函数删除字符串尾部空删除字符串尾部空格格rtrim()中的中的r代表代表right。该函数用于删除字符串右端空。该函数用于删除字符串右端空白符。删除字符串首尾空白符可以结合使用白符。删除字符串首尾空白符可以结合使用ltrm()和和rtrim()函数。函数。select rtrim(ltrim(

14、abc ) from dual;14.1.11 trim()14.1.11 trim()函数函数删除字符串首尾空格删除字符串首尾空格trim()函数可用于删除首尾空格,相当于函数可用于删除首尾空格,相当于ltrim()和和rtrim()的组合。的组合。select trim( abc ) from dual;14.1.12 to_char()14.1.12 to_char()函数函数将其他类型转换将其他类型转换为字符类型为字符类型to_char()函数用于将其他数据类型的数据转换为字符函数用于将其他数据类型的数据转换为字符型,这些类型主要包括数值型、日期型。型,这些类型主要包括数值型、日期型。

15、1. 将数值型转换为字符串将数值型转换为字符串select to_char(120, 99999) result from dual; select to_char(0.96, 9.99) result from dual; select to_char(0.96, 0.00) result from dual; select to_char(5897.098, 999,999,999.000) result from dual; select to_char(5987.098, $999,999,999.000) result from dual;2. 将日期型转换为字符串将日期型转换为字符

16、串select to_char(sysdate, yyyy-mm-dd) result from dual; select to_char(sysdate, YYYY-MON-DD) from dual; 14.1.13 chr()14.1.13 chr()函数函数将将asciiascii码转换为字符码转换为字符串串chr()函数用于将函数用于将ascii码转换为字符串。通过码转换为字符串。通过chr()函数,函数,可以对不宜直接输入的字符进行操作。例如,将回车换行符可以对不宜直接输入的字符进行操作。例如,将回车换行符插入到数据中。插入到数据中。insert into test_data va

17、lues (6, 周林周林|chr(13)|chr(10)|梁军梁军, 20); select * from test_data where id = 6; 14.1.14 translate()14.1.14 translate()函数函数替换字符替换字符translate()函数用于替换字符串。替换的规则类似于翻函数用于替换字符串。替换的规则类似于翻译的过程。译的过程。 select translate(56338, 1234567890, avlihemoqr) result from dual;需要注意的是,当字符不能被成功需要注意的是,当字符不能被成功“翻译翻译”,那么,那么,Ora

18、cle将使用空字符替换它。利用此特性,可以使用将使用空字符替换它。利用此特性,可以使用translate()函数来删除一个含有数字和英文字母的字符串中的所有字函数来删除一个含有数字和英文字母的字符串中的所有字母:母:select translate(21343yuioioizf899dasiwpe58595oda0j098, #abcdefghijklmnopqrstuvwxyz, ) reulst from dual; 14.2 Oracle14.2 Oracle中的数学函数中的数学函数Oracle提供的数学函数可以处理日常使用到的大多数提供的数学函数可以处理日常使用到的大多数数学运算。本小

19、节将讲述数学运算。本小节将讲述Oracle中常用的几种数学函数。中常用的几种数学函数。14.2.1 abs ()14.2.1 abs ()函数函数返回数字的绝对值返回数字的绝对值abs()函数的参数只能是数值型,该参数用于返回参数函数的参数只能是数值型,该参数用于返回参数的绝对值。的绝对值。select abs(-2.1) from dual; 14.2.2 round ()14.2.2 round ()函数函数返回数字的返回数字的“四舍四舍五入五入”值值round()函数用于返回某个数字的四舍五入值。为了使函数用于返回某个数字的四舍五入值。为了使用该函数,除了提供原始值之外,还应提供精确到的

20、位数。用该函数,除了提供原始值之外,还应提供精确到的位数。精确位数可以为正整数、精确位数可以为正整数、0和负整数。和负整数。select round(2745.173, 2) result from dual; 如果不使用第二个参数,那么,相当于使用了参数如果不使用第二个参数,那么,相当于使用了参数0,即精确到整数。即精确到整数。select round(2745.173) result from dual; 如果第二个参数为负数,那么,相当于将数值精确到小如果第二个参数为负数,那么,相当于将数值精确到小数点之前的位数。数点之前的位数。 select round(2745, -1) resul

21、t from dual; 14.2.3 ceil()14.2.3 ceil()函数函数向上取整向上取整ceil()函数只能有一个参数。该函数将参数向上取整,函数只能有一个参数。该函数将参数向上取整,以获得大于等于该参数的最小整数。以获得大于等于该参数的最小整数。select ceil(21.897) result from dual; 需要注意的是该函数针对负数的运算:需要注意的是该函数针对负数的运算: select ceil(-21.897) result from dual; 因为因为ceil()函数返回的是大于等于参数的最小整数,所函数返回的是大于等于参数的最小整数,所以,该函数返回的并

22、非以,该函数返回的并非-22,而是,而是-21。14.2.4 floor()14.2.4 floor()函数函数向下取整向下取整与与ceil函数相反,函数相反,floor()函数用于返回小于等于某个数函数用于返回小于等于某个数值的最大整数。值的最大整数。select floor(21.897) result from dual; select floor(-21.897) result from dual;14.2.5 mod ()14.2.5 mod ()函数函数取模操作取模操作mod()函数有两个参数,第一个参数为被除数,第二个函数有两个参数,第一个参数为被除数,第二个参数为除数。参数为除

23、数。mod()函数的实际功能为获得两数相除之后的函数的实际功能为获得两数相除之后的余数。余数。select mod(5,2) result from dual; 14.2.6 sign()14.2.6 sign()函数函数返回数字的正负性返回数字的正负性sign()函数只有一个参数。该函数将返回参数的正负性。函数只有一个参数。该函数将返回参数的正负性。若返回值为若返回值为1,表示该参数大于,表示该参数大于0;若返回值为;若返回值为-1,表示该参,表示该参数小于数小于0;若返回值为;若返回值为0,表示该参数等于,表示该参数等于0。select sign(8) result from dual;

24、select sign(-8) result from dual; select sign(0) result from dual; sign()函数为判断两个数值的大小关系提供了方便。因函数为判断两个数值的大小关系提供了方便。因为在为在oracle中,利用类似中,利用类似if else的结构来判断两个数值之间的结构来判断两个数值之间的大小关系,并不像编程语言中那样方便,而且极易造成代的大小关系,并不像编程语言中那样方便,而且极易造成代码的复杂化。码的复杂化。14.2.7 sqrt()14.2.7 sqrt()函数函数返回数字的平方根返回数字的平方根sqrt()函数也只有一个参数。该函数用于返

25、回参数的平函数也只有一个参数。该函数用于返回参数的平方根。可以利用方根。可以利用round()函数和函数和sqrt()函数返回某个数值的近函数返回某个数值的近似平方根。似平方根。select round(sqrt(2), 3) result from dual; 14.2.8 power()14.2.8 power()函数函数乘方运算乘方运算power()函数有两个参数。该函数用于实现数值的乘方函数有两个参数。该函数用于实现数值的乘方运算。运算。select power(6, 2) result from dual; 14.2.9 trunc()14.2.9 trunc()函数函数截取数字截取

26、数字trunc()函数用于截取部分数字。其工作机制非常类似函数用于截取部分数字。其工作机制非常类似于于round()函数。与函数。与round()函数不同的是,该函数不对数值函数不同的是,该函数不对数值做四舍五入处理,而是直接截取。做四舍五入处理,而是直接截取。select trunc(2745.173, 2) result from dual; 保留位数的值可以为保留位数的值可以为0,当该参数的值为,当该参数的值为0时,将保留时,将保留到整数。到整数。 select trunc(2745.173) result from dual; 当保留位数小于当保留位数小于0时,表示保留到小数点之前的位

27、数。时,表示保留到小数点之前的位数。 select trunc(2745.173, -1) result from dual; 14.2.10 vsize()14.2.10 vsize()函数函数返回数据的存储空返回数据的存储空间间vsize()函数根据数据库的存储格式,来返回其所占用函数根据数据库的存储格式,来返回其所占用的存储空间的字节数。的存储空间的字节数。select vsize(abc123) from dual; 注意与说明:注意与说明:vsize()函数在返回的是函数在返回的是Oracle实际存储实际存储数据的字节数,在实际开发中使用的几率也较小。读者可以数据的字节数,在实际开发

28、中使用的几率也较小。读者可以不必了解不必了解Oracle本身的存储机制。本身的存储机制。14.2.11 to_number()14.2.11 to_number()函数函数将字符串转换将字符串转换为数值类型为数值类型to_number()函数可以将字符串转换为数值型。函数可以将字符串转换为数值型。select to_number(257.90) result from dual; 需要注意的是,被转换的字符串必须符合数值类型格式。需要注意的是,被转换的字符串必须符合数值类型格式。如果被转换的字符串不符合数值型格式,如果被转换的字符串不符合数值型格式,Oracle将抛出错误将抛出错误提示。提示。

29、select to_number(a) result from dual;14.3 Oracle14.3 Oracle中的日期函数中的日期函数Oracle提供了丰富的日期函数。利用日期函数可以灵提供了丰富的日期函数。利用日期函数可以灵活的对日期进行运算。活的对日期进行运算。14.3.1 to_date()14.3.1 to_date()函数函数将字符串转换为日将字符串转换为日期型期型to_date()函数用于将字符串转换为日期。被转换的字函数用于将字符串转换为日期。被转换的字符串必须符合特定的日期格式。符串必须符合特定的日期格式。select to_date(12/02/09, mm/dd/y

30、y) result from dual; 14.3.2 add_months()14.3.2 add_months()函数函数为日期加上特为日期加上特定月份定月份add_months()函数将为日期添加特定月份,并获得新函数将为日期添加特定月份,并获得新的日期。的日期。select to_char(add_months(sysdate, 2), yyyy-mm-dd) result from dual;14.3.3 last_day()14.3.3 last_day()函数函数返回特定日期所返回特定日期所在月的最后一天在月的最后一天last_day()函数将接受一个日期参数。该函数首先获得函数

31、将接受一个日期参数。该函数首先获得日期参数所在月的信息,然后获得该月最后一天的日期。日期参数所在月的信息,然后获得该月最后一天的日期。select to_char(last_day(sysdate), yyyy-mm-dd) result from dual;可以综合利用可以综合利用add_months()函数来获得若干月之后的函数来获得若干月之后的月份的最后一天。月份的最后一天。 select to_char(last_day(add_months(sysdate, 3), yyyy-mm-dd) result from dual;14.3.4 months_between ()14.3.4

32、 months_between ()函数函数返回两个返回两个日期所差的月数日期所差的月数months_between()函数用于获取两个日期所间隔的月函数用于获取两个日期所间隔的月数。该函数的返回值是一个实数。数。该函数的返回值是一个实数。select months_between(sysdate, to_date(2009-02-08, yyyy-mm-dd) result from dual;当第一个日期早于第二个日期,那么返回值将是负值。当第一个日期早于第二个日期,那么返回值将是负值。select months_between(to_date(2009-02-08, yyyy-mm-dd

33、), to_date(2009-03-08, yyyy-mm-dd) result from dual; 14.3.5 current_date()14.3.5 current_date()函数函数返回当前会返回当前会话时区的当前日期话时区的当前日期current_date()函数用于返回当前会话时区的当前日期。函数用于返回当前会话时区的当前日期。select sessiontimezone, to_char(current_date, yyyy-mm-dd hh:mi:ss) result from dual; 注意与说明:注意与说明:current_date等无参数函数作为等无参数函数作为

34、Oracle的关键字存在。在使用时,不能为其添加小括号。即的关键字存在。在使用时,不能为其添加小括号。即select current_date() from dual是错误的是错误的SQL语句。语句。14.3.6 current_timestamp()14.3.6 current_timestamp()函数函数返回当返回当前会话时区的当前时间戳前会话时区的当前时间戳current_timestamp()函数用于返回当前会话时的区时函数用于返回当前会话时的区时间戳。可以结合间戳。可以结合sessiontimezone来查看其用法。来查看其用法。select sessiontimezone, cu

35、rrent_timestamp from dual;14.3.7 extract()14.3.7 extract()函数函数返回日期的某个域返回日期的某个域日期由若干域组成,例如年、月、日、小时等等。日期由若干域组成,例如年、月、日、小时等等。extract()函数可以返回这些域的具体值。为了使用该函数,除了要函数可以返回这些域的具体值。为了使用该函数,除了要指定原日期外,还应该指定要返回的域名。指定原日期外,还应该指定要返回的域名。select extract(year from sysdate) result from dual;需要注意的是,需要注意的是,year、month、day域只

36、能从日期(如域只能从日期(如sysdate)中获得,而)中获得,而hour、minute、second只能从时间只能从时间型(如型(如systimestamp)中获得。)中获得。 14.4 Oracle14.4 Oracle中的聚合函数中的聚合函数所谓聚合函数是指针对多条记录的函数。所谓聚合函数是指针对多条记录的函数。Oracle最常最常用的聚合函数包括,用的聚合函数包括,max()、min()、avg()、sum()和和count()函数。本节将讲述这些函数的用法。函数。本节将讲述这些函数的用法。14.4.1 max()14.4.1 max()函数函数求最大值求最大值max()函数用于获得记

37、录集在某列的最大值。例如,为函数用于获得记录集在某列的最大值。例如,为了返回员工最高工资,可以利用了返回员工最高工资,可以利用max()函数。函数。select max(salary) max_salary from t_salary; 需要注意的是,聚合函数往往是返回记录集的统计值,需要注意的是,聚合函数往往是返回记录集的统计值,因此,不能与其中的单条记录同时出现。例如,不能将因此,不能与其中的单条记录同时出现。例如,不能将max(salary)与具体列一起查询。与具体列一起查询。select employee_id, max(salary) max_salary from t_salary

38、; select distinct e.employee_name, s.salary from t_employees e, t_salary swhere e.employee_id = s.employee_id and s.salary = (select max(salary) from t_salary)14.4.2 min()14.4.2 min()函数函数求最小值求最小值min()函数可以用来获得记录集在某列上的最小值,其函数可以用来获得记录集在某列上的最小值,其功能与功能与max()函数相反。函数相反。select distinct e.employee_name, s.sa

39、lary from t_employees e, t_salary swhere e.employee_id = s.employee_id and s.salary = (select min(salary) from t_salary)14.4.3 avg()14.4.3 avg()函数函数求平均值求平均值avg()函数用于获得记录集在某列上的平均值。函数用于获得记录集在某列上的平均值。select e.employee_name, avg(salary)from t_employees e, t_salary swhere e.employee_id = s.employee_idgro

40、up by e.employee_id, e.employee_name14.4.4 sum()14.4.4 sum()函数函数求和求和sum()函数用于获得结果集上某列值的和。函数用于获得结果集上某列值的和。select e.employee_name, sum(salary)from t_employees e, t_salary swhere e.employee_id = s.employee_idgroup by e.employee_id, e.employee_name14.4.5 count()14.4.5 count()函数函数获得记录数获得记录数count()函数的作用对象

41、同样为记录集。与其他聚合函函数的作用对象同样为记录集。与其他聚合函数不同的是,数不同的是,count()函数可以有三种方式来进行计数:函数可以有三种方式来进行计数:count(*)计算行数、计算行数、count(column)计算某列和计算某列和count(1)累加累加1。insert into t_employees values (16, null, null,null);select count(*) from t_employees; select count(employee_id) from t_employees;select count(employee_name) from

42、t_employees;select count(1) from t_employees; 一般来说,利用一般来说,利用count(1)进行计数的速度最快,但是特进行计数的速度最快,但是特别注意的是,预期的结果是针对整行数据,还是某列的数据。别注意的是,预期的结果是针对整行数据,还是某列的数据。14.5 Oracle14.5 Oracle中的其他函数中的其他函数除了数值函数、字符串函数、日期函数和聚合函数外,除了数值函数、字符串函数、日期函数和聚合函数外,Oracle还提供了其他功能性更强的函数。本节将介绍还提供了其他功能性更强的函数。本节将介绍decode()、nvl()和和cast()函数

43、。函数。14.5.1 decode()14.5.1 decode()函数函数多值判断多值判断decode()函数用于多值判断。其执行过程类似于解码函数用于多值判断。其执行过程类似于解码操作。该函数最常见的应用为,实现类似操作。该函数最常见的应用为,实现类似if else的功能。例的功能。例如,可以利用如,可以利用decode()函数为员工工资添加标识,工资大于函数为员工工资添加标识,工资大于6000者为高收入,其余的为一般收入。者为高收入,其余的为一般收入。select e.employee_id, e.employee_name, decode(sign(avg(s.salary) - 60

44、00),1, 高收入高收入, 一般收入一般收入) incommingfrom t_employees e, t_salary swhere e.employee_id = s.employee_idgroup by e.employee_id, e.employee_name 14.5.2 nvl()14.5.2 nvl()函数函数为空值重新赋值为空值重新赋值nvl()函数用于处理某列的值。该函数有两个参数,第函数用于处理某列的值。该函数有两个参数,第一个参数为要处理的列。如果其值为空,则返回第二个参数一个参数为要处理的列。如果其值为空,则返回第二个参数的值,否则,将返回列值。的值,否则,将返

45、回列值。select employee_id, nvl(employee_name, 未知未知) employee_name from t_employees;nvl()函数更常见的用途为判断数值是否为空。因为函数更常见的用途为判断数值是否为空。因为sum()等函数往往会返回等函数往往会返回null,例如,表示汇率的列一旦为,例如,表示汇率的列一旦为null,那么最终的货币结算额度也为那么最终的货币结算额度也为null,所以,必须对汇率列进,所以,必须对汇率列进行行nvl()的处理。在统计员工工资时,的处理。在统计员工工资时,null同样是不受欢迎的同样是不受欢迎的结果,那么可以利用结果,那么

46、可以利用nvl()函数进行处理。函数进行处理。select e.employee_id, nvl(e.employee_name, 未知未知) employee_name, nvl(sum(s.salary), 0) salaryfrom t_employees e, t_salary swhere e.employee_id = s.employee_id(+)group by e.employee_id, e.employee_name14.5.3 cast()14.5.3 cast()函数函数强制转换数据类型强制转换数据类型cast()函数用于强制转换数据类型。函数用于强制转换数据类型。

47、Oracle会根据操作符来会根据操作符来自动进行数据类型的转换,例如:自动进行数据类型的转换,例如:select 123 + 200 result from dual;Oracle会根据运算符会根据运算符“+”将将123转换为数值型转换为数值型123。 select 123 | 200 result from dual;Oracle会根据运算符会根据运算符“|”将数字将数字200转换为字符串转换为字符串200。 cast()函数最常用的场景是转换列的数据类型,以创建新表函数最常用的场景是转换列的数据类型,以创建新表create table tmp_salary asselect cast(sa

48、lary_id as varchar2(20) salary_id, cast(employee_id as varchar2(20) employee_id, cast(month as varchar2(20) month, cast(salary as varchar2(20) salaryfrom t_salarydesc tmp_salary; 14.6 Oracle14.6 Oracle中的运算表达式中的运算表达式Oracle中的常用运算包括:数学运算、逻辑运算和按中的常用运算包括:数学运算、逻辑运算和按位运算。本节将通过范例着重讲述这三种运算的常用运算符位运算。本节将通过范例着重

49、讲述这三种运算的常用运算符和运算规则。和运算规则。14.6.1 14.6.1 数学运算数学运算数学运算是最常用的运算方式,数学运算是最常用的运算方式,Oracle中的数学运算符包括:中的数学运算符包括:+、-、*、/,分别代表了加、减、乘除运算。在使用数学运算时,分别代表了加、减、乘除运算。在使用数学运算时,Oracle会自会自动将其他数据类型转换为数值型,然后再参与运算。动将其他数据类型转换为数值型,然后再参与运算。select 5+3 result from dual;select 5-3 result from dual;select 5*2 result from dual;selec

50、t 5/2 result from dual;需要注意的是,任何一种运算符与需要注意的是,任何一种运算符与null的运算结果均为的运算结果均为null。 select 5+null result from dual;select 5-null result from dual;select 5*null result from dual;select 5/null result from dual;14.6.2 14.6.2 逻辑运算逻辑运算Oracle中的逻辑运算包括:中的逻辑运算包括:大于运算,可用于数值型、日期型和字符串类型;:大于运算,可用于数值型、日期型和字符串类型;=:大于等于运算

51、,可用于数值型、日期型和字符串类型;:大于等于运算,可用于数值型、日期型和字符串类型;:小于运算,可用于数值型、日期型和字符串类型;:小于运算,可用于数值型、日期型和字符串类型;=:大于等于运算,可用于数值型、日期型和字符串类型;:大于等于运算,可用于数值型、日期型和字符串类型;=:等于,可用于数值型、日期型和字符串类型;:等于,可用于数值型、日期型和字符串类型;:不等于,可用于数值型、日期型和字符串类型;:不等于,可用于数值型、日期型和字符串类型;!=:与:与用法相同;用法相同;NOT:取反操作;:取反操作;AND:布尔值的与操作;:布尔值的与操作;OR:布尔值的或操作。:布尔值的或操作。1

52、4.6.2 14.6.2 逻辑运算逻辑运算需要注意的是,需要注意的是,Oracle中的逻辑运算符只能作为条件中的逻辑运算符只能作为条件判断,并不返回值。为了查询工资在判断,并不返回值。为了查询工资在5000-7000之间的记录,之间的记录,可以利用逻辑运算符来组合查询条件。可以利用逻辑运算符来组合查询条件。select * from t_salary where salary=5000 and salary=7000; 对于对于null值,需要特别注意的是,无论使用哪种运算符,值,需要特别注意的是,无论使用哪种运算符,结果都会返回结果都会返回null。当比较的结果为。当比较的结果为null,并

53、作为条件出现,并作为条件出现时,时,Oracle都会将其解释为都会将其解释为false。select 1 result from dual where 1=null;select 1 result from dual where 1null; select 1 result from dual where null=null; select 1 result from dual where nullnull;14.6.3 14.6.3 位运算位运算 从从Oracle8i开开始始,系系统统已已经经提提供供了了位位运运算算符符。最最常常用的莫过于用的莫过于bitand运算符。运算符。select

54、bitand(192, 100) result from dual; 14.7 Oracle14.7 Oracle中的特殊判式中的特殊判式除了逻辑运算之外,除了逻辑运算之外,Oracle提供了一些特殊判式。这提供了一些特殊判式。这些判式可以用来生成更加复杂和灵活的查询条件。本节将着些判式可以用来生成更加复杂和灵活的查询条件。本节将着重介绍以下几种判式。重介绍以下几种判式。Between:取值范围。:取值范围。In:集合成员测试。:集合成员测试。Like:模式匹配。:模式匹配。is null:空值判断。:空值判断。all,some,any:数量判断。:数量判断。exists:存在性判断。:存在性

55、判断。14.7.1 between14.7.1 between范围测试范围测试between判式,用于判断某个值是否在另外两个值之间。判式,用于判断某个值是否在另外两个值之间。这些值可以为数值型、字符串和日期型。使用这些值可以为数值型、字符串和日期型。使用betwwen判式判式来获得来获得ID号在号在1-5之间的员工信息。之间的员工信息。select * from t_employees where employee_id between 1 and 5; betwwen判式同样可以应用于字符串和日期型。字符判式同样可以应用于字符串和日期型。字符串是按照字母表的顺序进行比较,而日期型是按照日期

56、的先串是按照字母表的顺序进行比较,而日期型是按照日期的先后顺序进行比较。后顺序进行比较。select * from t_employees where b between b and c;select * from t_employees where b between bc and c; 注意与说明:注意与说明:between判式与判式与=、=的组合是等价关的组合是等价关系。但是,效率上要比后者差。系。但是,效率上要比后者差。14.7.2 in14.7.2 in集合成员测试集合成员测试in用于判断某个值是否一个集合的成员。用于判断某个值是否一个集合的成员。select * from t_em

57、ployees where status in(NEW, ACT); 值得注意的是,值得注意的是,in判式中的集合的成员的数据类型可以判式中的集合的成员的数据类型可以不一致,例如,不一致,例如,select * from t_employees where status in(NEW, ACT, sysdate, 1)中的数据类型包含了字符串、中的数据类型包含了字符串、日期型和数值型。日期型和数值型。14.7.3 like14.7.3 like模式匹配模式匹配like判式的最大特点在于,可以使用通配符。其通常的判式的最大特点在于,可以使用通配符。其通常的应用场景为处理模糊查询。应用场景为处理模

58、糊查询。select * from t_employees where employee_name like 钟钟%; 如果要求字符串中含有原义字符如果要求字符串中含有原义字符“%”,例如,含有百,例如,含有百分比的字符串。那么,分比的字符串。那么,like判式应写作:判式应写作:like 钟钟% escape 。Oracle会首先解释会首先解释escape关键字,并将其后的字符关键字,并将其后的字符“”解释为转义字符。那么在解释为转义字符。那么在“钟钟%”中的中的“%”不再表示不再表示通配符,而是表示原义字符通配符,而是表示原义字符“%”。“_”(下划线)是可用于(下划线)是可用于like判

59、式的另一个通配符,判式的另一个通配符,该通配符表示一个任意的字符。该通配符表示一个任意的字符。14.7.4 is null14.7.4 is null空值判断空值判断在逻辑判断中,对于列值为空的判断,不能使用在逻辑判断中,对于列值为空的判断,不能使用=或者或者。oracle对与空值的判断提供了专门的判式对与空值的判断提供了专门的判式is null。例如,为了获取表例如,为了获取表t_employees中员工信息不全的记录,可中员工信息不全的记录,可以利用如下所示的查询语句。以利用如下所示的查询语句。select * from t_employees where employee_id is n

60、ull or employee_name is null or work_years is null or status is null; 14.7.5 exists14.7.5 exists存在性判断存在性判断in判式用于判断表的列值是否存在于列表(集合)中。判式用于判断表的列值是否存在于列表(集合)中。而而exists判式则可用于判断查询结果集合是否为空。例如,判式则可用于判断查询结果集合是否为空。例如,为了查询出表为了查询出表t_employees所存储的员工信息中,哪些员工所存储的员工信息中,哪些员工存在于工资表中,即可利用存在于工资表中,即可利用exists判式。判式。select

61、* from t_employees e where exists(select * from t_salary where employee_id = e.employee_id);14.7.6 all14.7.6 all,somesome,anyany数量判断数量判断all,some和和any判式的作用对象为记录集合。判式的作用对象为记录集合。all表示,表示,记录集中的所有记录,记录集中的所有记录,some表示其中的一些记录,表示其中的一些记录,any判判式则表示其中的任意记录。例如,在员工工资表式则表示其中的任意记录。例如,在员工工资表t_salary中,中,为了查找高于为了查找高于i

62、d为为4和和5的工资信息,即可使用的工资信息,即可使用all判式。判式。select * from t_salary where employee_id = 4 or employee_id = 5; select * from t_salary where salary all(select distinct salary from t_salary where employee_id = 4 or employee_id = 5); select * from t_salary where salary some(select distinct salary from t_salary w

63、here employee_id = 4 or employee_id = 5); 此时的此时的some判式实际相当于逻辑运算中的判式实际相当于逻辑运算中的or运算,即运算,即salary6000 or salary7000。此时,使用。此时,使用any判式,将返判式,将返回同样的结果。回同样的结果。 14.8 Oracle14.8 Oracle高级函数高级函数分析函数与窗口函分析函数与窗口函数数Oracle中的分析函数具有非常强大的功能。分析函数中的分析函数具有非常强大的功能。分析函数往往与另一类函数往往与另一类函数窗口函数同时使用。窗口函数总是为窗口函数同时使用。窗口函数总是为查询过程中的

64、当前记录提供一个相关记录集,而且随着当前查询过程中的当前记录提供一个相关记录集,而且随着当前记录的推移,相应的记录集也会随之改变,这非常类似于记录的推移,相应的记录集也会随之改变,这非常类似于“滑动窗滑动窗”的概念。分析函数的操作对象即为的概念。分析函数的操作对象即为“滑动窗滑动窗”所指所指定的记录集合。本节将通过实例来讲述分析函数和窗口函数定的记录集合。本节将通过实例来讲述分析函数和窗口函数的使用。的使用。14.8.1 14.8.1 排名排名分析函数中的排名函数可以针对窗口中的记录生成排序分析函数中的排名函数可以针对窗口中的记录生成排序序号。常用的排名函数有序号。常用的排名函数有rank()

65、、dense_rank()和和row_number()。rank()函数用于返回当前记录在窗口函数所指定的记录函数用于返回当前记录在窗口函数所指定的记录集中的排名。集中的排名。rank()函数在排名过程中,具有跳跃的特点。函数在排名过程中,具有跳跃的特点。select * from students; select student_name, rank() over(order by student_age) position from students;select student_name, dense_rank() over(order by student_age) position

66、from students; select student_name, row_number() over(order by student_age) position from students; 14.8.2 14.8.2 分区窗口分区窗口对于窗口函数,利用对于窗口函数,利用partition by关键字可以指定分区窗口。关键字可以指定分区窗口。现欲统计各员工的工资在各自部门的高低情况,则可以利用现欲统计各员工的工资在各自部门的高低情况,则可以利用partition by进行分区,然后利用分析函数对分区内的记录进行统进行分区,然后利用分析函数对分区内的记录进行统计计 select t.*,

67、 dense_rank() over(partition by department order by salary) position from salary t order by t.employee_id另外一种常见需求为,在获得员工工资的同时,也需要部门另外一种常见需求为,在获得员工工资的同时,也需要部门所有员工的工资总额所有员工的工资总额 select t.*,sum(salary) over(partition by department) total_salary,round(avg(salary) over(partition by department) average_sa

68、lary from salary t order by employee_id注意,注意,avg(salary) over(partition by department)是不可是不可分割的一个整体。对于数据表分割的一个整体。对于数据表salary中每条记录都会返回单个值,中每条记录都会返回单个值,因此,当使用因此,当使用round()函数,函数的作用对象应为函数,函数的作用对象应为avg(salary) over(partition by department)这个整体,而不能使用诸如这个整体,而不能使用诸如round(avg(salary) over(partition by depart

69、ment)等形式。另等形式。另外,利用外,利用partition by进行分区之后,当前记录总是处于某个分区进行分区之后,当前记录总是处于某个分区中,此时的窗口即为该分区。中,此时的窗口即为该分区。14.8.3 14.8.3 窗口子句窗口子句对于每条记录,一旦使用了窗口函数,都会为其产生一对于每条记录,一旦使用了窗口函数,都会为其产生一个可操作的记录集合。而对于该记录集,可以使用窗口子句,个可操作的记录集合。而对于该记录集,可以使用窗口子句,来进一步限制窗口范围。常用的窗口子句包括两类:来进一步限制窗口范围。常用的窗口子句包括两类:l利用利用rows子句的行方式进行限制;子句的行方式进行限制;

70、l利用利用range子句的值方式进行限制。子句的值方式进行限制。1.rows子句子句select employee_id, employee_name,sum(salary) over(order by employee_id rows between 1 preceding and 1 following) three_total from salaryrows子句因为和位置相关,因此,在窗口函数中必须子句因为和位置相关,因此,在窗口函数中必须含有排序子句含有排序子句order by。如果未使用。如果未使用order by子句,而直接子句,而直接使用使用rows子句,子句,Oracle将抛出

71、错误提示,将抛出错误提示, 14.8.3 14.8.3 窗口子句窗口子句注意,注意,rows betwwen 1 preceding and 1 following不一定返回不一定返回3条记录。条记录。例如,对于例如,对于employee_id为为1的记录,排序之后,该记录为第一条记录,不存在前的记录,排序之后,该记录为第一条记录,不存在前一条记录,因此只返回两条记录,而求和操作返回的实际为一条记录,因此只返回两条记录,而求和操作返回的实际为employee_id为为1和和2的员工的工资总和的员工的工资总和10500。2. range子句子句range子句按照列值进行窗口的进一步限制。子句按照

72、列值进行窗口的进一步限制。select employee_id, employee_name,count(1) over(partition by department order by salary range between 500 preceding and 500 following) as employee_count from salary order by employee_id3. unbounded和和current row在在rows和和range子句中,除了使用具体的数值来决定窗口的大小之外,还可子句中,除了使用具体的数值来决定窗口的大小之外,还可以使用关键字以使用关键字

73、unbounded和和current row。unbounded可以直接代替数值,表示可以直接代替数值,表示没有任何限制;没有任何限制;current row则直接代表当前行。则直接代表当前行。 14.8.4 14.8.4 主要的分析函数主要的分析函数分析函数作用对象为窗口函数所捕获的记录集,因此,分析函数具分析函数作用对象为窗口函数所捕获的记录集,因此,分析函数具有聚合函数的特点,大多数的聚合函数,如有聚合函数的特点,大多数的聚合函数,如sum()、count()、max()等都等都能作为分析函数出现。能作为分析函数出现。Oracle还提供了专门针对窗口函数的分析函数,本还提供了专门针对窗口

74、函数的分析函数,本小节着重讲述常用的几种小节着重讲述常用的几种fist_value()、last_value()、lag()和和lead()。1fist_value()函数的使用函数的使用select distinct department,first_value(employee_name) over(partition by department order by salary) employee_name,first_value(salary) over(partition by department order by salary) salaryfrom salary2last_val

75、ue()函数的使用函数的使用3lead()函数的使用函数的使用select employee_id, employee_name, salary,lead(employee_name, 1, N/A)over (partition by department order by salary) prev_namefrom salary order by employee_id4lag()函数的使用函数的使用14.9 14.9 本章实例本章实例Oracle虽然内置了很多函数,但是并不能满足日常开虽然内置了很多函数,但是并不能满足日常开发中的应用。此时,需要开发者自定义函数,而内置函数往发中的应用。

76、此时,需要开发者自定义函数,而内置函数往往成为自定函数的基石。往成为自定函数的基石。create or replace function is_date (param varchar2) return varchar2 isval date;begin val := to_date (nvl (param, ), yyyy-mm-dd hh24:mi:ss); return Y;exceptionwhen others then return N;end;select is_date(abc) from dual; select is_date(2009-09-01) from dual; 1

77、4.10 14.10 本章小结本章小结本章通过详尽的实例讲述了本章通过详尽的实例讲述了Oracle中常用的内置函数、中常用的内置函数、表达式以及特殊判式。对于内置函数,特别需要注意的是聚表达式以及特殊判式。对于内置函数,特别需要注意的是聚合函数的使用。聚合函数最常用的场景为分组查询;聚合函合函数的使用。聚合函数最常用的场景为分组查询;聚合函数不能与单条记录的列并列作为查询结果。对于特殊判式,数不能与单条记录的列并列作为查询结果。对于特殊判式,尤其应该注意的是尤其应该注意的是like判式的使用,判式的使用,like判式使用中,通配判式使用中,通配符只有符只有“%”和和“_”两种,要注意通配符和正

78、则表达式的区两种,要注意通配符和正则表达式的区别。别。14.10 14.10 本章小结本章小结在在Oracle高级函数中,重点介绍了分析函数和窗口函高级函数中,重点介绍了分析函数和窗口函数,这两个函数总是结合使用,为数据表中单条记录提供新数,这两个函数总是结合使用,为数据表中单条记录提供新的结果集的方法。对于窗口函数,要重点理解分区和排序的的结果集的方法。对于窗口函数,要重点理解分区和排序的工作流程,尤其需要注意的是,对于排序中,具有相同列值工作流程,尤其需要注意的是,对于排序中,具有相同列值的记录的处理。相较之下,分析函数非常类似于聚合函数,的记录的处理。相较之下,分析函数非常类似于聚合函数,比较容易理解和掌握。在统计和生成复杂报表时,分析函数比较容易理解和掌握。在统计和生成复杂报表时,分析函数和窗口函数有着广泛的应用,尤其对于复杂统计,利用这两和窗口函数有着广泛的应用,尤其对于复杂统计,利用这两种函数往往可以起到事半功倍的效果。种函数往往可以起到事半功倍的效果。14.11 14.11 习题习题1简述简述null作为函数参数时的特点。作为函数参数时的特点。2简述简述like判式的使用方法。判式的使用方法。3简述简述is null判式的意义。判式的意义。4简述窗口函数的特点。简述窗口函数的特点。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号