Oracle学习记录 七 继续接六的

下面是转换函数

  1. to_char

select to_char(sysdate,'yyyy') from dual;

select to_char(sysdate,'fmyyyy-mm-dd') from dual;

select to_char(sysdate,'yyyy-mm-dd') from dual;

select to_char(sysdate, 'DDD') from dual;    一年中的第几天

select to_char(sysdate, 'DD') from dual;    一月中的第几天

select to_char(sysdate, 'D') from dual;    一星期中的第几天,这并不是星期几,因为第一天是从周日算的

其中有fm代表去掉多余的0和空格

http://zhidao.baidu.com/link?url=VtGQ0DbPYOmlk99vhz_Nm2O4bL26srNg24q4nZHgzYCYez22AuVM8mujT6lPvguyTgxbIKk1LsCmzzJZbQpiv_

http://www.cnblogs.com/tider/archive/2009/05/07/1451296.html


2. to_number

select to_number('44')+to_number('33') from dual;


3. to_date

select to_date('20150305', 'yyyymmdd') from dual;


下面是通用函数

  1. nvl()函数

select nvl(comm, 0) from emp;

这在上一章用过了,就是comm为null就返回第二个参数,如果不为null就返回第一个参数,如果两个参数都为null

就返回null。


2. nvl2()函数

select ename, nvl2(comm, comm+sal, sal) from emp;

如果第一个参数是null就返回第三个参数,如果第一个不为null,就返回第二个参数。


3. nullif()函数

select nullif(1,1) from dual;

select nullif(1,2) from dual;

如果第一个和第二个参数相等,则返回null,否则返回第一个参数;


4. coalesce()函数

依次查看,遇到不为null的参数就立即返回这个参数

select ename, coalesce(sal+comm, sal, 0) from emp;

这和上面用nvl实现的差不多。


5. case表达式

select empno, ename, case deptno

when 10 then 'caiwubu'

when 20 then 'yanfabu'

when 30 then 'xiaoshoubu'

else 'qitabu'

end bumen

from emp;


6. decode()函数

这也是条件函数和case差不多,一个是函数一个是关键字

select empno, ename, decode(deptno, 10, 'caiwubu', 20, 'yanfabu', 30, 'xiaoshoubu', 'qitabu') bumen from emp;

对照5的例子就明白这个了。

http://www.cnblogs.com/juddhu/archive/2012/03/07/2383101.html


7. 找出每个月倒数第三天雇用的员工

select ename from emp

where hiredate=(last_day(hiredate)-2);


8. 找出雇佣超过30年的员工

select ename from emp

where hiredate<add_months(sysdate,-30*12);


9. 每个员工名字前面加上Dear并且名字首字母大写

select ('Dear' || ' ' || initcap(ename)) "New name" from emp;

这里"New name"不能用单引号,我现在发现了,如果这个字符串是当属性用的,就要用双引号,

如果是要当数据用的,就用单引号,好像是。


10. 找出姓名为5个字母的员工

select ename from emp

where length(ename)=5;


11. 找出名字不带R的员工,这个我看到的时候还想什么子字符串查找之类的,比如instr这些呢

select ename from emp

where ename not like '%R%';


12. 显示所有员工名字的第一个字母

select substr(ename,0,1) from emp;


13. 显示所有员工,名字按降序排列,如果相同,按工资升序排列

select * from emp

order by ename desc, sal asc;


14. 按一个月30天算,计算员工一天的薪水,不计小数

select trunc(sal/30,0) from emp;


15. 找出二月份受雇的员工

select ename from emp

where to_char(hiredate,'fmmm')='2';


16. 计算员工加入公司的天数,这个比较有意思了,我当时还想什么一年多少天之类的,后来在网上查了一下,得记住

日期可以直接进行加减操作得到天数的。

select sysdate-hiredate from emp;

如果不要小数

select round(sysdate-hiredate,0) from emp;

http://www.myexception.cn/oracle-management/1245803.html


下面进行分组函数练习。

  1. count()

计算部门10有多少人

select count(*) from emp

where deptno=10;


2. avg/max/min/sum

select round(avg(sal), 2) from emp

where deptno=30;


select max(sal) from emp

where deptno=20;


select min(sal) from emp;

select sum(sal) from emp;


3. group by

按部门计算总工资

select deptno, sum(sal) from emp

group by deptno;

按部门和上级领导的编号计算总工资

select mgr, deptno, sum(sal) from emp

group by mgr, deptno;


4. having

计算每个部门每个工作的员工在1981年5月1日后雇佣的平均工资。。。。这个我还不会描述了。。。

select deptno, job, avg(sal) from emp

where hiredate>=to_date('19810501','yyyymmdd')

group by deptno, job

having avg(sal)>1200

order by deptno, job;


这里我遇到一个问题,还没有解决,先记录下来

select job, avg(sal)

from emp

group by job;

这样就可以,但是下面就不行了

select job, max(avg(sal))

from emp

group by job;

这里就需要大神帮忙看看怎么回事了,要不然自己就慢慢解决。


练习:

  1. 分组统计各部门工资在500以上的员工的平均工资

select deptno, avg(sal)

from emp

where sal>500

group by deptno;

2. 统计平均工资大于500的部门

select deptno, avg(sal)

from emp

group by deptno

having avg(sal)>500;

3. 统计部门30最高奖金值

select max(comm) from emp

where deptno=30;

4. 统计部门30谁得到最高奖金

select ename from emp

where comm=(select max(comm) from emp where deptno=30);

5. 统计每个职位员工数和最低工资

select job, count(*), min(sal)

from emp

group by job;

6. 算出每个部门、每个职位的平均工资和平均奖金,如果平均奖金大于300就显示GOOD,100到300显示 OK, 小于100

显示FUCK,部门编号降序,平均工资降序

select deptno, job, avg(sal), nvl(avg(comm),0), case

when nvl(avg(comm),0)>300 then 'GOOD'

when nvl(avg(comm),0)>100 and nvl(avg(comm),0)<300 then 'OK'

else 'FUCK'

end RESULT

from emp

group by deptno, job

order by job desc, avg(sal) desc; 

7. 每个部门多少员工

select deptno, count(*)

from emp

group by deptno

order by count(*) desc;

8. 工资大于自己部门平均工资的员工

select ename, sal, from emp t1, (select deptno, avg(sal) avg from emp group by deptno) t2

where t1.deptno=t2.deptno and t1.sal>t2.avg;

9. 每个部门每种职位的平均奖金和总钱数

select deptno, job, avg(nvl(comm,0), sum(sal+nvl(comm,0))

from emp

group by deptno, job

order by deptno;








你可能感兴趣的:(Oracle学习记录 七 继续接六的)