Oracle数据库4(单行函数)
2018-02-07 18:29
309 查看
单行函数
什么是SQL函数?
函数可以没有参数,但是必须要有返回值。函数的类型
单行函数和多行函数单行函数
①字符函数
大小写控制函数
SQL> select lower('Hello World') 转小写,upper('Hello World') 转大写,initcap('hello world') 首字母大写 2 from dual; 转小写 转大写 首字母大写 hello world HELLO WORLD Hello World
字符控制函数
SQL> --substr(a,b) 从a中,第b位开始取 SQL> select substr('Hello World',4) 子串 from dual; 子串 -------- lo World SQL> --substr(a,b,c) 从a中,第b位开始取,取c位 SQL> select substr('Hello World',4,3) 子串 from dual; 子 --- lo SQL> --length 字符数 lengthb 字节数 SQL> select length('Hello World') 字符,lengthb('Hello World') 字节 from dual; 字符 字节 ---------- ---------- 11 11 SQL> ed 已写入 file afiedt.buf 1* select length('北京') 字符,lengthb('北京') 字节 from dual SQL> / 字符 字节 ---------- ---------- 2 4 SQL> --instr(a,b) SQL> --在a中,查找b SQL> select instr('Hello World','ll') 位置 from dual; 位置 ---------- 3 SQL> --lpad 左填充 rpad 右填充 SQL> -- abcd ---> 10位 SQL> select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右 from dual; 左 右 ---------- ---------- ******abcd abcd****** SQL> --trim 去掉前后指定的字符 SQL> select trim('H' from 'Hello WorldH') from dual; TRIM('H'FR ---------- ello World SQL> --replace SQL> select replace('Hello World','l','*') from dual; REPLACE('HE ----------- He**o Wor*d
②数值函数:
SQL> --四舍五入 SQL> select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,round(45.926,-1) 四,round(45.926,-2) 五 2 from dual; 一 二 三 四 五 ---------- ---------- ---------- ---------- ---------- 45.93 45.9 46 50 0 SQL> --截断 SQL> ed 已写入 file afiedt.buf 1 select trunc(45.926,2) 一,trunc(45.926,1) 二,trunc(45.926,0) 三,trunc(45.926,-1) 四,trunc(45.926,-2) 五 2* from dual SQL> / 一 二 三 四 五 ---------- ---------- ---------- ---------- ---------- 45.92 45.9 45 40 0 SQL> host cls SQL> --当前时间 SQL> select sysdate from dual; SYSDATE -------------- 29-9月 -16 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2016-09-29 11:58:32 SQL> --昨天 今天 明天 SQL> select (sysdate-1) 昨天,sysdate 今天,(sysdate+1) 明天 2 from dual; 昨天 今天 明天 -------------- -------------- -------------- 28-9月 -16 29-9月 -16 30-9月 -16 SQL> --计算员工的工龄:天 星期 月 年 SQL> select ename,hiredate,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期, 2 (sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年 3 from emp; ENAME HIREDATE 天 星期 月 年 ---------- -------------- ---------- ---------- ---------- ---------- SMITH 17-12月-80 13070.5013 1867.21448 435.683378 35.8095927 ALLEN 20-2月 -81 13005.5013 1857.92876 433.516711 35.6315105 WARD 22-2月 -81 13003.5013 1857.64305 433.450044 35.626031 JONES 02-4月 -81 12964.5013 1852.07162 432.150044 35.5191817 MARTIN 28-9月 -81 12785.5013 1826.50019 426.183378 35.0287708 BLAKE 01-5月 -81 12935.5013 1847.92876 431.183378 35.4397297 CLARK 09-6月 -81 12896.5013 1842.35733 429.883378 35.3328804 SCOTT 19-4月 -87 10756.5013 1536.64305 358.550044 29.4698667 KING 17-11月-81 12735.5013 1819.35733 424.516711 34.8917845 TURNER 08-9月 -81 12805.5013 1829.35733 426.850044 35.0835653 ADAMS 23-5月 -87 10722.5013 1531.7859 357.416711 29.376716 ENAME HIREDATE 天 星期 月 年 ---------- -------------- ---------- ---------- ---------- ---------- JAMES 03-12月-81 12719.5013 1817.07162 423.983378 34.8479489 FORD 03-12月-81 12719.5013 1817.07162 423.983378 34.8479489 MILLER 23-1月 -82 12668.5013 1809.7859 422.283378 34.7082228 已选择 14 行。 SQL> select sysdate+hiredate from emp; select sysdate+hiredate from emp * 第 1 行出现错误: ORA-00975: 不允许日期 + 日期 SQL> --months_between SQL> select ename,hiredate,(sysdate-hiredate)/30 一,months_between(sysdate,hiredate) 二 2 from emp; ENAME HIREDATE 一 二 ---------- -------------- ---------- ---------- SMITH 17-12月-80 435.683431 429.40332 ALLEN 20-2月 -81 433.516764 427.306546 WARD 22-2月 -81 433.450097 427.24203 JONES 02-4月 -81 432.150097 425.887191 MARTIN 28-9月 -81 426.183431 420.048481 BLAKE 01-5月 -81 431.183431 424.919449 CLARK 09-6月 -81 429.883431 423.661384 SCOTT 19-4月 -87 358.550097 353.338804 KING 17-11月-81 424.516764 418.40332 TURNER 08-9月 -81 426.850097 420.693642 ADAMS 23-5月 -87 357.416764 352.209772 ENAME HIREDATE 一 二 ---------- -------------- ---------- ---------- JAMES 03-12月-81 423.983431 417.854933 FORD 03-12月-81 423.983431 417.854933 MILLER 23-1月 -82 422.283431 416.209772 已选择 14 行。 SQL> --53个月后 SQL> select add_months(sysdate,53) from dual; ADD_MONTHS(SYS -------------- 28-2月 -21 SQL> --last_day SQL> select last_day(sysdate) from dual; LAST_DAY(SYSDA -------------- 30-9月 -16 SQL> host cls SQL> --next_day SQL> --下一个星期四 SQL> select next_day(sysdate,'星期四') from dual; NEXT_DAY(SYSDA -------------- 06-10月-16 SQL> --下一个星期五 SQL> select next_day(sysdate,'星期五') from dual; NEXT_DAY(SYSDA -------------- 30-9月 -16 SQL> select next_day(sysdate,'礼拜五') from dual; select next_day(sysdate,'礼拜五') from dual * 第 1 行出现错误: ORA-01846: 周中的日无效 SQL> /* SQL> next_day函数的应用:每个星期一自动备份表中的数据 SQL> 1、分布式数据库 SQL> 2、触发器 快照 SQL> */ SQL> select round(sysdate,'month'),round(sysdate,'year') from dual; ROUND(SYSDATE, ROUND(SYSDATE, -------------- -------------- 01-10月-16 01-1月 -17
③转换函数
分为隐式和显式SQL> --2016-09-29 12:18:12今天是星期四 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss今天是day') from dual; select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss今天是day') from dual * 第 1 行出现错误: ORA-01821: 日期格式无法识别 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual; TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI ---------------------------------- 2016-09-29 12:20:13今天是星期四 SQL> --查询员工的薪水:两位小数、千位符、本地货币代码 SQL> select to_char(sal,'L9,999.99') from emp; TO_CHAR(SAL,'L9,999 ------------------- ¥800.00 ¥1,600.00 ¥1,250.00 ¥2,975.00 ¥1,250.00 ¥2,850.00 ¥2,450.00 ¥3,000.00 ¥5,000.00 ¥1,500.00 ¥1,100.00 TO_CHAR(SAL,'L9,999 ------------------- ¥950.00 ¥3,000.00 ¥1,300.00 已选择 14 行。 SQL> host cls SQL> --nvl2(a,b,c) 当a=null的时候,返回c;否则返回b SQL> selec sal*12+nvl2(comm,comm,0) from emp; SP2-0734: 未知的命令开头 "selec sal*..." - 忽略了剩余的行。 SQL> select sal*12+nvl2(comm,comm,0) from emp; SAL*12+NVL2(COMM,COMM,0) ------------------------ 9600 19500 15500 35700 16400 34200 29400 36000 60000 18000 13200 SAL*12+NVL2(COMM,COMM,0) ------------------------ 11400 36000 15600 已选择 14 行。 SQL> --nullif(a,b) 当a=b的时候,返回null;否则返回a SQL> select nullif('abc','abc') 值 from dual; 值 --- SQL> select nullif('abc','abcd') 值 from dual; 值 --- abc SQL> --coalesce 从左到右 找到第一个不为null的值 SQL> select comm,sal,coalesce(comm,sal) "第一个不为null的值" 2 from emp; COMM SAL 第一个不为null的值 ---------- ---------- ------------------ 800 800 300 1600 300 500 1250 500 2975 2975 1400 1250 1400 2850 2850 2450 2450 3000 3000 5000 5000 0 1500 0 1100 1100 COMM SAL 第一个不为null的值 ---------- ---------- ------------------ 950 950 3000 3000 1300 1300 已选择 14 行。
④通用函数
什么是通用函数?这些函数适用于任何数据类型,同时也适用于空值。
SQL> host cls SQL> --nvl2(a,b,c) 当a=null的时候,返回c;否则返回b SQL> selec sal*12+nvl2(comm,comm,0) from emp; SP2-0734: 未知的命令开头 "selec sal*..." - 忽略了剩余的行。 SQL> select sal*12+nvl2(comm,comm,0) from emp; SAL*12+NVL2(COMM,COMM,0) ------------------------ 9600 19500 15500 35700 16400 34200 29400 36000 60000 18000 13200 SAL*12+NVL2(COMM,COMM,0) ------------------------ 11400 36000 15600 已选择 14 行。 SQL> --nullif(a,b) 当a=b的时候,返回null;否则返回a SQL> select nullif('abc','abc') 值 from dual; 值 --- SQL> select nullif('abc','abcd') 值 from dual; 值 --- abc SQL> --coalesce 从左到右 找到第一个不为null的值 SQL> select comm,sal,coalesce(comm,sal) "第一个不为null的值" 2 from emp; COMM SAL 第一个不为null的值 ---------- ---------- ------------------ 800 800 300 1600 300 500 1250 500 2975 2975 1400 1250 1400 2850 2850 2450 2450 3000 3000 5000 5000 0 1500 0 1100 1100 COMM SAL 第一个不为null的值 ---------- ---------- ------------------ 950 950 3000 3000 1300 1300 已选择 14 行。
⑤条件表达式
就是在SQL语句中使用if-then-elsecase表达式:SQL99的语法,类似于Basic,比较繁琐。
DECODE函数:Oracle自己的语法,类似于java,比较简介。
相关文章推荐
- 33.Oracle数据库SQL开发之 使用简单函数——使用单行函数字符函数
- Oracle数据库之SQL单行函数---字符函数之TRIM
- Oracle数据库之SQL单行函数---数字函数
- Oracle数据库之SQL单行函数---字符函数之TRIM
- Oracle数据库之SQL单行函数---数字函数
- Oracle数据库之单行函数
- Oracle数据库(三)单行函数
- Oracle数据库之SQL单行函数---字符函数续
- Oracle数据库中的五类单行函数及习题讲解
- Oracle数据库之SQL单行函数---字符函数续
- Oracle数据库之SQL单行函数---字符函数
- Oracle数据库之SQL单行函数---字符函数
- Oracle数据库之SQL单行函数---日期函数集锦
- Oracle数据库之SQL单行函数---日期函数集锦
- Oracle数据库之SQL单行函数---to_date to_char
- Oracle数据库基础之单行函数
- Oracle数据库之SQL单行函数---日期函数集锦
- Oracle数据库之SQL单行函数---to_date to_char
- Oracle数据库函数(单行函数)
- Oracle数据库的查询之单行函数查询(三)