SQL> --字符函数
SQL> select lower('Hello WORLd') 转小写,upper('Hello WORLd') 转大写,
2 initcap('hello world') 首字母大写
3 from dual;
转小写 转大写 首字母大写
----------- ----------- -----------
hello world HELLO WORLD Hello World
SQL> --substr(a,b) 从a中,第b位开始取,取右边所有的字符
SQL> select substr('hello world',3) from dual;
SUBSTR('H
---------
llo world
SQL> --substr(a,b,c) 从a中,第b位开始取,取c位
SQL> select substr('hello world',3,4) from dual;
SUBS
----
llo
SQL> host cls
SQL> --length 字符数 lengthb 字节数
SQL> select length('hello world') 字符数,lengthb('hello world') 字节数
2 from dual;
字符数 字节数
---------- ----------
11 11
SQL> ed
已写入 file afiedt.buf
1 select length('中国') 字符数,lengthb('中国') 字节数
2* from dual
SQL> /
字符数 字节数
---------- ----------
2 4
SQL> host cls
SQL> --instr(a,b) 从a中查找b,找到返回下标,否则返回0
SQL> select instr('hello world','ll') from dual;
INSTR('HELLOWORLD','LL')
------------------------
3
SQL> host cls
SQL> --lpad 左填充 rpad右填充
SQL> select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右
2 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',
2 'l','*') from dual;
REPLACE('HE
-----------
he**o wor*d
SQL> host cls
SQL> --四舍五入
SQL> select ROUND(45.926, 2) 一,ROUND(45.926, 1) 二,ROUND(45.926, 0) 三,
2 ROUND(45.926, -1) 四, ROUND(45.926, -2) 五
3 from dual;
一 二 三 四 五
---------- ---------- ---------- ---------- ----------
45.93 45.9 46 50 0
SQL> ed
已写入 file afiedt.buf
1 select TRUNC(45.926, 2) 一,TRUNC(45.926, 1) 二,TRUNC(45.926, 0) 三,
2 TRUNC(45.926, -1) 四, TRUNC(45.926, -2) 五
3* from dual
SQL> /
一 二 三 四 五
---------- ---------- ---------- ---------- ----------
45.92 45.9 45 40 0
SQL> host cls
SQL> --日期函数
SQL> select sysdate from dual;
SYSDATE
--------------
19-6月 -13
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2013-06-19 14:22:23
SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss:ff') from dual;
TO_CHAR(SYSTIMESTAMP,'YYYY-MM
-----------------------------
2013-06-19 14:23:22:000000
SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss:ff') from dual;
TO_CHAR(SYSTIMESTAMP,'YYYY-MM
-----------------------------
2013-06-19 14:23:24:843000
SQL> --昨天 今天 明天
SQL> select (sysdate-1) 昨天, sysdate 今天,(sysdate+1) 明天
2 from dual;
昨天 今天 明天
-------------- -------------- --------------
18-6月 -13 19-6月 -13 20-6月 -13
SQL> host cls
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 11872.6018 1696.08597 395.753392 32.5276761
ALLEN 20-2月 -81 11807.6018 1686.80025 393.586725 32.3495939
WARD 22-2月 -81 11805.6018 1686.51454 393.520059 32.3441144
JONES 02-4月 -81 11766.6018 1680.94311 392.220059 32.2372651
MARTIN 28-9月 -81 11587.6018 1655.37168 386.253392 31.7468541
BLAKE 01-5月 -81 11737.6018 1676.80025 391.253392 32.157813
CLARK 09-6月 -81 11698.6018 1671.22882 389.953392 32.0509637
SCOTT 13-7月 -87 703435.602 100490.8 23447.8534 1927.22083
KING 17-11月-81 11537.6018 1648.22882 384.586725 31.6098678
TURNER 08-9月 -81 11607.6018 1658.22882 386.920059 31.8016487
ADAMS 13-7月 -87 703435.602 100490.8 23447.8534 1927.22083
ENAME HIREDATE 天 星期 月 年
---------- -------------- ---------- ---------- ---------- ----------
JAMES 03-12月-81 11521.6018 1645.94311 384.053392 31.5660322
FORD 03-12月-81 11521.6018 1645.94311 384.053392 31.5660322
MILLER 23-1月 -82 11470.6018 1638.65739 382.353392 31.4263062
已选择14行。
SQL> select sysdate+hiredate from emp;
select sysdate+hiredate from emp
*
第 1 行出现错误:
ORA-00975: 不允许日期 + 日期
SQL> host cls
SQL> --last_day 日期所在月份的最后一天
SQL> select last_day(sysdate) from dual;
LAST_DAY(SYSDA
--------------
30-6月 -13
SQL> --MONTHS_BETWEEN 返回两个日期相差的月数
SQL> select ename,hiredate,(sysdate-hiredate)/30 一,MONTHS_BETWEEN(sysdate,hiredate) 二
2 from emp;
ENAME HIREDATE 一 二
---------- -------------- ---------- ----------
SMITH 17-12月-80 395.753475 390.084008
ALLEN 20-2月 -81 393.586809 387.987234
WARD 22-2月 -81 393.520142 387.922718
JONES 02-4月 -81 392.220142 386.567879
MARTIN 28-9月 -81 386.253475 380.72917
BLAKE 01-5月 -81 391.253475 385.600137
CLARK 09-6月 -81 389.953475 384.342073
SCOTT 13-7月 -87 23447.8535 23111.213
KING 17-11月-81 384.586809 379.084008
TURNER 08-9月 -81 386.920142 381.374331
ADAMS 13-7月 -87 23447.8535 23111.213
ENAME HIREDATE 一 二
---------- -------------- ---------- ----------
JAMES 03-12月-81 384.053475 378.535621
FORD 03-12月-81 384.053475 378.535621
MILLER 23-1月 -82 382.353475 376.89046
已选择14行。
SQL> --ADD_MONTHS: 加上若干个月
SQL> select ADD_MONTHS(sysdate,100) from dual;
ADD_MONTHS(SYS
--------------
19-10月-21
SQL> host cls
SQL> --next_day
SQL> select next_day(sysdate,'星期三') from dual;
NEXT_DAY(SYSDA
--------------
26-6月 -13
SQL> select next_day(sysdate,'星期四') from dual;
NEXT_DAY(SYSDA
--------------
20-6月 -13
SQL> --提示: next_day应用: 每个星期一做数据备份
SQL> select next_day(sysdate,'礼拜四') from dual;
select next_day(sysdate,'礼拜四') from dual
*
第 1 行出现错误:
ORA-01846: 周中的日无效
SQL> host cls
SQL> select round(sysdate,'month'), round(sysdate,'year') from dual;
ROUND(SYSDATE, ROUND(SYSDATE,
-------------- --------------
01-7月 -13 01-1月 -13
SQL> --隐式类型转换的前提:该转换对象是可以转换的
SQL> --隐式类型转换由Oracle自动完成
SQL> --显式类型转换:不能由Oracle自动完成,并且要转换的对象有时候是不能自动转换的
SQL> --比如number-->varchar,需要number调用to_char函数
SQL> --tochar函数,按照某个具体的日期,返回一个字符串结果
SQL> --查询:2015-09-30 09:44:23 今天是星期三
SQL> --to_char函数的使用格式为:to_char(date,'modle')
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day')
2 from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI
----------------------------------
2015-09-30 09:46:25今天是星期三
SQL> --如上面的例子所示,我们在格式模版里面使用了我们自己的字符串,这时候需要我们在自己使用的字符串上面加双引号
SQL> --使用to_char函数查询员工的薪水,要求的格式:两位小数,千分号,当地货币符号
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> --如上所示,其中用9表示有多少位数字,用千分号表示分隔符,在数字的最前面使用大写英文字母L表示当地货币
SQL> --to_char跟to_number/to_date的使用方法类似,用过了to_char剩下的都差不多的用法
SQL> host cls
SQL> --通用函数
SQL> --nvl(a,b)和nvl2(a,b,c)
SQL> --其中nvl我们在之前已经使用过,在这里我们用一下nvl2
SQL> --括号内参数的意思为:判断a是否为null,如果为空,则返回c,不为null返回b
SQL> --查询员工的奖金
SQL> select nvl2(comm,comm,0) from emp;
NVL2(COMM,COMM,0)
-----------------
0
300
500
0
1400
0
0
0
0
0
0
NVL2(COMM,COMM,0)
-----------------
0
0
0
已选择14行。
SQL> host cls
SQL> --nullif(a,b)表示a与b比较,如果相等,返回null;不相等返回a
SQL> --注意:通用函数是适用于所有数据类型以及空值
SQL> select nullif('abc','abc') from dual;
NUL
---
SQL> --不相等的例子
SQL> select nullif('abc','abcd') from dual;
NUL
---
abc
SQL> --coalesce(..)表示从参数列左往右返回第一个不为空的值
SQL> select sal,comm,coalesce(sal,comm)
2 from emp;
SAL COMM COALESCE(SAL,COMM)
---------- ---------- ------------------
800 800
1600 300 1600
1250 500 1250
2975 2975
1250 1400 1250
2850 2850
2450 2450
3000 3000
5000 5000
1500 0 1500
1100 1100
SAL COMM COALESCE(SAL,COMM)
---------- ---------- ------------------
950 950
3000 3000
1300 1300
已选择14行。
SQL> host cls
SQL> --单行函数的最后一个内容:条件表达式
SQL> --如果需要用到if-then-else逻辑的时候,就需要考虑使用条件表达式
SQL> --条件表达式有两种实现方法,第一种为case表达式(sql的标准),第二种为decode函数(oracle自己的语法,比较简洁)
SQL> --我们先用case函数
SQL> --帮员工涨薪水,如果为总裁+100,如果为经理+800,其他+400
SQL> select ename,job,sal 涨前薪水,
2 case job when 'PRESIDENT' then sal+1000
3 when 'MANAGER' then sal+800
4 else sal+400
5 end 涨后薪水
6 from emp;
ENAME JOB 涨前薪水 涨后薪水
---------- --------- ---------- ----------
SMITH CLERK 800 1200
ALLEN SALESMAN 1600 2000
WARD SALESMAN 1250 1650
JONES MANAGER 2975 3775
MARTIN SALESMAN 1250 1650
BLAKE MANAGER 2850 3650
CLARK MANAGER 2450 3250
SCOTT ANALYST 3000 3400
KING PRESIDENT 5000 6000
TURNER SALESMAN 1500 1900
ADAMS CLERK 1100 1500
ENAME JOB 涨前薪水 涨后薪水
---------- --------- ---------- ----------
JAMES CLERK 950 1350
FORD ANALYST 3000 3400
MILLER CLERK 1300 1700
已选择14行。
SQL> set pagesiez 20;
SP2-0158: 未知的 SET 选项 "pagesiez"
SQL> ed
已写入 file afiedt.buf
1 select ename,job,sal 涨前薪水,
2 case job when 'PRESIDENT' then sal+1000
3 when 'MANAGER' then sal+800
4 else sal+400
5 end 涨后薪水
6* from emp
SQL> --我们使用decode函数来实现上面的例子
SQL> select ename,job,sal 涨前薪水,
2 decode(job,'PERSIDENT',sal+1000,'MANAGER',sal+800,sal+400) 涨后薪水
3 from emp;
ENAME JOB 涨前薪水 涨后薪水
---------- --------- ---------- ----------
SMITH CLERK 800 1200
ALLEN SALESMAN 1600 2000
WARD SALESMAN 1250 1650
JONES MANAGER 2975 3775
MARTIN SALESMAN 1250 1650
BLAKE MANAGER 2850 3650
CLARK MANAGER 2450 3250
SCOTT ANALYST 3000 3400
KING PRESIDENT 5000 5400
TURNER SALESMAN 1500 1900
ADAMS CLERK 1100 1500
JAMES CLERK 950 1350
FORD ANALYST 3000 3400
MILLER CLERK 1300 1700
已选择14行。
Oracle单行函数
最新推荐文章于 2022-11-16 17:48:14 发布