这一篇的博客是基于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 | 此等级的最高工资 |
下面是查询练习题,答案是我自己做的,供参考用,有问题欢迎指出
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、显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加工作时间比经理早 10、查询部门人数大于2的部门编号,部门名称,部门人数 11、查询部门平均工资大于2000,且人数大于2的部门编号,部门名称,部门人数,部门平均工资,并按照部门人数升序排列 12、查询部门20的员工,每个月的工资总和及平均工资 SELECT SUM(sal),avg(sal) 13、查询工作在CHICAGO的员工人数,最高工资及最低工资 SELECT COUNT(empno),MAX(sal),MIN(sal) 14、查询员工表中一共有几种岗位类型 15、查询每个部门的部门编号,部门名称,部门人数,最高工资,最低工资,工资总和,平均工资 16、查询每个部门,每个岗位的部门编号,部门名称,岗位名称,部门人数,最高工资,最低工资,工资总和,平均工资 SELECT d.deptno,d.dname,e.job,COUNT(e.empno),MAX(sal),MIN(sal),avg(sal),SUM(sal) 17、查询每个经理管理的人数,经理编号,经理姓名,要求包括没有经理的人员信息 18、查询部门平均工资在2500以上的部门名称及平均工资 19、查询员工岗位中不是以"SA"开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序 20、查询部门人数在2人以上】的部门名称,最低工资,最高工资,并对求得的工资进行四舍五入到整数位 21、查询岗位不是SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和 22、写一个查询,显示每个部门最高工资和最低工资的差额
SELECT a.ename,a.hiredate,b.ename,b.hiredate
from emp a,emp b
where a.mgr=b.empno and a.hiredate
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
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;
FROM emp
where deptno=20;
from emp e,dept d
where e.deptno=d.deptno and loc=‘CHICAGO’
SELECT count( DISTINCT job)
from emp
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;
from emp e,dept d
where e.deptno=d.deptno
GROUP BY d.deptno,d.dname,e.job;
SELECT COUNT(a.empno),b.empno,b.ename
from emp a left JOIN emp b on a.mgr=b.empno
GROUP BY b.empno
SELECT d.dname,avg(sal)
from dept d,emp e
where d.deptno=e.deptno
GROUP BY d.deptno
HAVING avg(sal)>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;
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
SELECT job,SUM(sal)
from emp
where job<>‘salesman’
GROUP BY job
HAVING SUM(sal)>=2500;
SELECT MAX(sal)-MIN(sal)
from emp
GROUP BY deptno