下面是转换函数
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;
下面是通用函数
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
下面进行分组函数练习。
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;
这里就需要大神帮忙看看怎么回事了,要不然自己就慢慢解决。
练习:
分组统计各部门工资在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;