一、什么是函数
任何东西,只要它能接收输入,对输入进行加工并产生输出,它就可以被称为函数。
二、单行函数简介
单行函数只对表中的一行数据进行操作,并且对每一行数据只产生一个输出结果。单行函数可以接受一个或多个参数,其产生的输出结果的数据类型可能与参数的数据类型不同。
单行函数包含:
1.字符型
2.数字型
3.日期型
4.转换型
5.一般型函数
三、单行字符型函数
常用的字符型函数包括:
LOWER、UPPER、INITCAP、CONCAT、SUBSTR、LENGTH、INSTR、TRIM、REPLACE
1.LOWER(列名|表达式):该函数是把字符转换成小写。
SQL> select LOWER('SQL: Structural Query Language') 2 from dual; LOWER('SQL:STRUCTURALQUERYLANG ------------------------------ sql: structural query language
2.UPPER(列名|表达式):该函数是把字符转换成大写。
SQL> select upper ('sql is used exclusively in rdbmses') 2 from dual; UPPER('SQLISUSEDEXCLUSIVELYINRDBMS ---------------------------------- SQL IS USED EXCLUSIVELY IN RDBMSES
3.INITCAP(列名|表达式):该函数是把每个字的头一个字符转换成大写,其余的转换成小写。
SQL> select INITCAP('SQL is an ENGLISH LIKE language') 2 from dual; INITCAP('SQLISANENGLISHLIKELANG ------------------------------- Sql Is An English Like Language
4.CONCAT(列名|表达式,列名|表达式):该函数是把头一个字符串和第二个字符串连接成一个字符串。
SQL> select CONCAT('SQL allows you to manipulate the data in DB', 2 ' without any programming knowlege') 3 from dual; CONCAT('SQLALLOWSYOUTOMANIPULATETHEDATAINDB','WITHOUTANYPROGRAMMINGKNOWLEGE' ---------------------------------------------------------------------------- SQL allows you to manipulate the data in DB without any programming knowlege
5.SUBSTR(列名|表达式,m,[n]):该函数是返回指定的字符串。该字符串是从第m个字符开始,其长度为n。
SQL> select SUBSTR('SQL lets you concentrate on what has to be done',14) 2 from dual; SUBSTR('SQLLETSYOUCONCENTRATEONWHA ---------------------------------- concentrate on what has to be done
在这个例子中我们省略了n,其结果是返回从第14个字符开始一直到结尾的所有字符。
6.LENGTH(列名|表达式):该函数是返回列中或表达式中字符串的长度。
SQL> select LENGTH('SQL does not let you concentrate on how it will be achieved') 2 from dual; LENGTH('SQLDOESNOTLETYOUCONCENTRATEONHOWITWILLBEACHIEVED') ---------------------------------------------------------- 59
7.INSTR(列名|表达式,'字符串',[m],[n]):该函数是返回所给字符串的数字位置,m表示从第m个字符开始搜索,n表示所给字符串出现的次数,它们的默认值都为1。
SQL> select INSTR('SQL allows for dynamic DB changes','F') 2 from dual; INSTR('SQLALLOWSFORDYNAMICDBCHANGES','F') ----------------------------------------- 0 SQL> select INSTR('SQL allows for dynamic DB changes','f') 2 from dual; INSTR('SQLALLOWSFORDYNAMICDBCHANGES','F') ----------------------------------------- 12
8.TRIM([leading|trailing|both]要去掉的字符FROM源字符串):该函数能够从“源字符串”中的头(leading)部,或尾(trailing)部,或从头(leading)部和尾(trailing)部(both)中去掉“要去掉的字符”。
如果没有指定头(leading)或尾(trailing),TRIM函数按默认(both)处理(该函数是8i刚刚引入的,在8i之前的版本中是两个函数LTRIM和RTRIM)。
SQL> select TRIM('?' FROM '?SQL*PLUS is the SQL implementation 2 used in an Oracle RDBMS or ORDBMS.') 3 from dual; TRIM('?'FROM'?SQL*PLUSISTHESQLIMPLEMENTATIONUSEDINANORACLERDBMSORORDBMS.') -------------------------------------------------------------------------------- SQL*PLUS is the SQL implementation used in an Oracle RDBMS or ORDBMS.
也可以通过下面的查询语句来去掉rows之后的两个问号。
SQL> select TRIM('?' FROM ' It can process data in sets of rows??') 2 from dual; TRIM('?'FROM'ITCANPROCESSDATAINSETSO ------------------------------------ It can process data in sets of rows
以上两个例子都没有指出是去掉头部的还是尾部的字符,因此Oracle按默认Both来处理。第一个例子只在头部有“?”而第二个例子只在尾部有“?”,所以Oracle系统可以正确的处理。
下面的例子,TRIM函数的这种用法就要遇到麻烦了。
SQL> select TRIM('s' FROM 'sql*plus is a fourth generation query languages') 2 from dual; TRIM('S'FROM'SQL*PLUSISAFOURTHGENERATIONQUERY --------------------------------------------- ql*plus is a fourth generation query language
在上面的SQL语句中,我们是想去掉尾部的“s”,但Oracle系统把开头的和结尾的“s”都去掉了。这显然不是我们所希望的结果。这时我们可以用trailing选项来解决这个问题。
SQL> select TRIM(trailing 's' FROM 'sql*plus is a fourth generation query languages') 2 from dual; TRIM(TRAILING'S'FROM'SQL*PLUSISAFOURTHGENERATI ---------------------------------------------- sql*plus is a fourth generation query language
在这里就不演示直接使用Leading选项的例子。
9.REPLACE(正文表达式,要搜寻的字符串,替换字符串):该函数是在"正文表达式"中查找"要搜寻的字符串",如果找到了就用"替换字符串"替代。
SQL> select REPLACE('SQL*PLUS supports loops or if statements','supports', 2 'does not support') 3 from dual; REPLACE('SQL*PLUSSUPPORTSLOOPSORIFSTATEMENTS','S ------------------------------------------------ SQL*PLUS does not support loops or if statements
四、数字型函数
常用的数字型函数包括:
ROUND、TRUNC、MOD
1.ROUND(列名|表达式,n):
该函数将列名或表达式所表示的数值四舍五入到小数点后的n位。
2.TRUNC(列名|表达式,n):
该函数将列名或表达式所表示的数值截取到小数点后的n位。
3.MOD(m,n):
该函数将m除以n并取余数。
SQL> select ROUND(168.888,1),TRUNC(168.888,1) 2 from dual; ROUND(168.888,1) TRUNC(168.888,1) ---------------- ---------------- 168.9 168.8 SQL> select MOD(300,400) 2 from dual; MOD(300,400) ------------ 300
五、日期函数
首先演示一下查询数据库的时间例子:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2013-07-07 09:44:36
常用的日期型函数包括:
MONTHS_BETWEEN、ADD_MONTHS、NEXT_DAY、LAST_DAY
1.MONTHS_BETWEEN(日期1,日期2):
该函数是返回日期1和日期2之间的月数。如果日期1大于日期2,其返回的月数为正。如果日期1小于日期2,其返回的月数为负。
2.ADD_MONTHS(日期,n):
该函数是把n个月加到日期上。
3.NEXT_DAY(日期,字符串):
该函数是返回下一个由字符串(星期几)指定的日期。
4.LAST_DAY(日期):
该函数是返回该日期所在月的最后一天。
一个综合的例子:
SQL> select ename,hiredate,LAST_DAY(hiredate),NEXT_DAY(hiredate,'SUNDAY'), 2 MONTHS_BETWEEN(SYSDATE,hiredate) "Months", 3 ADD_MONTHS(hiredate,3) "Revies" 4 from emp; ENAME HIREDATE LAST_DAY( NEXT_DAY( Months Revies ---------- --------- --------- --------- ---------- --------- SMITH 17-DEC-80 31-DEC-80 21-DEC-80 390.690779 17-MAR-81 ALLEN 20-FEB-81 28-FEB-81 22-FEB-81 388.594005 20-MAY-81 WARD 22-FEB-81 28-FEB-81 01-MAR-81 388.529489 22-MAY-81 JONES 02-APR-81 30-APR-81 05-APR-81 387.17465 02-JUL-81 MARTIN 28-SEP-81 30-SEP-81 04-OCT-81 381.33594 28-DEC-81 BLAKE 01-MAY-81 31-MAY-81 03-MAY-81 386.206908 01-AUG-81 CLARK 09-JUN-81 30-JUN-81 14-JUN-81 384.948844 09-SEP-81 SCOTT 19-APR-87 30-APR-87 26-APR-87 314.626263 19-JUL-87 KING 17-NOV-81 30-NOV-81 22-NOV-81 379.690779 17-FEB-82 TURNER 08-SEP-81 30-SEP-81 13-SEP-81 381.981102 08-DEC-81 ADAMS 23-MAY-87 31-MAY-87 24-MAY-87 313.497231 23-AUG-87 JAMES 03-DEC-81 31-DEC-81 06-DEC-81 379.142392 03-MAR-82 FORD 03-DEC-81 31-DEC-81 06-DEC-81 379.142392 03-MAR-82 MILLER 23-JAN-82 31-JAN-82 24-JAN-82 377.497231 23-APR-82 14 rows selected.
六、ROUND和TRUNC函数用于日期型数据
除了可以把ROUND和TRUNC函数用于数字型数据外,还可以把ROUND和TRUNC函数用于日期型数据。
SQL> select ROUND(TO_DATE('25-JUL-13'),'MONTH') 2 from dual; ROUND(TO_ --------- 01-AUG-13 SQL> select TRUNC(TO_DATE('25-JUL-13'),'MONTH') 2 from dual; TRUNC(TO_ --------- 01-JUL-13 SQL> select ename,hiredate,ROUND(hiredate,'YEAR'),TRUNC(hiredate,'YEAR'), 2 ROUND(hiredate,'MONTH'),TRUNC(hiredate,'MONTH') 3 from emp 4 where hiredate like '%81'; ENAME HIREDATE ROUND(HIR TRUNC(HIR ROUND(HIR TRUNC(HIR ---------- --------- --------- --------- --------- --------- ALLEN 20-FEB-81 01-JAN-81 01-JAN-81 01-MAR-81 01-FEB-81 WARD 22-FEB-81 01-JAN-81 01-JAN-81 01-MAR-81 01-FEB-81 JONES 02-APR-81 01-JAN-81 01-JAN-81 01-APR-81 01-APR-81 MARTIN 28-SEP-81 01-JAN-82 01-JAN-81 01-OCT-81 01-SEP-81 BLAKE 01-MAY-81 01-JAN-81 01-JAN-81 01-MAY-81 01-MAY-81 CLARK 09-JUN-81 01-JAN-81 01-JAN-81 01-JUN-81 01-JUN-81 KING 17-NOV-81 01-JAN-82 01-JAN-81 01-DEC-81 01-NOV-81 TURNER 08-SEP-81 01-JAN-82 01-JAN-81 01-SEP-81 01-SEP-81 JAMES 03-DEC-81 01-JAN-82 01-JAN-81 01-DEC-81 01-DEC-81 FORD 03-DEC-81 01-JAN-82 01-JAN-81 01-DEC-81 01-DEC-81 10 rows selected.
七、不同数据类型之间的隐含转换
赋值语句中数据类型之间的隐含转换(Oracle自动转换):
1.将变长字符型(VARCHAR2)或定长字符型(CHAR)转换成数字型(NUMBER);
2.将变长字符型(VARCHAR2)或定长字符型(CHAR)转换成日期型(DATE);
3.将数字型(NUMBER)转换成变长字符型(VARCHAR2);
4.将日期型(DATE)转换成变长字符型(VARCHAR2)。
八、不同数据类型之间的显式转换
Oracle提供了3个转换函数来完成不同数据类型之间的显式转换。
TO_CHAR、TO_NUMBER、TO_DATE
1.TO_CHAR(日期,‘fmt'):
该函数的这种格式把日期型数据转换成变长字符串,其中,fmt为日期模式。
SQL> select ename,to_char(hiredate,'DD/MM/YY') 2 from emp 3 where hiredate like '%82'; ENAME TO_CHAR( ---------- -------- MILLER 23/01/82
常用的日期模式:
a.YYYY:完整的年份数字表示(如2001);
b.YEAR:年份的英文表示(如NINETEEN EIGHTY-SEVEN);
c.MM:用两位数字来表示月份;
d.MONTH:月份完整的英文表示;
e.DY:用3个英文字符的缩写来表示星期几;
f.DAY:星期几的完整的英文表示;
g.DD:几号的数字表示。
查询员工的名字(Name),工资(Salary)和雇佣日期(HIREDATE)的信息。
SQL> select ename "Name",sal "Salary", 2 to_char(hiredate,'fmDdspth "of" Month Year fmHH:MI:SS AM') HIREDATE 3 from emp; Name Salary HIREDATE ---------- ---------- ---------------------------------------------------------------------------------------------------- SMITH 800 Seventeenth of December Nineteen Eighty 12:00:00 AM ALLEN 1600 Twentieth of February Nineteen Eighty-One 12:00:00 AM WARD 1250 Twenty-Second of February Nineteen Eighty-One 12:00:00 AM JONES 2975 Second of April Nineteen Eighty-One 12:00:00 AM MARTIN 1250 Twenty-Eighth of September Nineteen Eighty-One 12:00:00 AM BLAKE 2850 First of May Nineteen Eighty-One 12:00:00 AM CLARK 2450 Ninth of June Nineteen Eighty-One 12:00:00 AM SCOTT 3000 Nineteenth of April Nineteen Eighty-Seven 12:00:00 AM KING 5000 Seventeenth of November Nineteen Eighty-One 12:00:00 AM TURNER 1500 Eighth of September Nineteen Eighty-One 12:00:00 AM ADAMS 1100 Twenty-Third of May Nineteen Eighty-Seven 12:00:00 AM JAMES 950 Third of December Nineteen Eighty-One 12:00:00 AM FORD 3000 Third of December Nineteen Eighty-One 12:00:00 AM MILLER 1300 Twenty-Third of January Nineteen Eighty-Two 12:00:00 AM 14 rows selected.
2.TO_CHAR(数字,‘fmt'):
该函数的这种格式把数字型数据转换成变长字符串。
其中,fmt为数字模式。常用的数字模式包括:
9:位数字;
0:显示前导零;
$:显示美元号;
L:显示本地货币号;
.:显示小数点;
,:显示千位符;
MI:在数的右边显示减号;
PR:把负数用尖括号扩起来。
下面的查询语句用来显示员工的名字(Name)和年薪(Annual Salary),其中显示年薪时要包括美元($)符、千位符(,)和小数点(.),而且要显示小数点后两位数,即使小数点后的数为0也要显示。
SQL> select ename "Name",TO_CHAR(sal*12,'$99,999.00') "Annual Salary" 2 from emp; Name Annual Sala ---------- ----------- SMITH $9,600.00 ALLEN $19,200.00 WARD $15,000.00 JONES $35,700.00 MARTIN $15,000.00 BLAKE $34,200.00 CLARK $29,400.00 SCOTT $36,000.00 KING $60,000.00 TURNER $18,000.00 ADAMS $13,200.00 JAMES $11,400.00 FORD $36,000.00 MILLER $15,600.00 14 rows selected.
3.TO_NUMBER(字符串 [,'fmt]‘):
该函数把字符串转换成数字。
4.TO_DATE(字符串 [,'fmt]’):
该函数把字符串转换成日期型数据。