Oracle学习(三)----函数

来源:互联网 发布:2017淘宝卖家参加双12 编辑:程序博客网 时间:2024/06/05 11:07
1 函数可以没有参数,但必须要有返回值,函数分为单行函数和多行函数
1.1 单行函数
单行函数是指有单个参数输入,每行返回一个结果;
可以转换数据类型;
可以嵌套;
参数可以是一列或一个值。
单行函数类型可以是字符、数值、日期、转换、通用
1.1.1 字符函数
--大小写控制函数:LOWER;UPPER;INITCAP;


SQL> select upper('hello') 小写, lower('hello') 大写, initcap('hello word.') 首字母大写 from dual;


小写  大写  首字母大写
---- - ---- - ---------- -
HELLO hello Hello Word.


--字符控制函数:CONCAT(连接字符), SUBSTR,LENGTH/LENGTHB,INSTR,LPAD |RPAD, TRIM, REPLACE
(1):concat


SQL> select concat('hello', 'world') concat from dual;


CONCAT
----------
helloworld
(2):函数嵌套


SQL> select concat(concat('hello', 'world'), 'ddd') 函数嵌套 from dual;


函数嵌套
------------ -
helloworldddd
(3) :substr;
substr(a, b)----从a中,第b位开始取;
substr(a,b,c)---从a中,第b位开始取,取5个字符


SQL> select substr('abcdefghijklmnopq', 3) "第三个字符开始取", substr('abcdefghijklmnopq', 3, 5) "三个字符开始取5个" from dual;


第三个字符开始  三个
-------------- - ---- -
cdefghijklmnopq cdefg
(4):length是计算字符串的字符数目,lengthb是计算字节数目,其中一个中文两个字节


SQL> select length('中国abc') 字符数目, lengthb('中国abc') 字节 from dual;


字符数目       字节
---------- ----------
5          7
(5) : instr('母串','子串'),在母串中查找子串,返回子串在母串中的位置,找不到返回0;




SQL> select instr('abcdefg', 'efg') 查找 from dual;


查找
----------
5
(6) : lpad,rpad将未满的占位符填充符号;


SQL> select lpad('abc', 10, '*') lpad, rpad('def', 10, '$') rpad from dual;


LPAD       RPAD
---------- ----------
*******abc def$$$$$$$


(7):trim,去掉前后制定的字符,字符可以是空格,也可以不是空格,相当于在字符串删除掉该字符


SQL> select trim('A' from 'ABCdefg') trim from dual;


TRIM
------
BCdefg
(8):replace替换; repalce('abcd', 'b', 'B');将字符串中的b替换成为‘B’
SQL> select replace('abcd', 'b', 'B') from dual;


REPL
----
aBcd
1.1.2 数字函数
(1) ROUND:四舍五入
2 > 0保留到小数点后两位,
0保留到个数
1 保留到十位;


SQL> select round(123.456, 2), round(123.456, 1), round(123.456, 0), round(123.456, 1) from dual;


ROUND(123.456, 2) ROUND(123.456, 1) ROUND(123.456, 0) ROUND(123.456, 1)
---------------- ---------------- ---------------- ----------------
123.46            123.5              123            123.5


SQL>


(2) TRUNC:截断
数字大于零时在小数点后边截断;


SQL> select trunc(123.456, 2), trunc(123.456, 0) from dual;


TRUNC(123.456, 2) TRUNC(123.456, 0)
---------------- ----------------
123.45              123


(3) MOD:求余


1.1.3 日期函数


oracle数据库中date包含日期和时间
mysql数据库中有三种数据类型date,time,timestamp

(1)系统自带的显示时间的格式:sysdate包含日期和时间


SQL> select sysdate from dual;


SYSDATE
--------------
25 - 3月 - 16


(2)将日期转化为想要的格式




SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') 时间  from dual;


时间
------------------ -
2016 - 03 - 25 15:16 : 01
(3)日期的运算:
1. 在日期上加上或减去一个数字结果仍为日期;
SQL> select sysdate - 1 昨天, sysdate 今天, sysdate 明天 from dual;


昨天           今天           明天
-------------- -------------- --------------
24 - 3月 - 16     25 - 3月 - 16     25 - 3月 - 16
2. 两个日期相减返回日期之间相差的天数;
按照周 月 年 显示(这样只是粗略的计算)


SQL> select(sysdate - hiredate) / 7 周, (sysdate - hiredate) / 30 月, (sysdate - hiredate) / 365 年 from emp;


周         月         年
---------- ---------- ----------


1840.37754 429.421427 35.2949118
1831.09183  427.25476 35.1168296
1830.80612 427.188094 35.1113502
1825.23469 425.888094 35.0045009
1799.66326 419.921427 34.5140899
1821.09183 424.921427 34.9250488
1815.5204 423.621427 34.8181995
1509.80612 352.288094 28.9551858
1792.5204  418.25476 34.3771036
1802.5204 420.588094 34.5688844
1504.94897  351.15476 28.8620351
1790.23469 417.721427  34.333268
1790.23469 417.721427  34.333268
1782.94897 416.021427  34.193542


