Some notes of Learning Oralce.
函数
数学函数
函数 | 功能 | 实例 | 结果 |
---|---|---|---|
abs() | 求绝对值函数 | abs(-5) | 5 |
sqrt() | 求平方根函数 | sqrt(2) | 1.41421356 |
power() | 求幂函数 | power(2,3) | 8 |
如:
使用求绝对值函数
abs
1
SELECT abs(-5) FROM dual;
使用求平方根函数
sqrt
1
SELECT sqrt(2) FROM dual;
使用
ceil
函数1
SELECT ceil(2.35) FROM dual;
使用
floor
函数1
SELECT floor(2.35) FROM dual;
使用四舍五入函数 round()
格式:1
2```SQL
SELECT round(45.923,2), round(45.923,0), round(45.923,-1) FROM dual;
字符型函数
函数名 | 功能 | 实例 | 结果 |
---|---|---|---|
ascii | 获得字符的ASCII码 | Ascii(‘A’) | 65 |
chr | 返回与ASCII码相应的字符 | Chr(65) | A |
lower | 将字符串转换成小写 | lower(‘SQL Course’) | sql course |
upper | 将字符串转换成大写 | upper(‘SQL Course’) | SQL COURSE |
initcap | 将字符串转换成每个单词以大写开头 | initcap(‘SQL course’) | Sql Course |
concat | 连接两个字符串 | concat(‘SQL’, ‘ Course’) | SQL Course |
substr | 给出起始位置和长度,返回子字符串 | substr(‘String’,1,3) | Str |
length | 求字符串的长度 | length(‘Wellcom’) | 7 |
trim | 在一个字符串中去除另一个字符串 | trim(‘S’ FROM ‘SSMITH’) | MITH |
replace | 用一个字符串替换另一个字符串中的子字符串 | replace(‘ABC’, ‘B’, ‘D’) | ADC |
如:
如果不知道表的字段内容是大写还是小写,可以转换后比较。
输入并执行查询:1
2
3SELECT empno, ename, deptno
FROM emp
WHERE lower(ename) = 'blake';显示名称以“W”开头的雇员,并将名称转换成以大写开头。
输入并执行查询:1
2
3SELECT empno,initcap(ename),job
FROM emp
WHERE substr(ename,1,1) = 'W';显示雇员名称中包含 “S” 的雇员名称及名称长度。
输入并执行查询:1
2
3SELECT empno,ename,length(ename)
FROM emp
WHERE instr(ename, 'S', 1, 1)>0;
日期型函数
Oracle 使用内部数字格式来保存时间和日期,包括世纪、年、月、日、小时、分、秒。缺省日期
格式为DD-MON-YY
。SYSDATE 是返回系统日期和时间的虚列函数。
如:08-05月-03
代表 2003 年 5 月 8 日。
SYSDATE:返回系统日期和时间的虚列函数。
如:返回系统的当前日期。
输入并执行查询:1
SELECT sysdate FROM dual;
对两个日期相减,得到相隔天数。
通过加小时来增加天数,24 小时为一天,如 12 小时可以写成 12/24 (或 0.5 )。
如:
假定当前的系统日期是 2003 年 2 月 6 日,求再过 1000 天的日期。
输入并执行查询:1
SELECT sysdate + 1000 AS "NEW DATE" FROM dual;
两个日期相减1
select to_date('1-1月-2000') - to_date('1-8月-1999') from dual;
其它日期函数
函数 | 功能 | 实例 | 结果 |
---|---|---|---|
months_between | 返回两个日期间的月份 | months_between (‘04-11月-05’,’11-1月-01’) | 57.7741935 |
add_months | 返回把月份数加到日期上的新日期 | add_months(‘06-2月-03’,1) add_months(‘06-2月-03’,-1) | 06-3月-03 06-1月-03 |
next_day | 返回指定日期后的星期对应的新日期 | next_day(‘06-2月-03’,’星期一’) | 10-2月-03 |
last_day | 返回指定日期所在的月的最后一天 | last_day(‘06-2月-03’) | 28-2月-03 |
round | 行四舍五入 | round(to_date(‘13-2月-03’),’YEAR’) round(to_date(‘13-2月-03’),’MONTH’) round(to_date(‘13-2月-03’),’DAY’) |
01-1月-03 01-2月-03 16-2月-03 |
(按照四舍五入)
如:
返回 2003 年 2 月的最后一天。
输入并执行查询:1
SELECT last_day('08-2月-03') FROM dual;
假定当前的系统日期是 2003 年 2 月 6 日,显示部门 10 雇员的雇佣天数。
输入并执行查询:1
2
3SELECT ename, round(sysdate-hiredate) DAYS
FROM emp
WHERE deptno = 10;
转换函数
自动类型转换
1 | SELECT '12.5'+11 FROM dual; |
1 | Select ‘12.5’||11 from dual; |
日期类型转换
日期型转字符型
将日期转换成带时间和星期的字符串并显示。
执行以下查询:1
SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS AM DY') FROM dual;
将日期显示转换成中文的年月日。
输入并执行查询:1
SELECT TO_CHAR(sysdate,'YYYY"年"MM"月"DD"日"') FROM dual;
字符型转日期型
往 emp
表中插入记录1
2
3
4insert into emp
values(8888,'张三','CLERK',7369,to_date('1-1月-2000'),1000,10,10);
insert into emp
values(8889,'李四','CLERK',7369,to_date('2000-01-01','YYYY-MM-DD'),1000,10,10);
其他常用函数
空值的转换
如果对空值NULL不能很好的处理,就会在查询中出现一些问题。在一个空值上进行算术运算的结果都是NULL。
最典型的例子是,在查询雇员表时,将工资sal字段和津贴字段comm进行相加,如果津贴为空,则相加结果也为空,这样容易引起误解。
使用nvl函数,可以转换NULL为实际值。该函数判断字段的内容,如果不为空,返回原值;为空,则返回给定的值。
如下3个函数,分别用新内容代替字段的空值:
nvl(comm, 0)
:用 0 代替空的 Comm 值。nvl(hiredate, '01-1月-97')
:用 1997 年 1 月 1 日代替空的雇佣日期。nvl(job, '无')
:用“无”代替空的职务。
使用 nvl
函数转换空值。
执行以下查询:1
2SELECT ename, nvl(job, '无'), nvl(hiredate, '01-1月-97'), nvl(comm, 0)
FROM emp;
decode
函数
decode
函数可以通过比较进行内容的转换,完成的功能相当于分支语句。
在参数的最后位置上可以存在单独的参数,如果以上比较过程没有找到匹配值,则返回该参数的值,如果不存在该参数,则返回 NULL 。
将职务转换成中文显示。
执行以下查询:1
2SELECT ename, decode(job, 'MANAGER', '经理', 'CLERK','职员', 'SALESMAN','推销员', 'ANALYST','系统分析员','未知')
FROM emp;
最大、最小值函数
greatest
返回参数列表中的最大值,least
返回参数列表中的最小值。
如果表达式中有 NULL ,则返回 NULL 。