您的位置:首页 > 数据库 > Oracle

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-else

case表达式:SQL99的语法,类似于Basic,比较繁琐。

DECODE函数:Oracle自己的语法,类似于java,比较简介。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: