Oracle11g--基本查询

1,列出至少有一个员工的所有部门。

select dname from dept where deptno in (select distinct(deptno) from emp);

//列出部门人数不少于3个人的部门和人数

错误的查询方法:

注意dname不是关键字,可能存在多个重复的,所以不能以dname分组,所以下面的查询是错误的。

select dname,count(*) from emp a join dept b on a.deptno=b.deptno group by dname having count(*)>=3;

正确的查询方法:

select b.dname,a.count from (select deptno,count(*) count from emp group by deptno having count(*)>=3) a join dept b on a.deptno=b.deptno;


2,列出薪水比"SMITH"多的所有员工。

select ename from emp where sal>(select sal from emp where ename='SMITH');


3,列出所有员工的姓名及其直接上级的姓名。

select a.ename emp_name,b.ename mag_name from emp a,emp b where a.mgr=b.empno;


4,列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称。

select empno,ename,dname from emp a join dept b on a.deptno=b.deptno where hiredate in (select a.hiredate from emp a,emp b where a.mgr=b.empno and a.hiredate<b.hiredate);

同上

select empno,ename,dname from emp a join dept b on a.deptno=b.deptno where a.empno in (select a.empno from emp a,emp b where a.mgr=b.empno and a.hiredate<b.hiredate);


5,列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。

select a.dname,b.ename,b.empno,b.job from dept a left join emp b on a.deptno=b.deptno;


6,列出所有job=CLERK的姓名及其部门名称,部门的人数。

//查询工作是CLERK的姓名及其部门的人数

select a.ename,b.count,c.dname from emp a join (select deptno,count(*) count from emp group by deptno) b on a.deptno=b.deptno join dept c on c.deptno=b.deptno where a.job='CLERK';


7,列出最低薪水大于1500的各种工作及此从事此工作的全部雇员人数。

select job,min(sal),count(*) from emp group by job having min(sal)>1500;


8,列出在部门"SALES"(销售部)工作的员工的姓名,假定不知道销售部的部门编号。

select ename from emp where deptno=(select deptno from dept where dname='SALES');


9,列出薪水高于公司平均薪水的所有员工,所在部门,上级领导,公司的工资等级。


方法一:

//7839没有上级领导

select a.empno,a.ename,b.ename,c.dname,a.sal,case when a.sal >=700 and a.sal<=1200 then 1 

when a.sal >=1201 and a.sal<=1400 then 2 

when a.sal >=1401 and a.sal<=2000 then 3 

when a.sal >=2001 and a.sal<=3000 then 4 

when a.sal >=3001 and a.sal<=9999 then 5 else 10000 end "grade" from emp a join emp b on a.mgr=b.empno join dept c on b.deptno=c.deptno where a.sal>(select avg(sal) from emp);


方法二:

select a.ename emp_name,c.dname, b.ename mag_name,a.grade

from

(select a.empno,a.deptno,a.mgr,b.grade,a.ename

from emp a,salgrade b

where sal > (

select avg(sal) sal from emp )

and  sal >= losal and sal <= hisal) a,

emp b,

dept c

where a.mgr=b.empno and a.deptno=c.deptno;


10,列出与"SCOTT"从事相同工作的所有员工及部门名称。

select a.ename,b.dname from emp a join dept b on a.deptno=b.deptno where job=(select job from emp where ename='SCOTT') and ename!='SCOTT';


11,列出薪水等于部门号=30中员工的薪水的所有员工的姓名和薪水。

select ename,sal from emp where sal in (select sal from emp where deptno=30);


12,列出薪水高于在部门号=30工作的所有员工的薪水的员工姓名和薪水,部门名称。

select a.ename,a.sal,b.dname from emp a join dept b on a.deptno=b.deptno where sal >all (select sal from emp where deptno=30);


13,列出在每个部门工作的员工数量,平均工资和平均服务期限。

select count(*) count,avg(sal) avg_sal,avg(sysdate-hiredate) avg_hiredate from emp group by deptno;


