2018.5.17 oracle函数查询
--函数**
--1、显示当前日期
select sysdate from dual;
--2、显示当前日期,格式为****年月日,别名为hday
select to_char(sysdate,'yyyy"年"mm"月"dd"日"') hday from dual;
--3、编写一个查询,显示姓名以J、A或M开始的所有员工的姓名(第一个字母大写,其余字母小写)和姓名的长度,给每列一个合适的标签;
select initcap(e.ename) lname,length(e.ename) len
from emp e
where substr(upper(ename),0,1) in('J','A','M');
或者:
select concat(substr(ename,1,1), lower(substr(ename,2))) from emp where substr(ename,1,1) in('J','A','M');
--4、计算每位员工截止到当前时间入职的星期数,别名为weeks_worked。按聘用的星期数对结果进行排序。该星期数舍入到最接近的整数。同时显示员工的名字;
select e.ename,round((sysdate-e.hiredate)/7) as weeks_worked
from emp e;
--5、计算每位员工截止到当前时间入职的月数,别名为months_worked。该星期数舍入到最接近的整数。同时显示员工的名字。
select e.ename,round(months_between(sysdate,e.hiredate)) as months_worked
from emp e;
--6、查询在1981年2月20日和1987年5月1日之间入职的员工的姓名、职务标识和起始日期
select e.ename,e.job,e.hiredate
from emp e
where e.hiredate between to_date('19810220','yyyyMMdd') and to_date('19870501','yyyyMMdd');
--7、创建一个查询。显示所有员工的姓名和薪金。将薪金格式规定为15个字符长,左边填充$
select lpad(e.sal,15,'$') sal
from emp e;
--9、显示员工的姓名、聘用日期和该员工在星期几开始工作的。
select e.ename,e.hiredate,to_char(e.hiredate,'DAY') as "开始"
from emp e;
/*13、使用decode函数编写一个查询,使其按照以下数据根据job列的值显示所有员工的级别,同时显示员工的姓名
job grade
PRESIDENT A
MANAGER B
ANALYST C
SALESMAN D
CLERK E
都不是 0
*/
select e.ename,e.job job,
decode(e.job,'PRESIDENT','A'
,'MANAGER','B'
,'ANALYST','C'
,'SALESMAN','D'
,'CLERK','E'
,'0'
) as grade
from emp e;
--14、使用case语法重写一遍上题
select e.ename,e.job job,
case e.job
when 'PRESIDENT'then 'A'
when 'MANAGER' then 'B'
when 'ANALYST' then 'C'
when 'SALESMAN' then 'D'
when 'CLERK' then 'E'
else '0'
end
as grade
from emp e;
--**补充
--1、显示当前日期,本月最后一天的日期,以及本月还剩多少天
SELECT SYSDATE,
LAST_DAY(SYSDATE) "Last",
LAST_DAY(SYSDATE) - SYSDATE "Days Left"
FROM DUAL;
--2、显示今年的第一天
select trunc(sysdate,'year') from dual;
--3、显示本月的第一天
select trunc(sysdate,'month') from dual;
--4、最近一个星期四是哪天(不含今日)
SELECT NEXT_DAY(sysdate,5)
FROM DUAL;
--实现
--1.查询emp表中所有的数据
select * from emp;
--2.给gei biao zhi ding xu hao kai shi yema 6 jieshuyema10
select * from
(select rownum rn , e1.* from emp e1) e2 where rownum<=10;
--或者下面的方法
select * from (select rownum rn,e.* from emp e)e1 where rn>=5 and rn<=10;
--多表连接
--会产生笛卡尔积
select e.empno,e.ename,d.*
--如何显示小于10号部门的最低工资的员工(多表查询)
--1.员工表:姓名,工资
select *
from emp e,(select min(sal) sm from emp where deptno=10)s
where e.sal<s.sm;
--列出与“SMITH”从事相同工作的所有员工及部门名称(多表查询)
--部门表:部门名称
--员工表:所有信息
--条件:SMITH相同工作的信息
select *
from emp e,dept d
where e.deptno = d.deptno --取消笛卡尔积 等值判断
and e.job=(select job from emp where ename='SMITH');
select e.ename,t.dname from emp e,dept t where t.deptno=e.deptno and job=(select job from emp where ename='SMITH') and e.ename not in('SMITH');
;(select deptno from emp where e.ename='SMITH') ;
--显示每个部门的名称、地点、员工人数以及该部门所有员工的平均薪资(多表查询)
select d.dname 部门,d.loc 地点, e. 部门员工数
--列出薪金高于公司平均薪金的所有员工,薪资,所在部门名称,上级领导姓名,工资等级(多表查询)
--员工表:员工编号、员工工资、员工姓名、
--领导表:姓名
--部门表:部门名称
--工资表:工资等级
--条件:薪金高于公司平均薪金
select e1.empno 员工姓名,e2.empno 员工编号,e1.sal 员工工资,d.dname 部门名称,s.grade 工资等级
from emp e1, emp e2,dept d,salgrade s
where e1.mgr = e2.empno
and e1.deptno = d.deptno
and e1.sal between s.losal and s.hisal
and e1.sal >(select avg(sal) eavg from emp);
--------作业
--1. 显示所有员工的姓名ename,部门号deptno和部门名称dname。
select e.ename,d.deptno,d.dname from emp e left join dept d on e.deptno = d.deptno;
--2. 查询20号部门员工的job和20号部门的loc
select e.ename,e.job,d.loc from emp e,dept d where e.deptno=20 and d.deptno=20;
--3. 选择所有有奖金comm的员工的ename , dname , loc
select e.ename,d.dname,d.loc from emp e,dept d where (e.deptno = d.deptno) and (e.comm is not null);
--4. 选择在DALLAS工作的员工的ename , job , deptno, dname
select e.ename,e.job,d.deptno,d.dname from emp e,dept d where (e.deptno=d.deptno) and d.loc='DALLAS';
--5. 选择所有员工的姓名ename,员工号empno,以及他的管理者mgr的姓名ename和员工号empno
select e.ename employee ,e.empno EMP#,e2.ename manager,e2.empno MGR# from emp e, emp e2 where e.mgr = e2.mgr;
--6. 查询各部门员工姓名和他们所在位置
select d.deptno,e.ename,d.loc from emp e,dept d where d.deptno = e.deptno;
--7、列出每个部门工作的员工数量,平均工资和平均服务年限
select d.dname,count(*),avg(sal) from emp e,dept d group by deptno where d.deptno=e.deptno;
select d.dname from emp e,dept d group by e.deptno where (d.deptno = e.deptno);
Select distinct( deptno),count(*)over(partition by deptno) 员工数量,
avg(sal) over(partition by deptno) 平均工资
,avg(sysdate-hiredate) over(partition by deptno) 平均服务期限 from emp;
--8、列出于“SCOTT”从事相同工作的所有员工及部门名称
select e.empno,e.ename,d.dname from emp e,dept d where (d.deptno = e.deptno) and job=(select job from emp where ename='SCOTT') and (e.ename not in('SCOTT'));
--9、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级
--列出薪金高于公司平均薪金的所有员工,薪资,所在部门名称,上级领导姓名,工资等级(多表查询)
--员工表:员工编号、员工工资、员工姓名、
--领导表:姓名
--部门表:部门名称
--工资表:工资等级
--条件:薪金高于公司平均薪金
select e1.ename 员工姓名,e2.empno 员工编号,e1.sal 员工工资,d.dname 部门名称,s.grade 工资等级
from emp e1, emp e2,dept d,salgrade s
where e1.mgr = e2.empno
and e1.deptno = d.deptno
and e1.sal between s.losal and s.hisal
and e1.sal >(select avg(sal) eavg from emp);
select e1.empno,e1.ename,d.dname,s.grade
from emp e1,emp e2,dept d,salgrade s
where e1.deptno=d.deptno
and e2.empno=e1.mgr
and e1.sal >(select avg(sal) from emp)
and e1.sal between s.losal and s.hisal;