oracle常用函数
使用函数可以大大提高select语句操作数据库的能力。在oracle中函数划分为单行函数和多行函数
单行函数作用于数据库表的某一行并返回一个值:字符函数、数字函数、日期函数、转换函数、其他函数。
多行函数基于数据库多行进行运算,返回一个值:例如对多行记录的某个字段求和、求最大值运算等
字符函数
范例:
观察转小写的操作,将所有的雇员姓名按照小写字母返回
SELECT
LOWER
(ename)
FROM
emp;
范例:
将每一个雇员姓名的开头首字母大写
SELECT
INITCAP(ename)
FROM
emp;
范例:
查询出每个雇员姓名的长度
SELECT
ename,LENGTH(ename)
FROM
emp;
范例:
要求查询出姓名长度正好是5的雇员信息
SELECT
ename,LENGTH(ename)
FROM
emp
WHERE
LENGTH(ename)
=
5
;
范例:
使用字母“_”替换掉姓名中的所有字母“A”
SELECT
REPLACE
(ename,
'A'
,
'_'
)
FROM
emp;
字符串截取操作有两种语法:
语法一:SUBSTR(字符串 | 列,开始点),表示从开始点一直截取到结尾;
SELECT
ename,SUBSTR(ename,
3
)
FROM
emp;
语法二:SUBSTR(字符串 | 列,开始点,结束点),表示从开始点截取到结束点,截取部分内容;
SELECT
ename,SUBSTR(ename,
0
,
3
)
FROM
emp;
SELECT
ename,SUBSTR(ename,
1
,
3
)
FROM
emp;
范例:
要求截取每个雇员姓名的后三个字母
·
正常思路:通过长度-2确定开始点
SELECT
ename,SUBSTR(ename,LENGTH(ename)
-
2
)
FROM
emp;
·
新思路:设置负数,表示从后指定截取位置;
SELECT
ename,SUBSTR(ename,
-
3
)
FROM
emp;
面试题:
请问SUBSTR()函数截取的时候下标从0还是从1开始?
·
在Oracle数据库之中,SUBSTR()函数从0或1开始都是一样的;
·
SUBSTR()也可以设置为负数,表示由后指定截取的开始点;
数字函数
-- 四舍五入
select round(255,-1) from dual;
-- 舍弃小数位
select trunc(255,-1) from dual;
常用日期函数
日期常用的三个公式:
· 日期 + 数字 = 日期,表示若干天之后的日期;
SELECT
SYSDATE
+
3
,SYSDATE
+
300
FROM
dual;
· 日期 – 数字 = 日期,表示若干天前的日期;
SELECT
SYSDATE
-
3
,SYSDATE
-
300
FROM
dual;
· 日期 – 日期 = 数字,表示的是两个日期间的天数,但是肯定是大日期 – 小日期;
范例:
求出每个雇员到今天为止的雇佣天数
SELECT
ename,hiredate,SYSDATE
-
hiredate
FROM
emp;
范例:
求出本月的最后一天日期
SELECT
LAST_DAY(SYSDATE)
FROM
dual;
· NEXT_DAY(日期,星期数):求出下一个指定星期X的日期;
范例:
求出下一个周一
SELECT
NEXT_DAY(SYSDATE,
'星期一'
)
FROM
dual;
范例:
求出四个月后的日期
SELECT
ADD_MONTHS(SYSDATE,
4
)
FROM
dual;
范例:
求出每个雇员到今天为止的雇佣月份
SELECT
ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate))
FROM
emp;
常用的转换函数
SELECT
TO_CHAR(SYSDATE,
'yyyy-mm-dd'
),TO_CHAR(SYSDATE,
'yyyy'
)
year
, TO_CHAR(SYSDATE,
'mm'
)
month
, TO_CHAR(SYSDATE,
'dd'
)
day
FROM
dual;
TO_CHAR(SY YEAR MO DA
---------- ---- -- --
2012-08-12 2012 08 12
但是这个时候的显示数据之中可以发现会存在前导0,如果要想消除掉这个0的话,可以加入一个“fm”。
SELECT
TO_CHAR(SYSDATE,
'fmyyyy-mm-dd'
)
day
FROM
dual;
DAY
----------
2012
-
8
-
12
正常人都加0,所以这个标记知道就行了,可是在Oracle之中,DATE里面是包含了时间的,但是之前的代码没有显示出时间,要想显示时间则需要增加标记:
SELECT
TO_CHAR(SYSDATE,
'fmyyyy-mm-dd hh24:mi:ss'
)
day
FROM
dual;
DAY
-------------------
2012-8-12 16:13:38
一定要注意,使用TO_CHAR()函数之后,所有的内容都是字符串,不再是之前的DATE型数据,TO_CHAR()函数也可以用于数字的格式化上,这个时候每一个“9”表示一位数字的概念,而不是数字9的概念。
SELECT
TO_CHAR(
89078907890
,
'L999,999,999,999,999'
)
FROM
dual;
TO_CHAR(89078907890,'L999,999,
------------------------------
¥89,078,907,890
其中的字母“L”,表示的是“Local”的含义,即:当前的所在的语言环境下的货币符号。
b、TO_DATE()函数
此函数的主要功能是将一个字符串变为DATE型数据。
SELECT
TO_DATE(
'1989-09-12'
,
'yyyy-mm-dd'
)
FROM
dual;
--------------
12-9月 -89
常用其他函数
a、NVL()函数,处理null
范例:
要求查询出每个雇员的全部年薪
SELECT
ename,sal,comm,(sal
+
NVL(comm,
0
))
*
12
,NVL(comm,
0
)
FROM
emp;
b、DECODE()函数:多数值判断
DECODE()函数非常类似于程序中的if…else…语句,唯一不同的是DECODE()函数判断的是数值,而不是逻辑条件。
例如,现在要求显示全部雇员的职位,但是这些职位要求替换为中文显示:
·
CLERK:办事员;
·
SALESMAN:销售;
·
MANAGER:经理;
·
ANALYST:分析员;
·
PRESIDENT:总裁;
这种判断肯定是逐行进行判断,所以这个时候就必须采用DECODE(),而此函数的语法如下:
DECODE(数值
|
列 ,判断值1,显示值1,判断值2,显示值2,判断值3,显示值3,…)
范例:
实现显示的操作功能
SELECT
empno,ename,job,DECODE(job,'CLERK','办事员','SALESMAN','销售人员','MANAGER','经理','ANALYST','分析员','PRESIDENT','总裁')
FROM
emp;
DECODE()函数是整个Oracle之中最具特点的函数,一定要将其掌握。