经典查询练手第一篇

--经典查询练手第一篇


scott.emp员工表结构如下:
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO NUMBER(4) 员工号
ENAME VARCHAR2(10) Y 员工姓名
JOB VARCHAR2(9) Y 工作
MGR NUMBER(4) Y 上级编号
HIREDATE DATE Y 雇佣日期
SAL NUMBER(7,2) Y 薪金
COMM NUMBER(7,2) Y 佣金
DEPTNO NUMBER(2) Y 部门编号

scott.dept部门表:
Name Type Nullable Default Comments
------ ------------ -------- ------- --------
DEPTNO NUMBER(2) 部门编号
DNAME VARCHAR2(14) Y 部门名称
LOC VARCHAR2(13) Y 地点
提示:工资 = 薪金 + 佣金

题目:

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.列出至少有一个员工的所有部门。
select distinct(dname) 
from dept d,emp e
where d.deptno = e.deptno;

DNAME
--------------
ACCOUNTING
RESEARCH
SALES

2.列出薪金比“SMITH”多的所有员工。
select ename 
from emp 
where sal > (select sal from emp where ename='SMITH');

ENAME
----------
JAMES
ADAMS
WARD
MARTIN
MILLER
TURNER
ALLEN
CLARK
BLAKE
JONES
SCOTT
FORD
KING

13 rows selected.

3.列出所有员工的姓名及其直接上级的姓名。
SCOTT@PROD1> select b.ename hired, a.ename boss 
from emp a,emp b 
where a.empno=b.mgr;

HIRED	   BOSS
---------- ----------
FORD	   JONES
SCOTT	   JONES
TURNER	   BLAKE
ALLEN	   BLAKE
WARD	   BLAKE
JAMES	   BLAKE
MARTIN	   BLAKE
MILLER	   CLARK
ADAMS	   SCOTT
BLAKE	   KING
JONES	   KING
CLARK	   KING
SMITH	   FORD

13 rows selected.

--第二种解包括无上级的情况
SCOTT@PROD1> select a.ename,(select ename from emp b where b.empno=a.mgr) as boss_name 
from emp a;

ENAME	   BOSS_NAME
---------- ----------
SMITH	   FORD
ALLEN	   BLAKE
WARD	   BLAKE
JONES	   KING
MARTIN	   BLAKE
BLAKE	   KING
CLARK	   KING
SCOTT	   JONES
KING
TURNER	   BLAKE
ADAMS	   SCOTT
JAMES	   BLAKE
FORD	   JONES
MILLER	   CLARK

14 rows selected.

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

HIRED	   BOSS
---------- ----------
ALLEN	   BLAKE
WARD	   BLAKE
BLAKE	   KING
JONES	   KING
CLARK	   KING
SMITH	   FORD

6 rows selected.

5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
SCOTT@PROD1> select * 
from dept left join emp on dept.deptno=emp.deptno;

    DEPTNO DNAME	  LOC		     EMPNO ENAME      JOB	       MGR HIREDATE	    SAL       COMM     DEPTNO
---------- -------------- ------------- ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
	10 ACCOUNTING	  NEW YORK	      7782 CLARK      MANAGER	      7839 09-JUN-81	   2450 		   10
	10 ACCOUNTING	  NEW YORK	      7839 KING       PRESIDENT 	   17-NOV-81	   5000 		   10
	10 ACCOUNTING	  NEW YORK	      7934 MILLER     CLERK	      7782 23-JAN-82	   1300 		   10
	20 RESEARCH	  DALLAS	      7566 JONES      MANAGER	      7839 02-APR-81	   2975 		   20
	20 RESEARCH	  DALLAS	      7902 FORD       ANALYST	      7566 03-DEC-81	   3000 		   20
	20 RESEARCH	  DALLAS	      7876 ADAMS      CLERK	      7788 23-MAY-87	   1100 		   20
	20 RESEARCH	  DALLAS	      7369 SMITH      CLERK	      7902 17-DEC-80	    800 		   20
	20 RESEARCH	  DALLAS	      7788 SCOTT      ANALYST	      7566 19-APR-87	   3000 		   20
	30 SALES	  CHICAGO	      7521 WARD       SALESMAN	      7698 22-FEB-81	   1250        500	   30
	30 SALES	  CHICAGO	      7844 TURNER     SALESMAN	      7698 08-SEP-81	   1500 	 0	   30
	30 SALES	  CHICAGO	      7499 ALLEN      SALESMAN	      7698 20-FEB-81	   1600        300	   30
	30 SALES	  CHICAGO	      7900 JAMES      CLERK	      7698 03-DEC-81	    950 		   30
	30 SALES	  CHICAGO	      7698 BLAKE      MANAGER	      7839 01-MAY-81	   2850 		   30
	30 SALES	  CHICAGO	      7654 MARTIN     SALESMAN	      7698 28-SEP-81	   1250       1400	   30
	40 OPERATIONS	  BOSTON

15 rows selected.