14,列出所有员工的姓名,部门名称和工资。

select a.ename,a.sal,b.dname from emp a join dept b on a.deptno=b.deptno;


15,列出所有部门的详细信息和部门人数。

方法一:

select a.*,b.counts from dept a left join (select deptno,count(*) counts from emp group by deptno) b on a.deptno=b.deptno;


方法二:

select a.deptno,a.dname,a.loc,(select count(deptno) from emp b where b.deptno=a.deptno group by b.deptno) deptcount from dept a;


16,列出各种工作的最低工资及从事此工作的雇员姓名。

select ename,sal,job from emp where sal in (select min(sal) from emp group by job);


17,列出各个部门的MANAGER(经理)的最低薪水。

select ename,mgr,sal,deptno from emp where sal in (select min(sal) from emp group by job);


18,列出所有员工的年工资,按年薪(salary+comm)从高到底排序。

注意年薪(salary+comm)都需要乘以12

select sal*12+nvl(comm,0)*12 sum_salary from emp order by sum_salary desc;


//列出每个部门的平均薪金(salary+comm)

方法一:

select avg(sal*12+nvl(comm,0)*12) avg_salary,deptno from emp group by deptno;

方法二:

select (sum(sal+nvl(comm,0))*12)/count(*) salary from emp grep by deptno;


19,查出某个员工的上级主管,并要求出这些主管中的薪水超过3000

select a.ename emp_name,b.ename mag_name,b.sal from emp a,emp b where a.mgr=b.empno and b.sal>3000;


20,求出部门名称中,带‘S’字符的部门员工的部门名称,工资合计,部门人数

select dname,count(dname) count,sum(sal) sum_sal from emp a join dept b on a.deptno=b.deptno where dname like '%S%' group by b.dname;


21.求平均薪水最高的部门,显示部门名称和部门平均薪水。

select a.avg_sal,c.dname from (select max(avg(sal)) avg_sal from emp group by deptno) a join 

(select avg(sal) avg_sal,deptno from emp group by deptno) b on a.avg_sal=b.avg_sal join dept c on c.deptno=b.deptno;


注意下面虽然跟上面的结果相同,但是是有问题的,其中不能出现平均薪水最高的部门存在多个

select a.dname,b.avg_sal from dept a join (select deptno,avg(sal) avg_sal from emp group by deptno order by avg_sal desc) b on a.deptno=b.deptno where rownum=1;


########################

1,请查询表DEPT中所有部门的情况。

select * from dept;


2,查询表DEPT中的部门号,部门名称两个字段的所有信息。

select deptno,dname from dept;


3,请从表EMP中查询10号部门工作的雇员姓名和工资。

select ename,sal from emp where deptno=10;


4,请从表EMP中查找工种是职员CLERK或经理MANAGER的雇员姓名,工资。

select ename,sal from emp where job in('CLERK','MANAGER');


5,请在EMP表中查找部门号在10-30之间的雇员的姓名,部门号,工资,工作。

select ename,deptno,sal,job from emp where deptno between 10 and 30;


6,请从表EMP中查找姓名以J开头所有雇员的姓名,工资,职位。

select ename,sal,job from emp where ename like 'J%';


7,请从表EMP中查找工资低于2000的雇员的姓名,工作,工资,并按工资降序排列。

select ename,job,sal from emp where sal<2000 order by sal desc;


8,请从表中查询工作是CLERK的所有人的姓名,工资,部门号,部门名称以及部门地址的信息。

select a.ename,a.sal,a.deptno,b.dname,b.loc from emp a join dept b on a.deptno=b.deptno where job='CLERK';


9,查询表EMP中所有的工资大于等于2000的雇员姓名和他的经理的名字。

select a.ename emp_name,b.ename mag_name from emp a join emp b on a.mgr=b.empno where a.sal>2000;


10,在表EMP中查询所有工资高于JONES的所有雇员姓名,工作和工资。

