單行函數
單行函數:
字符函數
*************************************************************************************************************************************************
SQL> --字符函數
大小寫控制函數
2 from dual;
轉小寫 轉大寫 首字母大寫
----------- ----------- -----------
hello world HELLO WORLD Hello World
SQL> --substr:求子串
SQL> select substr('Hello World',4) from dual;
SUBSTR('
--------
lo World
SQL> select substr('Hello World',4,5) from dual;
SUBST
-----
lo Wo
字符控制函數
字符數字節數
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:在母串中查找子串,如果找到返回下標(從1開始);否則返回0SQL> select instr('Hello World','ll') from dual;
INSTR('HELLOWORLD','LL')
------------------------
3
左右填充
SQL> --lpad:左填充 rpad 右填充
SQL> select lpad('abcd',10,'*') 左填充,rpad('abcd',10,'*') 右填充 from dual;
左填充 右填充
---------- ----------
******abcd abcd******
SQL> host cls
去掉前後指定的字符
SQL> --trim:去掉前後指定的字符
SQL> select trim('H' from 'Hello WorldH') from dual;TRIM('H'FR
----------
ello World
replace:替換
SQL> --replace:替換SQL> select replace('Hello World','l','*') from dual;
REPLACE('HE
-----------
He**o Wor*d
SQL> host cls
數字函數
SQL> --數值函數
四捨五入round
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> ed
已寫入 file afiedt.buf
截斷函數,TRUNC
2* from dual
SQL> /
一 二 三 四 五
---------- ---------- ---------- ---------- ----------
45.92 45.9 45 40 0
SQL> host cls
日期函數
SQL> --日期函數
Oracle 中的日期型數據實際含有兩個值: 日期和時間。
默認的日期格式是 DD-MON-RR
SQL> select sysdate from dual;
SYSDATE--------------
25-3月 -12
SQL> select sysdate-1 昨天,sysdate 今天,sysdate+1 明天 from dual;
昨天 今天 明天
-------------- -------------- --------------
24-3月 -12 25-3月 -12 26-3月 -12
SQL> host cls
粗略計算辦法日期查詢
SQL> --查詢員工的工齡:天 星期 月 年
SQL> select ename,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,(sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年2 from emp;
ENAME 天 星期 月 年
-------- ---------- ---------- ---------- ----------
SMITH 11421.6015 1631.65736 380.72005 31.2920589
ALLEN 11356.6015 1622.37164 378.553383 31.1139767
WARD 11354.6015 1622.08593 378.486717 31.1084973
JONES 11315.6015 1616.5145 377.186717 31.001648
MARTIN 11136.6015 1590.94307 371.22005 30.511237
BLAKE 11286.6015 1612.37164 376.22005 30.9221959
CLARK 11247.6015 1606.80021 374.92005 30.8153466
SCOTT 9022.6015 1288.94307 300.753383 24.7194562
KING 11086.6015 1583.80021 369.553383 30.3742507
TURNER 11156.6015 1593.80021 371.886717 30.5660315
ADAMS 9022.6015 1288.94307 300.753383 24.7194562
JAMES 11070.6015 1581.5145 369.02005 30.3304151
FORD 11070.6015 1581.5145 369.02005 30.3304151
MILLER 11019.6015 1574.22879 367.32005 30.1906891
已選擇14行。
SQL> select sysdate+hiredate from emp;
select sysdate+hiredate from emp
*
第 1 行出現錯誤:
ORA-00975: 不允許日期 + 日期
利用oracle函數來精確查詢日期
SQL> host cls
SQL> --使用months_between計算工齡
SQL> select ename,(sysdate-hiredate)/30 方式一,months_between(sysdate,hiredate) 方式二
2 from emp;
ENAME 方式一 方式二
-------- ---------- ----------
SMITH 380.720133 375.277548
ALLEN 378.553466 373.180774
WARD 378.4868 373.116258
JONES 377.1868 371.761419
MARTIN 371.220133 365.922709
BLAKE 376.220133 370.793677
CLARK 374.920133 369.535613
SCOTT 300.753466 296.40658
KING 369.553466 364.277548
TURNER 371.8868 366.567871
ADAMS 300.753466 296.40658
JAMES 369.020133 363.729161
FORD 369.020133 363.729161
MILLER 367.320133 362.084
已選擇14行。
SQL> --add_months:加上若干個月
SQL> select add_months(sysdate,123) from dual;
ADD_MONTHS(SYS
--------------
25-6月 -22
SQL> select last_day(sysdate) from dual; 某月最後一天
LAST_DAY(SYSDA
--------------
31-3月 -12
SQL> select next_day(sysdate,'星期日') from dual; 下一個星期日
NEXT_DAY(SYSDA
--------------
01-4月 -12
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-4月 -12 01-1月 -12
轉換函數
隱式轉換
SQL> --隱式數據類型轉換前提:被轉換對象是可以轉換的
顯式轉換:
to_char對日期的轉換
SQL> --2012-3月-25 14:44:00 今天是星期日
SQL> select to_char(sysdate,'yyyy-mon-dd hh24:mi:mm"今天是" day') from dual;
TO_CHAR(SYSDATE,'YYYY-MON-DDHH24:MI:MM"今
-----------------------------------------
2012-3月 -25 14:46:03今天是 星期日
SQL> host cls
SQL> select * from emp;
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 13-7月 -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 13-7月 -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
已選擇14行。
to_char對數字的轉換
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
¥950.00
¥3,000.00
¥1,300.00
已選擇14行。
SQL> select * from v$nls_parameters;
PARAMETER VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ¥
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY ¥
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
PARAMETER VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
已選擇19行。
SQL> host cls
通用函數
這些函數適用於任何數據類型,同時也適用於空值:
SQL> --通用函數
SQL> --NVL2 (expr1, expr2, expr3)
SQL> --當expr1爲null時,返回expr3;否則返回expr2
SQL> select empno,ename,sal,comm,sal*12+nvl2(comm,comm,0)
2 from emp;
EMPNO ENAME SAL COMM SAL*12+NVL2(COMM,COMM,0)
---------- -------- ----- ---------- ------------------------
7369 SMITH 800 9600
7499 ALLEN 1600 300 19500
7521 WARD 1250 500 15500
7566 JONES 2975 35700
7654 MARTIN 1250 1400 16400
7698 BLAKE 2850 34200
7782 CLARK 2450 29400
7788 SCOTT 3000 36000
7839 KING 5000 60000
7844 TURNER 1500 0 18000
7876 ADAMS 1100 13200
7900 JAMES 950 11400
7902 FORD 3000 36000
7934 MILLER 1300 15600
已選擇14行。
SQL> host cls
SQL> --NULLIF (expr1, expr2):當expr1=expr2時,返回null;否則返回expr1
SQL> select nullif('abc','abc') from dual;
NUL
---
SQL> select nullif('abc','abcd') from dual;
NUL
---
abc
SQL> --COALESCE (expr1, expr2, ..., exprn):找到參數列表中,第一個不爲null的值
SQL> select comm,sal,COALESCE(comm,sal) from emp;
COMM SAL COALESCE(COMM,SAL)
---------- ----- ------------------
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
950 950
3000 3000
1300 1300
已選擇14行。
SQL> host cls
條件表達式
SQL> --給員工漲工資:總裁1000 經理800 其他400
SQL> select * from emp;
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 13-7月 -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 13-7月 -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
已選擇14行。
case表達式
SQL> select empno,ename,job,sal 漲前薪水,case job when 'PRESIDENT' then sal+10002 when 'MANAGER' then sal+800
3 else sal+400
4 end 漲後薪水
5 from emp;
EMPNO ENAME JOB 漲前薪水 漲後薪水
---------- -------- --------- ---------- ----------
7369 SMITH CLERK 800 1200
7499 ALLEN SALESMAN 1600 2000
7521 WARD SALESMAN 1250 1650
7566 JONES MANAGER 2975 3775
7654 MARTIN SALESMAN 1250 1650
7698 BLAKE MANAGER 2850 3650
7782 CLARK MANAGER 2450 3250
7788 SCOTT ANALYST 3000 3400
7839 KING PRESIDENT 5000 6000
7844 TURNER SALESMAN 1500 1900
7876 ADAMS CLERK 1100 1500
7900 JAMES CLERK 950 1350
7902 FORD ANALYST 3000 3400
7934 MILLER CLERK 1300 1700
已選擇14行。
decode函數
SQL> select empno,ename,job,sal 漲前薪水,decode(job,'PRESIDENT',sal+1000,
2 'MANAGER', sal+800,
3 sal+400) 漲後薪水
4 from emp;
EMPNO ENAME JOB 漲前薪水 漲後薪水
---------- -------- --------- ---------- ----------
7369 SMITH CLERK 800 1200
7499 ALLEN SALESMAN 1600 2000
7521 WARD SALESMAN 1250 1650
7566 JONES MANAGER 2975 3775
7654 MARTIN SALESMAN 1250 1650
7698 BLAKE MANAGER 2850 3650
7782 CLARK MANAGER 2450 3250
7788 SCOTT ANALYST 3000 3400
7839 KING PRESIDENT 5000 6000
7844 TURNER SALESMAN 1500 1900
7876 ADAMS CLERK 1100 1500
7900 JAMES CLERK 950 1350
7902 FORD ANALYST 3000 3400
7934 MILLER CLERK 1300 1700
已選擇14行。
SQL> spool off