数据库学习总结(七)——多表查询练习题(2)

这一篇的博客是基于scott.sql数据库操作的,备份文件上传在我的资源里(scott.sql资源点这里~)
下载后导入数据库方法同我的上篇博客查询练习题(1)的文末

scott.sql内包含emp dept salgrde 三个表
雇员表:记录了一个雇员的基本信息
EMP(雇员表)

NO 字段 类型 描述
1 EMPNO NUMBER(4)
2 ENAME VARCHAR2(10) 表示雇员姓名
3 JOB VARCHAR2(9) 表示工作职位
4 MGR NUMBER(4) 表示一个雇员的领导编号
5 HIREDATE DATE 表示雇佣日期
6 SAL NUMBER(7,2) 表示月薪,工资
7 COMM NUMBER(7,2) 表示奖金或佣金
8 DEPTNO NUMBER(2) 表示部门编号

部门表:表示一个部门的具体信息
DEPT(部门表)

NO 字段 类型 描述
1 DEPTNO NUMBER(2) 部门编号
2 DNAME VARCHAR2(14) 部门名称
3 LOC VARCHAR2(13) 部门位置

一个公司是有等级制度,用此表表示一个工资的等级
SALGRADE(工资等级表)

NO 字段 类型 描述
1 GRADE NUMBER 等级名称
2 LOSAL NUMBER 此等级的最低工资
3 HISAL NUMBER 此等级的最高工资

表内信息
数据库学习总结(七)——多表查询练习题(2)_第1张图片数据库学习总结(七)——多表查询练习题(2)_第2张图片数据库学习总结(七)——多表查询练习题(2)_第3张图片

下面是查询练习题,答案是我自己做的,供参考用,有问题欢迎指出
1、 查询,显示所有员工姓名,部门编号,部门名称
SELECT ename,emp.deptno,dname
from emp,dept
where emp.deptno=dept.deptno

2、 写一个查询,显示所有工作在CHICAGO并且奖金不会空的员工姓名,工作地点,奖金
SELECT ename,loc,sal
from emp,dept
where emp.deptno=dept.deptno and dept.loc=‘CHICAGO’ and comm is not null;

3、写一个查询,显示所有姓名中含有A字符的员工姓名,工作地点
SELECT e.ename,d.loc
from emp e,dept d
where e.deptno=d.deptno and ename like ‘%A%’;

4、查询每个员工的编号,姓名,工资,工资等级,所在工作城市,按照工资等级进行升序排序
SELECT e.empno,e.ename,e.sal,s.grade,d.loc
from emp e,dept d,salgrade s
where e.deptno=d.deptno and e.sal BETWEEN s.losal and s.hisal
ORDER BY grade asc

5、查询所有工作在new york和chicago的员工姓名,员工编号,以及他们的经理姓名,经理编号
SELECT a.ename,a.empno,b.ename,b.empno
from emp a,emp b,dept d
where a.mgr=b.empno and a.deptno=d.deptno and d.loc in (‘new york’,‘chicago’);

6、查询员工SMITH的姓名,部门名称,直接上级名称
SELECT a.ename,d.dname,b.ename
from emp a,emp b,dept d
where a.deptno=d.deptno and a.mgr=b.empno and a.ename=‘smith’;

7、查询员工姓名,部门名称,工资,工资级别,要求工资级别大于四级
SELECT e.ename,d.dname,e.sal,s.grade
from emp e,dept d,salgrade s
where e.sal BETWEEN s.losal and s.hisal and s.grade>4;

8、显示员工KING和FORD管理的员工姓名及其经理姓名
SELECT a.ename,b.ename
from emp a,emp b
where a.mgr=b.empno and b.ename in (‘king’,‘ford’);

9、显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加工作时间比经理早
SELECT a.ename,a.hiredate,b.ename,b.hiredate
from emp a,emp b
where a.mgr=b.empno and a.hiredate

10、查询部门人数大于2的部门编号,部门名称,部门人数
SELECT d.deptno,d.dname,count(dname)
from dept d,emp e
WHERE e.deptno=d.deptno
group by d.deptno
HAVING COUNT(ename)>2

11、查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门人数升序排列
SELECT d.deptno,d.dname,COUNT(e.empno),avg(sal)
FROM dept d,emp e
where e.deptno=d.deptno
GROUP BY d.deptno,d.dname
HAVING avg(sal)>2000 and COUNT(e.empno)>2
ORDER BY COUNT(e.empno) ASC;

12、查询部门20的员工,每个月的工资总和及平均工资

SELECT SUM(sal),avg(sal)
FROM emp
where deptno=20;

13、查询工作在CHICAGO的员工人数,最高工资及最低工资

SELECT COUNT(empno),MAX(sal),MIN(sal)
from emp e,dept d
where e.deptno=d.deptno and loc=‘CHICAGO’

14、查询员工表中一共有几种岗位类型
SELECT count( DISTINCT job)
from emp

15、查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资
SELECT d.deptno,d.dname,COUNT(e.empno),max(sal),MIN(sal),SUM(sal),avg(sal)
from emp e, dept d
where e.deptno=d.deptno
GROUP BY d.deptno;

16、查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资

SELECT d.deptno,d.dname,e.job,COUNT(e.empno),MAX(sal),MIN(sal),avg(sal),SUM(sal)
from emp e,dept d
where e.deptno=d.deptno
GROUP BY d.deptno,d.dname,e.job;

17、查询每个经理管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息
SELECT COUNT(a.empno),b.empno,b.ename
from emp a left JOIN emp b on a.mgr=b.empno
GROUP BY b.empno

18、查询部门平均工资在2500以上的部门名称及平均工资
SELECT d.dname,avg(sal)
from dept d,emp e
where d.deptno=e.deptno
GROUP BY d.deptno
HAVING avg(sal)>2500;

19、查询员工岗位中不是以"SA"开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序
SELECT e.job,avg(e.sal)
from emp e
where e.job not like ‘SA%’
GROUP BY e.job
HAVING avg(e.sal)>2500
ORDER BY avg(e.sal) desc;

20、查询部门人数在2人以上】的部门名称,最低工资,最高工资,并对求得的工资进行四舍五入到整数位
SELECT d.dname,ROUND(MIN(e.sal),0),ROUND(MAX(e.sal),0)
from emp e,dept d
where e.deptno=d.deptno
GROUP BY d.dname
HAVING COUNT(e.empno)>2

21、查询岗位不是SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和
SELECT job,SUM(sal)
from emp
where job<>‘salesman’
GROUP BY job
HAVING SUM(sal)>=2500;

22、写一个查询,显示每个部门最高工资和最低工资的差额
SELECT MAX(sal)-MIN(sal)
from emp
GROUP BY deptno

你可能感兴趣的:(数据库,数据库)