在数据库系统中,每个数据库之间唯一不同的最大区别点就在于函数的支持上,使用函数可以完成一系列的操作功能
单行函数语法:
function_name(column|expression,[arg1,arg2,...]);
参数说明:
function_name:函数名称
column:
expression:字符串或计算表达式
arg1,arg2:在函数中使用参数
单行函数分类:
round函数有几个参数字符函数:接受字符输入并且返回字符或数值
数值函数:接受数值输入并返回数值
日期函数:对日期型数据进行操作
转换函数:从一种数据类型转换为另一种数据类型
通用函数:NVL函数,DECODE函数
字符函数:
是专门处理字符的,例如,可以将大写字符变小,还能求字符的长度
范例:
将小写字母变为大写字母
select upper('smith') from dual ;
范例:
一般用户在查询一个人姓名的时候才有可能考虑这个人的姓名是大写字母存的还是小写字母保存的呢?
那么此时,为了方便用户的使用就可以使用upper函数完成
select * from emp where ename = upper('smith');
还可以使用lower()函数将一个字符串变为小写字母表示:
select lower('hello world') from dual ;
还可以使用initcap()函数将单词的第一个字母大写
select initcap('HELLO WORLD') from dual ;
范例:使用此函数将雇员表中的雇员姓名变为开头字母大写
select initcap(ename) from emp ;
字符串除了可以使用"||"连接之外,还可以使用concat()函数进行连接操作
select concat('hello' , 'world') from dual ;
此时已经完成了连接,但是此种方式肯定不如||好使
在字符函数中可以进行字符串的截取,求出字符串的长度,进行指定内容的替换
字符串的截取:substr()
字符串的长度:length()
内容替换:replace()
select substr('hello' , 1 ,3) 截取字符串
length('hello')
replace('hello' , 'l' ,'x')字符串替换
但是在用subtr()函数的时候有一点需要提醒大家注意,跟面试有关
Oralce中substr()函数的截取点是从0还是1开始
|-从0或从1开始效果是一样的,因为oracle比较智能
范例:要求显示所有雇员的姓名以姓名的后三个字符
select ename , substr(ename , -3 , 3) from emp ;
数值函数:
数值函数主要是包含以下几种:
四舍五入:ROUND()
截断小数位:TRUNC()
取余(取模):MOD()
范例:执行四舍五入操作
select round(798.536) from dual ;
范例:保留两位小数
select round(789.536 , 2) from dual ;
在使用round()函数中还有一点非常有意思,可以直接对整数进行四舍五入的进位
select round(789.536, -2) from dual ;
日期函数:
在Oracle中提供了很多与日期操作相关的函数,包括加减日期等扥和,但是在日期进行加或减结果的时候有一些规律
日期-数字=日期
日期+数字=日期
日期-日期=数字(天数)
范例:显示10部门雇员进入公司的星期数
如果想要完成此操作,则首先必须知
道当前的日期,在Oracle中可以通过以下的操作求出当前日期,使用sysdate表示
select sysdate from dual ;
求出星期数:当前日期-雇佣日期=天数/7=星期数
select empno , ename , round((sysdate-hiredate)/7) from emp ;
在Oracle中提供了一下的日期函数支持:
MONTHS_BETWEEN():求出给定日期范围的月数
ADD_MONTH():在指定日期上加上指定的月数,求出之后的日期
NEXT_DAY():下一个的今天是哪一个日期
LAST_DAY():求出给定日期的最后一天日期
范例:验证MONTHS_BETWEEN()
select empno , ename , months_between(sysdate , hiredate) from emp ;
雇员的工作:
clerk :业务员
salesman :销售人员
manager:经理
analyst:分析员
president总裁
要求查询出雇员的编号,姓名,雇用日期及工作,将工作替换成以上的信息
select empno , ename , hiredate , decode(job , 'clerk ' , '业务员' decode(job , 'salesman' , '销售人员')) from emp ;
出佣金高于薪金的员工
comm 字段表示佣金或奖金, comm >sal
select ename from emp as e where em > e.sal ;
出佣金高于薪金的60%的员工
select ename from emp as e where em > (e.sal*0.6);
出部门10中所有MANAGER和部门20中所有CLERK的详细资料
select * from emp as e where job = decode(e.deptno , 10 , 'MANAGER' , 20 , 'CLERK') ;
select * from emp as e where (e.deptno = 10 and e.job = 'MANAGER') or (e.deptno = 20 and e.job = 'CLERK');
出部门10中所有MANAGER,部门20中所有CLERK,既不是MANAGER又不是CLERK但薪金大于或等于2000的所有员工的详细资料
select * from emp as e where (e.deptno = 10 and e.job ='MANAGER') or (e.deptno = 20 and e.job = 'CLERK') or (e.job not in ('MANAGER' , 'CLERK') and e.sal >= 2000);
出收取佣金的员工的不同工作
select distinct e.job from emp as e where em is not null ;
出不收佣金或收取佣金低于100的员工
ame from emp as e where em is null or em < 100 ;
出各月倒数第三天受雇的员工(使用last_day()函数进行处理)
ame from emp as e where hiredate = last_day(hiredate)-2 ;
显示所有员工的姓名,工作和薪金,按工作的降序排序,若工作相同则按薪金排序
ame , e.job , e.sal from emp as e order by e.job desc , e,salasc ;
显示所有员工的姓名,加入公司的年份和月份,按收复日期所在月排序,若月份相同则将最早年份的员工排在最前面
显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在月排序,若月份相同则将最早年份的员工拍在最前面
ame , to_char(hiredate , 'yyyy') year , to_char(hiredate , 'MM') month from emp as e order by month ,year ;
显示在一个月为30天的情况所有员工的日薪金,忽略余数
ame , round(sal/30) from emp ;
出在(任何年份的)2月受聘的所有员工
select * from emp where to_char(hierdate , 'MM') = '
02' ;
对于每个员工,显示其加入公司的天数
ame , round(sysdate-e.hiredate) from emp ;
显示姓名字段的任何位置包含"A"的所有员工的姓名
ame from emp as e ame like '%A%';
以年月日的方式显示所有员工的服务年限
ame , trunc(months_between(sysdate , hiredarte)/12) year , trunc(mod(months_between(sysdate,hiredate) , 12)) mon , trunc(mod(sysdate-hiredate , 30)) day from emp as e ;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论