select ename,job,sal from emp where sal>(select sal from emp where ename='JONES');


11,列出没有对应部门表信息的所有雇员的姓名,工作以及部门号。

select ename,job,deptno from emp where deptno is null;


12,查找工资在1000~3000之间的雇员所在部门的所有人员信息。

select * from emp where deptno in(

select distinct(deptno) from emp where sal between 1000 and 3000);


13,雇员中谁的工资最高。

select ename from emp where sal>=all(select sal from emp);


14,雇员中谁的工资第二高(考虑并列第一的情况,如何处理)

select ename from emp where sal=(select max(sal) from emp where sal in(select sal from emp minus select max(sal) from emp));


方法二:

select * from (select ename,sal,dense_rank() over (order by sal desc) rn from emp) where rn=2;


15,查询所有雇员的姓名,SAL与COMM之和。

select ename,sal*12+nvl(comm,0) sum_salary from emp;


16,查询所有81年7月1日以前来的员工姓名,工资,所属部门的名字

select a.ename,a.sal,b.dname from emp a join dept b on a.deptno=b.deptno where 

hiredate<'01-JAN-81';


17,查询各部门中81年1月1日以后来的员工数

方法一:

注意:不同的数据库日期格式可能不是‘1-JAN-81’,所以最好采用第二种方法

select deptno,count(*) from emp where hiredate>'1-JAN-81' group by deptno;

方法二:

select deptno,count(*) emp_total from emp where hiredate>to_date('1981-01-01','yyyy-mm-dd') group by deptno;


18,查询所有在CHICAGO工作的经理MANAGER和销售员SALESMAN的姓名,工资

select ename,sal from emp where job in ('MANAGER','SALESMAN') and deptno in (select deptno from dept where loc='CHICAGO');


19,查询列出来公司就职时间超过24年的员工名单

方法一:

select ename from emp where (sysdate-hiredate)/365>24;

方法二:

288是24年总共是288个月

where条件的意思是来的日期

select ename from emp where hiredate<=add_months(sysdate,-288);


20,询于81年来公司所有员工的总收入(包括SAL和COMM)

方法一:

select sum(sal*12+nvl(comm,0)*12) sum from emp where hiredate between '1-JAN-81' and '31-DEC-81';

方法二:

select sum(sal*12+nvl(comm,0)*12) sum from emp where to_char(hiredate,'yyyy')='1981';


21,查询显示每个雇员加入公司的准确时间,按yyyy-mm-dd hh24:mi:ss显示。

select to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;


22,查询公司中按年份月份统计各地的录用职工数量

select count(*),to_char(hiredate,'yyyy') year,to_char(hiredate,'mm') month,loc from emp a join dept b on a.deptno=b.deptno group by loc,hiredate;


//下面其实与上面同

select count(*),to_char(hiredate,'yyyy-mm') year_month,loc from emp a join dept b on a.deptno=b.deptno group by loc,hiredate;


23查询列出各部门的部门名和部门经理名字

select a.ename man_name,dname from emp a join dept b on a.deptno=b.deptno where job='MANAGER';


24,查询部门平均工资最高的部门名称和最低的部门名称

select dname avg_sal from dept where deptno=(select deptno from emp group by deptno having avg(sal)>=all(select avg(sal) from emp a join dept b on a.deptno=b.deptno group by a.deptno))

union all

select dname avg_sal from dept where deptno=(select deptno from emp group by deptno having avg(sal)<=all(select avg(sal) from emp a join dept b on a.deptno=b.deptno group by a.deptno));


25,查询与雇员号为7521员工的最接近的在其后进入公司的员工姓名及其所在部门名

select b.ename,c.dname from (select min(hiredate) hiredate from emp where hiredate>(select hiredate from emp where empno='7521')) a,emp b,dept c where a.hiredate=b.hiredate and b.deptno=c.deptno;


转载于:https://my.oschina.net/u/1454868/blog/221098

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值