已选择15行。


可以用数字除24来向日期中加上或减去小时;


精确的计算,MONTHS_BEWTEEN(t1,t2):


SQL> select ename, MONTHS_BETWEEN(sysdate, hiredate) 精算, (sysdate - hiredate) / 30 粗略估计 from emp;


ENAME            精算   粗略估计
---------- ---------- ----------
tom_abc
SMITH      423.278948 429.421579
ALLEN      421.182173 427.254912
WARD       421.117657 427.188246
JONES      419.762818 425.888246
MARTIN     413.924109 419.921579
BLAKE      418.795077 424.921579
CLARK      417.537012 423.621579
SCOTT      347.214431 352.288246
KING       412.278948 418.254912
TURNER      414.56927 420.588246
ADAMS      346.085399 351.154912
JAMES       411.73056 417.721579
FORD        411.73056 417.721579
MILLER     410.085399 416.021579




1. MONTHS_BEWTEEN:两个日期相差的月数;


SQL> select months_between('01-1月-2016', '03-3月-2015') 测试 from dual;


 测试
----------
9.93548387


2. ADD_MONTHS:向指定日期中加上若干月数;
SQL> select add_months('01-1月-2016', 5) from dual;


 ADD_MONTHS('01
 --------------
 01 - 6月 - 16
3. NEXT_DAY:指定日期的下一个日期




SQL> select NEXT_DAY('01-1月-2016', '星期五') from dual;


NEXT_DAY('01-1
 --------------
 08 - 1月 - 16
4. LAST_DAY:本月的最后一天
SQL> select LAST_DAY('01-1月-2016') from dual;


LAST_DAY('01-1
--------------
31 - 1月 - 16
ROUND:日期四舍五入
TRUNC:日期截断


1.1.4类型转化


oracle能够自动将字符串转化为数字,将字符串转化为日期,将日期转化为字符串,将数字转化为字符串;
to_char, to_date, to_number


插图2.1
(1)隐式转换
SQL> select * from emp where hiredate > '01-1月 -81';


EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- -------- - ---------- -------------- ---------- ---------- ----------
7499 ALLEN      SALESMAN        7698 20 - 2月 - 81           1600        300         30
7521 WARD       SALESMAN        7698 22 - 2月 - 81           1250        500         30
7566 JONES      MANAGER         7839 02 - 4月 - 81           2975                    20
7654 MARTIN     SALESMAN        7698 28 - 9月 - 81           1250       1400         30
7698 BLAKE      MANAGER         7839 01 - 5月 - 81           2850                    30
7782 CLARK      MANAGER         7839 09 - 6月 - 81           2450                    10
7788 SCOTT      ANALYST         7566 19 - 4月 - 87           3000                    20
7839 KING       PRESIDENT            17 - 11月 - 81           5000                    10
7844 TURNER     SALESMAN        7698 08 - 9月 - 81           1500          0         30
7876 ADAMS      CLERK           7788 23 - 5月 - 87           1100                    20
7900 JAMES      CLERK           7698 03 - 12月 - 81            950                    30
7902 FORD       ANALYST         7566 03 - 12月 - 81           3000                    20
7934 MILLER     CLERK           7782 23 - 1月 - 82           1300                    10
(2)显示转换

SQL> select * from emp
2  where hiredate > to_date('1981-01-01 02:03:00', 'yyyy-mm-dd hh24:mi:ss');


EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- -------- - ---------- -------------- ---------- ---------- ----------
7499 ALLEN      SALESMAN        7698 20 - 2月 - 81           1600        300         30
7521 WARD       SALESMAN        7698 22 - 2月 - 81           1250        500         30
7566 JONES      MANAGER         7839 02 - 4月 - 81           2975                    20
7654 MARTIN     SALESMAN        7698 28 - 9月 - 81           1250       1400         30
7698 BLAKE      MANAGER         7839 01 - 5月 - 81           2850                    30
7782 CLARK      MANAGER         7839 09 - 6月 - 81           2450                    10
7788 SCOTT      ANALYST         7566 19 - 4月 - 87           3000                    20
7839 KING       PRESIDENT            17 - 11月 - 81           5000                    10
7844 TURNER     SALESMAN        7698 08 - 9月 - 81           1500          0         30
7876 ADAMS      CLERK           7788 23 - 5月 - 87           1100                     20
7900 JAMES      CLERK           7698 03 - 12月 - 81            950                    30
7902 FORD       ANALYST         7566 03 - 12月 - 81           3000                    20
7934 MILLER     CLERK           7782 23 - 1月 - 82           1300                    10


已选择13行。


(3) 显示转换2


查询员工的薪水:两位小数 本地货币代码 千位符
SQL> select ename, job, to_char(sal, 'L9,999.00') from emp;


ENAME      JOB       TO_CHAR(SAL, 'L9,999
---------- -------- - ------------------ -
tom_abc                       ¥8, 000.00
SMITH      CLERK                ¥800.00
ALLEN      SALESMAN           ¥1, 600.00
WARD       SALESMAN           ¥1, 250.00
JONES      MANAGER            ¥2, 975.00
MARTIN     SALESMAN           ¥1, 250.00
BLAKE      MANAGER            ¥2, 850.00
CLARK      MANAGER            ¥2, 450.00
SCOTT      ANALYST            ¥3, 000.00
KING       PRESIDENT          ¥5, 000.00
TURNER     SALESMAN           ¥1, 500.00
ADAMS      CLERK              ¥1, 100.00
JAMES      CLERK                ¥950.00
FORD       ANALYST            ¥3, 000.00
MILLER     CLERK              ¥1, 300.00






SQL> select to_number('¥8,000.00', 'L9,999.00') 格式转化 from dual;


格式转化
----------
8000






SQL> select * from emp
2  where to_char(hiredate, 'yyyy-mm-dd') > '1980-01-01'
3;


EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- -------- - ---------- -------------- ---------- ---------- ----------
7369 SMITH      CLERK           7902 17 - 12月 - 80            800                    20
7499 ALLEN      SALESMAN        7698 20 - 2月 - 81           1600        300         30
7521 WARD       SALESMAN        7698 22 - 2月 - 81           1250        500         30
7566 JONES      MANAGER         7839 02 - 4月 - 81           2975                    20
7654 MARTIN     SALESMAN        7698 28 - 9月 - 81           1250       1400         30
7698 BLAKE      MANAGER         7839 01 - 5月 - 81           2850                    30
7782 CLARK      MANAGER         7839 09 - 6月 - 81           2450                    10
7788 SCOTT      ANALYST         7566 19 - 4月 - 87           3000                    20
7839 KING       PRESIDENT            17 - 11月 - 81           5000                    10
7844 TURNER     SALESMAN        7698 08 - 9月 - 81           1500          0         30
7876 ADAMS      CLERK           7788 23 - 5月 - 87           1100                    20
7900 JAMES      CLERK           7698 03 - 12月 - 81            950                    30
7902 FORD       ANALYST         7566 03 - 12月 - 81           3000                    20
7934 MILLER     CLERK           7782 23 - 1月 - 82           1300                    10




1.1.5 通用函数
nvl(a, b)----当a是null的时候返回b;
nvl2(a,b,c)----当a是null的时候返回c,否则返回b;
nullif(a,b)----当a=b时,返回null, 否则返回a


多行函数是指有多行参数输入,单行输出;


SQL>  select count(*) from emp;


COUNT(*)
----------
15


2 插入的数据如果没有提交的话可以用rollback回退
SQL> rollback;


回退已完成。




案例:给员工涨工资:总裁1000 经理:800 其他张500
前后工资列出来


if (job = 'PRESIDENT')
sal+1000
else if (job = 'MANAGER')
sal+800
else
sal+500


case 表达式:
CASE expr(通常列名) WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END






1  select ename, job, sal 涨前,
2  (case job when 'PRESIDENT' then sal + 1000
3            when 'MANAGER' then sal + 800
4       else sal + 500 END) 涨后
5 * from emp
SQL> /


ENAME      JOB             涨前       涨后
---------- -------- - ---------- ----------
tom_abc                    8000       8500
SMITH      CLERK            800       1300
ALLEN      SALESMAN        1600       2100
WARD       SALESMAN        1250       1750
JONES      MANAGER         2975       3775
MARTIN     SALESMAN        1250       1750
BLAKE      MANAGER         2850       3650
CLARK      MANAGER         2450       3250
SCOTT      ANALYST         3000       3500
KING       PRESIDENT       5000       6000
TURNER     SALESMAN        1500       2000
ADAMS      CLERK           1100       1600
JAMES      CLERK            950       1450
FORD       ANALYST         3000       3500
MILLER     CLERK           1300       1800


已选择15行。


decode表达式


DECODE(col | expression, search1, result1
[, search2, result2, ..., ]
[, default])
一个函数,参数可扩展。。。
Printf(“%s, %s, %s”, a, b, c)




已写入 file afiedt.buf


1  select ename, job, sal 涨前,
2  (
3  decode(job, 'PRESEIDENT', sal + 1000, 'MANAGER', sal + 800, sal + 500)
4) 涨后
5 * from emp
SQL> /


ENAME      JOB             涨前       涨后
---------- -------- - ---------- ----------
tom_abc                    8000       8500
SMITH      CLERK            800       1300
ALLEN      SALESMAN        1600       2100
WARD       SALESMAN        1250       1750
JONES      MANAGER         2975       3775
MARTIN     SALESMAN        1250       1750
BLAKE      MANAGER         2850       3650
CLARK      MANAGER         2450       3250
SCOTT      ANALYST         3000       3500
KING       PRESIDENT       5000       5500
TURNER     SALESMAN        1500       2000
ADAMS      CLERK           1100       1600
JAMES      CLERK            950       1450
FORD       ANALYST         3000       3500
MILLER     CLERK           1300       1800


已选择15行。
0 0