Oracle高级查询练习4.7

高级查询(做参考,语句不唯一):

一、已知emp表和dept表的结构说明如下:

emp员工表

(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)

dept部门表

(deptno部门编号/dname部门名称/loc地点)

工资 = 薪金 + 佣金

二、查询表数据

1.查询至少有一个员工的所有部门。

2.查询薪金比“SMITH”多的所有员工。

3.查询所有员工的姓名及其直接上级的姓名。

4.查询受雇日期早于其直接上级的所有员工。

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

6.查询所有“CLERK”(办事员)的姓名及其部门名称。

7.查询最低薪金大于1500的各种工作。

8.查询在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。

9.查询薪金高于公司平均薪金的所有员工。

10.查询与“SCOTT”从事相同工作的所有员工。

11.查询薪金等于部门30中员工的薪金的所有员工的姓名和薪金。

12.查询薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。

13.查询在每个部门工作的员工数量、平均工资和平均服务期限。

14.查询所有员工的姓名、部门名称和工资。

15.查询所有部门的详细信息和部门人数。

16.查询各种工作的最低工资。

17.查询各个部门的MANAGER(经理)的最低薪金。

18.查询所有员工的年收入,按年薪从低到高排序。

三,实验过程:

(1)建表:

说明:字段可以设置为唯一键(我的表没有设置):unique,如:dname char(20) unique;
1,create table dept(
deptno char(20) primary key,
dname char(20) not null,
loc char(20)
);

2,create table emp(
empno char(20) primary key,
ename char(10) not null,
job char(20) not null,
mgr char(20) ,
hiredate date,
sal number(7,2),
comm number(7,2),
deptno char(20) not null
constraint deptno_fk references dept
);

(2)添加数据(结构一致):

说明:部门编号是外键,所以两个表的deptno内容要一致。


insert into dept values (1001,'营业部','重庆');
insert into dept values (1002,'客服部','四川');
insert into dept values (1003,'物流部','上海');

........

说明:员工表中,上级编号(可以为空)如果非空,必须是已经创建好的,存在的,不然添加数据的时候会报错,比如,王进的上级编号是12132,则12132对应的员工王迪是存在的。


insert into emp values(12131,'王进','clerk',12132,to_date('1982-12-3','yyyy-mm-dd'),800,null,1002);

insert into emp values(12132,'王迪','经理',null,to_date('1982-12-3','yyyy-mm-dd'),800,null,1002);
.......

(3)查询语句:

--1.列出至少有一个员工的所有部门。
select dname from dept where deptno in(select deptno
from emp);

2,select * from emp where emp.sal>(select sal from emp where emp.ename='smith');

--3.列出所有员工的姓名及其直接上级的姓名。
select a.ename,(select b.ename from emp b where b.empno=a.mgr)as boss from emp a;

--4.列出受雇日期早于其直接上级的所有员工。
select a.ename from emp a where a.hiredate<(select b.hiredate from emp b where b.empno=a.mgr);

5,select d.dname,e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.deptno from dept d left join emp e on d.deptno=e.deptno;


6,select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno and e.job='clerk';

--7.列出最低薪金大于1500的各种工作。
select distinct job as 工作 from emp group by job having min(sal)>1500;

--8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
select ename from emp where deptno=(select deptno from dept where dname='销售');

--9.列出薪金高于公司平均薪金的所有员工。
select emp.ename from emp where emp.sal>(select avg(sal) from emp);

--10.列出与“SCOTT”从事相同工作的所有员工。
select emp.ename from emp where emp.job=(select emp.job from emp where emp.ename='SCOTT');

--11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
select e.deptno,e.ename,e.sal from emp e where e.sal in(select e1.sal from emp e1 where e1.deptno=1008) and e.deptno<>1008;


--12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
select e.deptno,e.ename,e.sal from emp e where e.sal >(select max(sal) from emp e1 where e1.deptno=1007) and e.deptno<>1007;


--*13.列出在每个部门工作的员工数量、平均工资和平均服务期限。
select (select d.dname from dept d where e.deptno=d.deptno) as deptname ,count(deptno) as deptcount,avg(sal) as deptavgsal from emp e group by deptno;


--14.列出所有员工的姓名、部门名称和工资。
select ename,sal,(select dname from dept d where d.deptno=e.deptno)as dname from emp e;

--*15.列出所有部门的详细信息和部门人数。
select d.deptno,d.dname,d.loc,(select count(deptno) from emp e where e.deptno=d.deptno group by e.deptno) as deptcount from dept d;

--16.列出各种工作的最低工资。
select job,min(sal) from emp group by job;

--17.列出各个部门的MANAGER(经理)的最低薪金。
select deptno,min(sal) as 最低薪金 from emp where job='经理' group by deptno;

--18.列出所有员工的年工资,按年薪从低到高排序。
select emp.ename, (emp.sal*12+nvl(comm,0)) as yearsal from emp order by yearsal;

 

原文地址:https://www.cnblogs.com/gongsuiqing/p/12653663.html