单行函数
概念
单行函数分为:字符串函数、数值函数、日期函数、转换函数、通用函数。所有的单行函数可以在SQL语句的任意位置上出现。
语法结构
返回值 函数名称(列 | 数据)
字符串函数
概念
对字符串数据进行处理,在Oracle中对于此类函数定义有如下几种:UPPER()、LOWER()、INITCAP()、REPLACE()、LENGTH()、SUBSTR()。
UPPER()、LOWER——大小写转换函数
1)语法格式
- UPPER():转大写,字符串 UPPER(列 | 字符串)
- LOWER():转小写,字符串 LOWER(列 | 字符串)
SELECT LOWER('Hello'), UPPER('Hello') FROM dual;
dual表:验证字符串函数时,必须保证编写的是完整的SQL语句,为了可以方便的使用函数验证,我们就会使用dual这张虚拟表。
2)应用范例
要求用户输入查询的雇员姓名,输出并所有信息:
SELECT * FROM EMP WHERE ENAME = UPPER('&inputname');
- &inputname:替代变量,可以由键盘输入替换它的值。
INITCAP()——首字母大写
1)语法格式
SELECT INITCAP('helloWorld') FROM dual;
返回Helloworld。
2)应用范例
将所有雇员姓名首字母转为大写:
SELECT INITCAP(ENAME) FROM EMP;
LENGTH()——计算字符串长度
1)语法格式
数字 LENGTH(列 | 字符串数据)
2)应用范例
查询出所有雇员及其姓名长度:
SELECT ENAME, LENGTH(ENAME) LENGTH FROM EMP;
查询雇员姓名长度为5的所有雇员信息:
SELECT * FROM EMP WHERE LENGTH(ENAME) = 5;
REPLACE()——字符串替换
1)语法格式
字符串 REPLACE(列 | 数据, 要查找内容, 新的内容)
2)应用范例
将所有雇员姓名之中的字母A替换为”_”:
SELECT REPLACE(ENAME, UPPER('a'), '_') FROM EMP;
SUBSTR()——字符串截取
1)语法格式
字符串 SUBSTR(列 | 数据, 开始点)
字符串 SUBSTR(列 | 数据, 开始点, 长度)
- 第一种:从指点开始点一直截取到结尾。
- 第二种:截取指定范围的子字符串。
- SUBSTR()是从下标识从1开始的,即使设置的是0,也会从1开始。
2)应用范例
a.截取雇员姓名的前三个字母:
SELECT ENAME, SUBSTR(ENAME, 1, 3) FROM EMP;
b.截取所有雇员姓名的后三个字母:
- 方法一:传统方法
SELECT ENAME, SUBSTR(ENAME, LENGTH(ENAME) -2, 3) FROM EMP;
- 方法二:负数索引(只有Oracle支持负数索引)
SELECT ENAME, SUBSTR(ENAME, -3) FROM EMP;
SUBSTR()支持使用负数索引,这里的-3表示从倒数第三个位置开始截取。
数值函数
针对数字进行处理的函数,主要由三个函数:ROUND()、TRUNC()、MOD()。
ROUND()——四舍五入
1)语法格式
数字 ROUND(列 | 数字 [, 保留小数位])
- 如果不设置小数位表示不保留。
2)应用范例
SELECT
ROUND(9404.6789), 9405,小数点四舍五入
ROUND(9404.6789, 2), 9404.68,保留两位小数
ROUND(9404.6789, -2), 9400,整位取整,四舍五入
ROUND(9484.6789, -2), 9500
ROUND(-502.123), -502,四舍五入
ROUND(-502,523) -503
FROM dual;
TRUNC()——截取小数
语法与ROUND相似,直接抹掉,不四舍五入
SELECT
TRUNC(9404.6789), 9404,去掉小数位
TRUNC(9404.6789, 2), 9404.67,保留两位小数
TRUNC(9404.6789, -2), 9400,整位取整,不四舍五入
TRUNC(9484.6789, -2), 9400
TRUNC(-502.123), -502
TRUNC(-502,523) -502
FROM dual;
MOD——求模(求余数)
1)语法格式
数字 MOD(列1|数字1 , 列2|数字2)
2)应用范例
SELECT MOD(10, 3) FROM dual; 结果=1
日期函数
Oracle数据库中存在一个数据伪列SYSDATE和SYSTIMESTAMP(时间戳),以获得当前系统时间。
SELECT SYSDATE FROM dual; --返回04-4月 -18
SELECT SYSTIMESTAMP FROM dual; --返回04-4月 -18 12.50.51.455000 下午 +8:00
日期的三种计算模式
- 日期 + 数字 = 日期(若干天之后的日期)
- 日期 - 数字 = 日期(若干天之前的日期)
- 日期 - 日期 = 数字(两个日期间的天数)
SELECT SYSDATE+10 FROM dual; --输出10天之后的日期
计算每位雇员到今天为止的雇佣天数:
SELECT ENAME, SYSDATE - HIREDATE FROM EMP;
日期处理函数
利用日期处理函数可以表面闰年、闰月的问题,能够得到更准确的年或月结果。
MONTHS_BETWEEN()
1)语法格式
计算两个日期间所经历的月数总和。
数字 MONTHS_BETWEEN(日期1, 日期2)
2)应用范例
计算每一位雇员到今天的雇佣总月数:
SELECT ENAME, MONTHS_BETWEEN(SYSDATE, HIREDATE) FROM EMP;
计算每一位雇员到今天的雇佣总年数:
SELECT ENAME, TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE)/12) YEARS FROM EMP;
ADD_MONTHS()
计算若干月之后的日期
1)语法格式
ADD_MONTHS(日期, 月数)
2)应用范例
计算4个月之后的日期:
SELECT ADD_MONTHS(SYSDATE, 4) FROM dual;
LAST_DAY()
计算指定日期所在月的最后一天。
1)语法格式
日期 LAST_DAY(日期)
2)应用范例
计算当前日期所在月的最后一天:
SELECT LAST_DAY(SYSDATE) FROM DUAL;
查询出所有在雇佣所在月倒数第二天被雇佣的雇员信息:
SELECT * FROM EMP WHERE LAST_DAY(HIREDATE)-2 = HIREDATE;
NEXT_DAY()
计算下一个指定的星期。
1)语法格式
日期 NEXT_DAY(日期, 一周时间数)
2)应用范例
计算下一个周二的日期:
SELECT NEXT_DAY(SYSDATE,'星期二') FROM DUAL;
查询所有雇员的雇佣日期到今天共雇佣多少年,多少月,多少日
SELECT ENAME, HIREDATE,
TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE)/12) YEARS,
TRUNC(MOD(MONTHS_BETWEEN(SYSDATE, HIREDATE),12)) MONTHS,
TRUNC(SYSDATE - ADD_MONTHS(HIREDATE, MONTHS_BETWEEN(SYSDATE, HIREDATE))) DAYS
FROM EMP;
转换函数
Oracle中共有三种数据类型:字符串、数字、日期。所以相应的,共有三种转换函数:TO_CHAR()、TO_DATE()、TO_NUMBER()。
TO_CHAR()——转字符串
1)语法格式
字符串 TO_CHAR(列|日期|数字, 转换格式)
- 日期转换为字符串:年(yyyy)、月(mm)、日(dd)、时(hh、hh24)、分(mi)、秒(ss);
- 数字转换为字符串:任意的以为数字(9)、货币(L,本地货币)。
2)应用示例
日期转字符串:
SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd hh:mi:ss') FROM DUAL;
查询出在2月雇佣的所有雇员:
SELECT ENAME FROM EMP WHERE TO_CHAR(HIREDATE, 'mm') = '02';
SELECT ENAME FROM EMP WHERE TO_CHAR(HIREDATE, 'mm') = 2;
Oracle数据库中提供有数据类型自动转换功能,所以第二条查询语句也正确。
数字转字符串:
SELECT TO_CHAR(123456789, '999,999,999') FROM DUAL; --输出123,456,789
数字转货币字符串:
SELECT TO_CHAR(123456789, 'L999,999,999') FROM DUAL; --输出¥123,456,789
如果转换格式位数不匹配,则会输出’#’字符。
TO_DATE()——转换日期
1)语法格式
TO_DATE(字符串, 转换格式)
2)应用范例
字符串转日期:
SELECT TO_DATE('2001-02-14', 'yyyy-mm-dd') FROM DUAL;
TO_NUMBER()——转数字
1)语法格式
TO_NUMBER(字符串)
将字符串转换为数字。
通用函数(Oracle特有)
Oracle中提供有两个简单的数据处理函数:NVL()、DECODE()。
NVL()——处理null
1)语法格式
NVL(列|null, 为空的默认值)
如果列上的数据为null,则使用列的数据,否则使用为空的默认值。
DECODE()——多数值判断
1)语法格式
根据不同结果在输出时进行数据转换。
DECODE(列, 匹配内容1, 显示内容1, 匹配内容2, 显示内容2, 默认值)
2)应用范例
将所有雇员的CLERK与SALESMAN职位换成中文输出:
SELECT EMPNO, ENAME, JOB, DECODE(JOB, 'CLERK','办事员','SALESMAN','销售','暂无此信息') FROM EMP;