6.列出所有“CLERK”(办事员)的姓名及其部门名称。
SCOTT@PROD1> select e.ename, d.dname
from emp e, dept d
where e.deptno=d.deptno and e.job='CLERK';  

ENAME	   DNAME
---------- --------------
MILLER	   ACCOUNTING
SMITH	   RESEARCH
ADAMS	   RESEARCH
JAMES	   SALES

7.列出最低薪金大于1500的各种工作。
SCOTT@PROD1> select d.dname, min(sal)    --此处错误,计算成了部门,题目要求工作
from dept d left join emp e on (d.deptno=e.deptno) 
group by d.dname;

DNAME		 MIN(SAL)
-------------- ----------
ACCOUNTING	     1300
OPERATIONS
RESEARCH	      800
SALES		      950

--更正
SCOTT@PROD1> select job from emp group by job having min(sal)>1500;

JOB
---------
PRESIDENT
MANAGER
ANALYST

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

ENAME
----------
ALLEN
WARD
MARTIN
BLAKE
TURNER
JAMES

6 rows selected.

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

ENAME
----------
CLARK
BLAKE
JONES
SCOTT
FORD
KING

6 rows selected.

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

ENAME
----------
SCOTT
FORD

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

no rows selected

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

ENAME		  SAL
---------- ----------
JONES		 2975
SCOTT		 3000
FORD		 3000
KING		 5000

13.列出在每个部门工作的员工数量、平均工资和平均服务期限。
SCOTT@PROD1> select deptno, count(*) emp_c, avg(sal) avg_sal, avg(sysdate-hiredate) avg_hir 
from emp 
group by deptno;

    DEPTNO	EMP_C	 AVG_SAL    AVG_HIR
---------- ---------- ---------- ----------
	30	    6 1566.66667 12958.2813
	20	    5	    2175  12129.148
	10	    3 2916.66667 12849.2813
	
	
14.列出所有员工的姓名、部门名称和工资。
SCOTT@PROD1> select ename,d.dname,sal 
from emp, dept d 
where emp.deptno=d.deptno;

ENAME	   DNAME		 SAL
---------- -------------- ----------
CLARK	   ACCOUNTING		2450
KING	   ACCOUNTING		5000
MILLER	   ACCOUNTING		1300
SMITH	   RESEARCH		 800
JONES	   RESEARCH		2975
SCOTT	   RESEARCH		3000
ADAMS	   RESEARCH		1100
FORD	   RESEARCH		3000
ALLEN	   SALES		1600
WARD	   SALES		1250
MARTIN	   SALES		1250
BLAKE	   SALES		2850
TURNER	   SALES		1500
JAMES	   SALES		 950

14 rows selected.

15.列出所有部门的详细信息和部门人数。
SCOTT@PROD1> select d.deptno,d.dname,d.loc,count(*)   --此处没有输出部门中无人数的部门信息
from dept d,emp e 
where d.deptno=e.deptno 
group by d.deptno,d.dname,d.loc;

    DEPTNO DNAME	  LOC		  COUNT(*)
---------- -------------- ------------- ----------
	20 RESEARCH	  DALLAS		 5
	10 ACCOUNTING	  NEW YORK		 3
	30 SALES	  CHICAGO		 6

--更正
SCOTT@PROD1> select d.deptno,d.dname,d.loc
,(select count(*) from emp e where e.deptno=d.deptno group by e.deptno) dept_count 
from dept d;

    DEPTNO DNAME	  LOC		DEPT_COUNT
---------- -------------- ------------- ----------
	10 ACCOUNTING	  NEW YORK		 3
	20 RESEARCH	  DALLAS		 5
	30 SALES	  CHICAGO		 6
	40 OPERATIONS	  BOSTON
	
16.列出各种工作的最低工资。
SCOTT@PROD1> select deptno,min(sal) from emp group by deptno;  --此处误算成了部门

    DEPTNO   MIN(SAL)
---------- ----------
	30	  950
	20	  800
	10	 1300

--更正
SCOTT@PROD1> select job,avg(sal) from emp group by job;

JOB	    AVG(SAL)
--------- ----------
CLERK	      1037.5
SALESMAN	1400
PRESIDENT	5000
MANAGER   2758.33333
ANALYST 	3000


17.列出各个部门的MANAGER(经理)的最低薪金。
SCOTT@PROD1> select e1.deptno,min(e1.sal)
from emp e1,emp e2,dept d
where e1.empno=e2.mgr
group by e1.deptno;  

    DEPTNO MIN(E1.SAL)
---------- -----------
	30	  2850
	20	  2975
	10	  2450
	
18.列出所有员工的年工资,按年薪从低到高排序。
SCOTT@PROD1> select ename,(sal+nvl(comm,0))*12 as salpersal 
from emp 
order by salpersal;

ENAME	    SALPERSAL
---------- ----------
SMITH		 9600
JAMES		11400
ADAMS		13200
MILLER		15600
TURNER		18000
WARD		21000
ALLEN		22800
CLARK		29400
MARTIN		31800
BLAKE		34200
JONES		35700
FORD		36000
SCOTT		36000
KING		60000

14 rows selected.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值