SQL 函数
函数是SQL的一个非常强大的特性:
对数据进行计算
修改单个数据项
操作行组的输出
格式化显示日期和数字
转换列数据类型
在SQL中有不同类型的函数,包括单行函数和多行函数。单行函数只对单个行进行操作,每行返回一个结果。多行函数可以操作行组来为每组行提供一个结果。
函数使基本查询更强大,本文主要介绍其中的单行函数,它侧重于单行字符、数字和日期函数。
单行函数:
1. 应用范围
用于操作数据项。接受一个或多个参数,并为查询返回的每一行返回一个值。可以是下列之一:
用户提供的值
变量值
列名
表达式
2. 特点
对查询中返回的每一行执行操作
每行返回一个结果
可能返回与引用的数据类型不同的数据值
可能需要一个或者多个参数
可用于SELECT,WHERE,and ORDER BY 子句;可以嵌套
3. 主要分类
a 字符函数:接受字符输入,可以同时返回数字值和数字值
b 数字函数:接受数字输入并返回数值
c 日期函数 :操作日期数据类型的值(所有日期函数返回的值为日期数据类型,但 MONTHS_BETWEEN 函数除外,它返回一个数字。
1 字符函数
主要包括 大小写转换函数 字符处理函数
LOWER CONCAT
UPPER SUBSTR
INITCAP LENGTH
INSTR
LPAD | RPAD
TRIM
REPLACE
大小写转换函数
小写转换:
SQL> select ename,lower(ename)
2 from emp;
ENAME LOWER(ENAM
---------- ----------
SMITH smith
ALLEN allen
WARD ward
JONES jones
MARTIN martin
BLAKE blake
CLARK clark
SCOTT scott
KING king
TURNER turner
ADAMS adams
JAMES james
FORD ford
MILLER miller
14 rows selected.
首字母大写转换:
SQL> select ename,initcap(ename)
2 from emp;
ENAME INITCAP(EN
---------- ----------
SMITH Smith
ALLEN Allen
WARD Ward
JONES Jones
MARTIN Martin
BLAKE Blake
CLARK Clark
SCOTT Scott
KING King
TURNER Turner
ADAMS Adams
JAMES James
FORD Ford
MILLER Miller
14 rows selected.
字符控制函数
concat 函数:将值连接在一起(使用concat只能使用两个参数)
SQL> select concat('good ','dba') from dual;
CONCAT('
--------
good dba
substr 函数: 取一个确定长度的字符串
SQL> select substr('oracle',1,3) from dual;
SUB
---
ora
length 函数: 将字符串的长度显示为数值
SQL> select length('oracle') from dual;
LENGTH('ORACLE')
----------------
6
instr 函数: 后面字符串在前面字符串第一次出现的位置,instr 经常来做判断,判断一个字符串是否在另外一个字符串中。
SQL> select instr('oracle','a') from dual;
INSTR('ORACLE','A')
-------------------
3
lapd 、 rpad 函数:左补全, 右补全
使用字符表达式返回左、右填充到n个字符长度的表达式
SQL> select sal,lpad(sal,4,0),rpad(sal,4,0) from emp;
SAL LPAD(SAL RPAD(SAL
---------- -------- --------
800 0800 8000
1600 1600 1600
1250 1250 1250
2975 2975 2975
1250 1250 1250
2850 2850 2850
2450 2450 2450
3000 3000 3000
5000 5000 5000
1500 1500 1500
1100 1100 1100
950 0950 9500
3000 3000 3000
1300 1300 1300
14 rows selected.
replace 函数:替换函数 查找字符,并进行替换字符
SQL> select replace(13199105196,19910519,'*') from dual;
REPLACE(130
-----------
13*6
trim 函数 :从字符串中修剪开头或结尾的字符
SQL> select trim(' hello ') from dual;
TRIM(
-----
hello
数值函数:
round函数 : 四舍五入到制定的十进制值
SQL> select round(324.43288,3) from dual;
ROUND(324.43288,3)
------------------
324.433
SQL> select round(43.424,-1) from dual;
ROUND(43.424,-1)
----------------
40
SQL> select round(47.3242,-1) from dual;
ROUND(47.3242,-1)
-----------------
50
trunc 函数:截断到制定的十进制值
SQL> select trunc(45.957,2) from dual;
TRUNC(45.957,2)
---------------
45.95
SQL> select trunc(47.4323,-1) from dual;
TRUNC(47.4323,-1)
-----------------
40
SQL> select trunc(354.4323,2) from dual;
TRUNC(354.4323,2)
-----------------
354.43
mod 函数: 返回余数
SQL> select mod(1600,300) from dual;
MOD(1600,300)
-------------
100
日期函数
Oracle内部使用数字存储日期:世纪、年、月、日、小时
默认的日期显示格式为 DD-MON-RR
sysdate 函数 :SYSDATE是一个日期函数,它返回当前数据库服务器的日期和时间。
可以像使用任何其他列名一样使用SYSDATE
修改当前session日期格式
alter session set nls_date_format=‘yyyy-mm-dd hh24:mi:ss day’;
日期的算术运算
在日期上加上或减去一个数字结果仍是日期
两个日期相减返回日期之间的相差天数
可以用小时数除以24,可以加小时到日期上
# 1天以后 系统时间加1天
SQL> select sysdate+1 from dual;
SYSDATE+1
---------
23-MAY-19
#1小时后
SQL> select sysdate,sysdate+1/24 from dual;
SYSDATE SYSDATE+1/24
------------------- -------------------
2019-05-22 18:48:45 2019-05-22 19:48:45
#1分钟后
SQL> select sysdate,sysdate+1/24/60 from dual;
SYSDATE SYSDATE+1/24/60
------------------- -------------------
2019-05-22 18:49:19 2019-05-22 18:50:19
日期操作函数
months_between : 两个日期相差的月数
SQL> select empno,ename,sal,months_between(sysdate,hiredate) months from emp;
EMPNO ENAME SAL MONTHS
---------- ---------- ---------- ----------
7369 SMITH 800 461.186616
7499 ALLEN 1600 459.089842
7521 WARD 1250 459
7566 JONES 2975 457.670487
7654 MARTIN 1250 451.831778
7698 BLAKE 2850 456.702745
7782 CLARK 2450 455.444681
7788 SCOTT 3000 385.1221
7839 KING 5000 450.186616
7844 TURNER 1500 452.476939
7876 ADAMS 1100 383.993068
EMPNO ENAME SAL MONTHS
---------- ---------- ---------- ----------
7900 JAMES 950 449.638229
7902 FORD 3000 449.638229
7934 MILLER 1300 447.993068
14 rows selected.
add_months 函数 : 向指定日期中加上若干月数
#一个月后的现在
SQL> select sysdate,add_months(sysdate,1) from dual;
SYSDATE ADD_MONTHS(SYSDATE,
------------------- -------------------
2019-05-22 18:52:09 2019-06-22 18:52:09
#一年后
SQL> select sysdate,add_months(sysdate,12) from dual;
SYSDATE ADD_MONTHS(SYSDATE,
------------------- -------------------
2019-05-22 18:52:45 2020-05-22 18:52:45
#一年前
SQL> select sysdate,add_months(sysdate,-12) from dual;
SYSDATE ADD_MONTHS(SYSDATE,
------------------- -------------------
2019-05-22 18:53:23 2018-05-22 18:53:23
next_day 函数 : 指定日期的下一个日期
#从当前时间起下一个周一
SQL> select next_day(sysdate,‘MONDAY’) from dual;
NEXT_DAY(SYSDATE,'M
-------------------
2019-05-27 18:54:18
#从当前时间起下一个周一
SQL> select next_day(sysdate,2) from dual;
NEXT_DAY(SYSDATE,2)
-------------------
2019-05-27 18:57:13
last_day 本月的最后一天
#当前时间月份的最后一天
SQL> select sysdate,last_day(sysdate) from dual;
SYSDATE LAST_DAY(SYSDATE)
------------------- -------------------
2019-05-22 18:58:26 2019-05-31 18:58:26
round : 日期四舍五入
#系统时间天数取整,取到天
SQL> select sysdate,round(sysdate) from dual;
SYSDATE ROUND(SYSDATE)
------------------- -------------------
2019-05-22 18:59:52 2019-05-23 00:00:00
#系统时间分钟取整
SQL> select sysdate,round(sysdate,'mi') from dual;
SYSDATE ROUND(SYSDATE,'MI')
------------------- -------------------
2019-05-22 19:00:44 2019-05-22 19:01:00
#系统时间天数取整
SQL> select sysdate,round(sysdate,'dd') from dual;
SYSDATE ROUND(SYSDATE,'DD')
------------------- -------------------
2019-05-22 19:01:36 2019-05-23 00:00:00
trunc 日期截断
#截取系统时间到天
SQL> select sysdate,trunc(sysdate) from dual;
SYSDATE TRUNC(SYSDATE)
------------------- -------------------
2019-05-22 19:03:28 2019-05-22 00:00:00
#零点
SQL> select sysdate,trunc(sysdate,'dd') from dual;
SYSDATE TRUNC(SYSDATE,'DD')
------------------- -------------------
2019-05-22 19:04:16 2019-05-22 00:00:00
#本月的第一天
SQL> select sysdate,trunc(sysdate,'mm') from dual;
SYSDATE TRUNC(SYSDATE,'MM')
------------------- -------------------
2019-05-22 19:04:57 2019-05-01 00:00:00
#今年的第一天
SQL> select sysdate,trunc(sysdate,'yyyy') from dual;
SYSDATE TRUNC(SYSDATE,'YYYY
------------------- -------------------
2019-05-22 19:05:34 2019-01-01 00:00:00