单行函数

--单行函数
/*
  字符函数
*/
--小写转大写 upper()
select upper('hello accp!') from dual ;
--大写转小写 lower()
select lower('HELLO ACCP!') from dual ;
--单词首字母大写,其余小写 initcap()
select initcap('hello accp!') from dual ;
--返回指定字符串的十进制数 ascii()
select ascii('\') ,ascii('n') n from dual ;
--返回指定整数对应的字符串 chr()
select chr(54740) zhao from dual ;
--字符串连接 concat()
select concat('0512-','88889999') from dual ;
--在一个字符串中搜索指定的字符,返回发现指定的字符的位置.INSTR(C1,C2,I,J)
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1
select instr('hello accp welcome to you !','o',6,2) from dual ;//6为查找的起始位置(从第6个位置开始查找),2为字符串出现第几次
--返回字符串的长度 length()
select length('hello accp!') from dual ;

 

 

--粘贴字符 lpad(),rpad() 在左边或右边插入指定字符(根据指定返回结果长度循环插入指定字符)
select lpad(rpad('gao',10,'*'),17,'*') from dual ; --结果 *******gao*******
select rpad('hello',15,'accp') from dual ; --结果 helloaccpaccpac
--删除字符串 ltrim() rtrim() trim()
select '  accp  ' str from dual ;
select ltrim('  accp  ') str from dual ;
select rtrim('  accp  ') str from dual ;
select ltrim(rtrim('  accp  ',' '),' ') str from dual ;
select trim(' ' from '  accp  ') str from dual ;
--截取字符串 substr(str,startIndex,length)
select substr('hello accp!',1,7) str1,substr('hello accp!',0,7) str2 from dual ;
--结果一样都是hello a
--查询雇员姓名的最后三个字母
select substr(ename,-3,3) ename from emp ;
--字符串内容替换 replace()
select replace('  accp  ',' ') str from dual ;      --accp
select replace('  accp  ',' ','*') str from dual ;  --**accp**

/*
       数值函数
      
*/
--返回大于指定值的最小的的整数 ceil()
select ceil(68.49),ceil(-68.49) from dual ; --69,-68
--返回小于指定值的最大整数
select floor(68.49),floor(-68.49) from dual ; --68,-69
--四舍五入 round()
select round(789.536),round(789.536,2),round(789.536,-2) from dual ;  --790,789.54,800
--截断小数位 trunc()
select trunc(789.536),trunc(789.536,2),trunc(789.536,-2) from dual ;  --789,789.53,700
--取余mod()
select mod(10,3) from dual ; --1
--返回一个数值的符合 sign()
select sign(5),sign(0),sign(-5) from dual ;  --1,0,-1

/*
       日期函数
*/
--当前日期 sysdate
select sysdate from dual ;
--查询10部门雇员进入公司的星期数
select floor((sysdate-hiredate)/7) "weeks" from emp ;
--求出给定日期范围的月数 months_between()
select floor(months_between(sysdate,'27-2月 -83')) "months" from dual ;
--在指定的日期上加上指定的月数求出之后的日期
select add_months(sysdate,12) "new_date" from dual ;
--求出下一个指定星期对应的日期
select next_day(sysdate,'星期五') from dual ;
--求出指定日期的最后一天 last_day()
select last_day(sysdate) from dual ;


/*
       转换函数
*/
--转换成字符串 to_char()
/*
YYYY:四位表示的年份
YYY,YY,Y:年份的最后三位、两位或一位,缺省为当前世纪
MM:01~12的月份编号
MONTH:九个字符表示的月份,右边用空格填补
MON:三位字符的月份缩写
WW:一年中的星期    
D:星期中的第几天
DY/DAY:显示星期几
DD:月份中的第几天
DDD:年所中的第几天
DAY:九个字符表示的天的全称,右边用空格补齐
HH,HH12:一天中的第几个小时,12进制表示法
HH24:一天中的第几个小时,取值为00~23
MI:一小时中的分钟
SS:一分钟中的秒
SSSS:从午夜开始过去的秒数

*/
select to_char(hiredate,'yyyy/mm/dd') "date" from emp ;    --格式化日期到字符串
select to_char(hiredate,'fmyyyy/mm/dd') "date" from emp ;  --fm去前导零
select to_char(sysdate,'fmyyyy/mm/dd hh24:mi:ss') "date" from emp ;
select to_char(sal,'L99,999') "sal" from emp ;             --用当地货币表示法
select to_char(sal,'$99,999') "sal" from emp ;             --指定美元货币表示法
/*
to_char函数特殊用法

to_char(sysdate,'d') 每周第几天
to_char(sysdate,'dd') 每月第几天
to_char(sysdate,'ddd') 每年第几天
to_char(sysdate,'ww') 每年第几周
to_char(sysdate,'mm') 每年第几月
to_char(sysdate,'q') 每年第几季
to_char(sysdate,'yyyy') 年
*/
select to_char(sysdate,'ww') from dual ;   --今年第38周
--将字符串转换成日期 to_date(string,'format')
select to_date('2009-9-18','yyyy-mm-dd') from dual ;
--将字符串转换成数字 to_number(string)
select to_number('123')+to_number('123') from dual ;

--1 查询部门30中的所有员工
select * from emp where deptno=30;

--2 列出所有办事员(CLERK)的姓名,编号和部门编号
select ename,empno,deptno from emp where lower(job)='clerk';

--3 找出佣金高于薪金的员工
/*
  truncate table emp ;
  select * from emp;
  insert into emp select * from scott.emp;
*/
select * from emp where comm > sal;

--求出每个雇员的年薪
/*
   nvl(arg,value) 如果前面的arg值为null,那么返回后面的value值   
*/
select (sal+nvl(comm,0))*12 income ,ename from emp;

--4 找出佣金高于薪金的60%的员工
select * from emp where comm>sal*0.6;

--5 找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料
select * from emp
where (deptno=10 and lower(job)='manager') or (deptno=20 and lower(job)='clerk');

--6 找出部门10中所有经理(MANAGER),部门20中的所有办事员(CLEAK),
--  既不是经理又不是办事员但薪金大于或等于2000的所有员工的详细资料
select * from emp
where (deptno=10 and lower(job)='manager') or
      (deptno=20 and lower(job)='clerk') or
      (sal>=2000 and lower(job) not in ('manager','clerk'));

--7 找出收取佣金的员工的不同工作
/*
    null类型数据要用 is null和is not null来判断,其它的任何判断都是错误的
    如=null,<null等.
    select nvl(comm,0) from emp;
    select * from emp where comm is null;
    select * from emp where comm is not null ;
*/
select distinct job from emp
where comm is not null ;

--8 找出不收取佣金或收取佣金低于100的员工
select * from emp
where comm is null or comm<100;

--9 找出各月倒数第3天受雇的所有员工
select * from emp where last_day(hiredate)-2=hiredate ;

--10 找出早于12年前受雇的员工
select * from emp where months_between(sysdate,hiredate)/12 > 12 ;

--11 以首字母大写的方式显示所有员工的姓名
select upper(ename) from emp;

--12 显示正好为5个字符的员工的姓名
select ename from emp where ename like '_____';

--13 显示不带有"R"的员工的姓名
select ename from emp where ename not like '%R%';

--14 显示所有员工的姓名的前三个字符
select substr(ename,1,3) ename from emp ;

--15 显示所有员工的姓名,用"a"代替所有的"A"
select replace(ename,'A','a') ename from emp ;

--16 显示满10年服务年限的员工的姓名和受雇日期
select ename,hiredate from emp where months_between(sysdate,hiredate)/12 > 10 ;

--17 显示员工详细信息,按姓名排序
select * from emp order by ename;

--18 显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在前面
select ename,hiredate from emp order by hiredate asc ;

--19 显示所有员工的姓名,工作和薪金,按工作的降序排序,若工作相同则薪金排序
select ename,job,sal from emp order by job desc,sal;

--20 显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在月排序,若月份相同则将
--最早年份的员工排在前面
select ename,to_char(hiredate,'YYYY') year,to_char(hiredate,'MM') month from emp order by month,year;

--21 显示在一个月为30天的情况,所有员工的日薪金,忽略余数
select round(sal/30) from emp ;

--22 找出在(任何年份的)2月受雇的所有员工
select * from emp where to_char(hiredate,'mm')=2;

--23 对于每个员工,显示其加入公司的天数
select round(sysdate-hiredate) day_num,ename from emp;

--24 显示姓名字段的任何位置包含"A"的所有员工的姓名
select ename from emp where ename like '%A%' ;

--25 以年月日的方式显示所有员工的服务年限(大概)
select  trunc(temp.days/365) years,
        trunc((temp.days-trunc(temp.days/365)*365)/30) months,
        trunc(temp.days-(trunc(temp.days/365)*365+trunc((temp.days-trunc(temp.days/365)*365)/30)*30)) days
     from  (select ceil(sysdate-hiredate) days from emp ) temp ;

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值