高级查询(做参考,语句不唯一):
一、已知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,‘物流部‘,‘上海‘);
........
说明:员工表中,上级编号(可以为空)如果非空,必须是已经创建好的,存在的,不然添加数据的时候会报错,比如,王进的上级编号是12134,则12134对应的员工王迪是存在的。
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;