1.列出至少有一个员工的所有部门: 



SELECT  deptno ,COUNT(*) come 

FROM emp  

where (select COUNT(deptno) FROM emp) >1 

GROUP BY deptno; 



 2.列出薪金比'SMITH'多的所有员工; 



第一步:查询 emp表中ename = 'SMITH'的薪资 

SELECT sal  FROM emp WHERE ename = 'SMITH'; 

第二步查询比'SMITH'多的员工 

         SELECT empno,ename,sal 

FROM emp 

where sal>(SELECT sal FROM emp WHERE ename = 'SMITH'); 



 3.列出所有员工的姓名,及其直接上级的姓名 



需要用到的数据表 emp e ,emp m 

已知的关联字段:e.mgr = m.empno 

 

SELECT e.ename ,m.ename 

FROM emp e, emp m 

          where e.mgr=m.empno(+); 



 4.列出受雇日期早于其直接上级的所有员工; 



需要用到的数据表 emp e,emp m 

已知字段 e.mgr = m.empno 



SELECT   e.ename,e.hiredate,m.hiredate 

FROM emp e ,emp m  

WHERE e.mgr = m.empno(+) 

AND e.hiredate >m.hiredate; 



 5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门; 



需要用到的数据表 

dept : 部门名称 ,dename 

emp:部门的员工信息 

确定已知字段:  

 
部门和雇员 depy.depton = emp.deptno 



第一步:查询部门名称和员工信息 

SELECT  d.dname,e.empno,e.ename,e.deptno 

FROM dept d,emp e 

WHERE  d.deptno = e.deptno(+); 



 6.列出所有'CLERK'的姓名及其部门名称 



需要用到的数据库 

emp 姓名 

dept 部门名称 

确定已知的字段; 

雇员和编号:emp.deptno = dept.deptno 



SELECT  e.ename,d.dname,e.job 

FROM emp e,dept d 

WHERE e.deptno = d.deptno 

AND e.job = 'CLERK'; 



 7.列出最低薪金大于1500的各种工作。 



需要用到的数据库 

emp 薪金 



SELECT DICTINCT e.job 

FROM emp e 

WHERE e.sal >1500 ; 



 8.列出部门'SALES'工作的员工的姓名,假定不知道销售部的部门编号 



 需要用到数据表 

  
 dept :部门的名称 

  
  
emp 表:员工的姓名 

 SELECT e.ename 

 FROM emp e 

 WHERE e.deptno = (SELECT  d.deptno FROM  dept  d 

  
 WHERE d.dname = 'SALES'); 



 9.列出薪金高于公司公司平均薪金的所有员工: 



SELECT e.ename ,e.sal 

FROM emp e 

WHERE  e.sal >(SELECT AVG(sal) FROM emp); 



 10.列出与‘SCOTT’从事相同工作的所有员工; 



SELECT e.ename ,e.job 

FROM emp e 

WHERE e.job = (SELECT job FROM emp WHERE ename='SCOTT') 

AND e.ename <> 'SCOTT';  



 11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金: 



第一步:求出部门30的员工的薪金 

SELECT e.ename,e.sal ,e.deptno FROM  emp e 

WHERE  e.deptno = 30; 

第二步 所有员工的姓名和薪金 

       SELECT e.ename,e.sal 

       FROM emp e 

       WHERE e.sal IN( 

        
  SELECT e.sal FROM  emp e 

WHERE  e.deptno = 30 

); 



 12.列出薪金高于在部门30工作中所以员工的薪金的员工姓名和薪资 



SELECT  e.ename,e.sal 

FROM emp e 

WHERE e.sal > All(      //大于最大的,或者小于最小的 

SELECT e.sal FROM emp e 

WHERE e.deptno  =30 

); 



 13.列出在每个部门工作的员工数量、平均工作个平均服务期限 



确定需要的数据表  

 dept  部门名称 

         emp  得出员工数量,平均服务期限 



   确定已知的关联字段 

    
 雇员与部门:dept.deptno = emp.deptno 



   第一步按照部门分组得到部门中员工的数量 

   SELECT d.dname ,COUNT(*) 

   FROM emp e ,dept d 

   WHERE e.deptno(+) = d.deptno 

   GROUP BY d.dname 



第二步:求平均年限  



SELECT TRUNC (AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12))  

FROM emp; 

 

第三步:得出结果: 

SELECT d.dname ,COUNT(*), 

TRUNC (AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12)) a 

   FROM emp e ,dept d 

   WHERE e.deptno(+) = d.deptno 

   GROUP BY d.dname 



 14.列出所有员工的姓名,部门名称和工资: 



确定需要的数据表 

emp 姓名,工资 

dept 部门名称 



已知的关系字段: 

雇员和员工: 

emp.depton = dept.deptno 

 

SELECT e.ename,d.dname,e.sal 

FROM emp e ,dept d 

WHERE e.deptno = d.deptno; 



 15.列出所有部门的详细信息和部门人数; 



确定需要的数据表 



dept 部门信息 

emp 部门人数 



已知的关系字段: 



雇员和员工: 

emp.depton = dept.deptno 

 

SELECT d.deptno,d.dname,d.loc,COUNT(*) 

FROM dept d ,emp e 

WHERE e.deptno (+)= d.deptno 

GROUP BY d.deptno,d.dname,d.loc; 



 16.列出各个工作的最低工资; 

 

SELECT e.job,MIN(sal) 

FROM emp e 

GROUP BY e.job; 



查询所有有佣金的雇员: 

 

SELECT  e.empno,e.comm 

FROM emp e 

WHERE e.comm not null; 







 17.列出各个部门的'MANAGER'经理的最低薪金 



第一步:查询每个部门中的 'MANGER' 的工资; 

 

SELECT  d.dname,e.job 

FROM emp e,dept d 

WHERE e.deptno = d.deptno  

AND job = 'MANAGER'; 



第二步:按照部门分组,求出最低薪资 



//nvl处理空 

SELECT  d.dname,MIN(e.sal+NVL(comm, 0)) 

FROM emp e,dept d 

WHERE e.deptno = d.deptno  

AND job = 'MANAGER', 

AND comm is not null 

GROUP BY d.dname ; 



 18.列出所有员工的年工资,按年薪从低到高排序。 

 

SELECT (e.sal*12 + NVL(comm,0)) ss 

FROM emp e  

ORDER BY ss ; 



 19.创建一个用户test,要求拥有scott用户表的查询余额修改权限,dept的查询权限 



 20.查出某个员工的所有上级主管,并要求这些主管中的薪水超过3000(用一条SQL语句解决) 

 



SELECT e.ename,e.sal,m.ename,m.sal 

FROM emp e ,emp m 

WHERE e.mgr = m.empno 

AND m.sal>3000; 



 21.求出部门名称中,带有‘S’字符的员工的工资合计、部门人数 



要求:部门工资合计要大于5000,并且按照部门的人数排序 



确定要使用的数据表: 

emp:员工姓名,工资统计, 

dept:部门人数 



已知的关系字段: 

雇员和员工:emp.depton = dept.deptno 



第一步 部门名称中 带有‘S’字符的员工 

SELECT e.ename,e.sal,d.dname 

FROM emp e ,dept 

WHERE e.ename LIKE '%S%' 

AND e.depton = d.deptno; 



第二步发现 有重复的数数据,可以进行分组,并且结果如何: 



   SELECT d.dname,COUNT(*)come,SUM(e.sal)  

FROM emp e,dept d 

WHERE e.ename LIKE '%S%' 

AND e.deptno = d.deptno 

GROUP BY d.dname 

HAVING SUM(e.sal)>5000 

ORDER by come ; 





 22、给任职日期超过10年的人加薪10% 



第一步 查询日期超过10年的人 



SELECT e.ename,e.hiredate,e.sal 

FROM  emp e 

WHERE  (MONTHS_BETWEEN(SYSDATE,hiredate)) > 120; 



第二步:得出结果: 



SELECT e.ename,e.hiredate,e.sal*1.1,e.sal 

FROM  emp e 

WHERE  (MONTHS_BETWEEN(SYSDATE,hiredate)) > 120; 





 23、列出员工任职的年、月、日 

 

SELECT  ename,TO_CHAR(hiredate,'yyyy')year,TO_CHAR(hiredate,'mm') moneh,TO_CHAR(hiredate,'dd')day 

FROM emp ; 



 24、列出员工中薪水最低,任职日期最长的员工。 



SELECT MIN(e.sal),MAX(MONTHS_BETWEEN(SYSDATE,hiredate)) 

FROM  emp e 



 25、求出职工的周薪,保留两位小数、 



第一步 :得到月数: 

    SELECT e.ename,ROUND((MONTHS_BETWEEN(SYSDATE,hiredate)),2) week  

    FROM  emp e; 

    第二步 :得到天数 



 ------------------------------------------------------------------------------------ 

 1.范例: 要求查询出每一位雇员到今天为止雇佣的年限; 

第一步:年的计算比较简单:通过MONTHS_BETWEEN()来计算月,月除以12就是年 

SECLECT  e.ename, e.hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12)year 

             FROM emp e 

         第二步:月计算,对年求模就是月份 



         
SELECT e.ename,e.hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12)year, 

         
TRUNC(MOD (MONTHS_BETWEEN(SYSDATE,hiredate),12) ) months 

         
FROM emp e; 



         
 第三步:天数计算 

         
 日期  - 数字 = 日期   ADD_MONTHS(日期,数字)做干月之后的日期: 

         
 日期  - 日期 = 数字 



         
 TRUNC( SYSDATE - ADD_MONTHS(hiredate,MONTHS_BETWEEN(hiredate,SYSDATE))) day 





 ------------------------------------------------------------------------------------------ 

 2.范例: 要求查询出每一位雇员到今天为止雇佣的年限; 

第一步: 计算年 TRONC() --  截取小数,不进位 

SELECT ename, hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year 

FROM emp ; 

第二步:计算月 MOD()求模: 

SELECT ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year, 

TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) monse 

FROM emp; 

第三步:计算天: 

日期  - 数字 = 日期 

日期 - 日期 = 数字 



TRUNC(SYSDATE - ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate)))day 



SELECT ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year, 

TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) monse, 

   TRUNC(SYSDATE-ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate)))day 



FROM emp; 

 -------------------------------------------------------------------------------------- 



 1.列出与‘SCOTT’从事相同工作的所有员工及部门名称,部门人数,平均工资; 



确定需要的数据库 

emp: 所有的员工和统计人数和工资 

dept:部门名称 

确定已知字段  

雇员和部门   emp.deptno = emp.deptno  



第一步:找到和‘SCOTT ’ 从事相同工作的人 

SELECT  e.ename,e.job,e.sal 

FROM emp e  

WHERE  e.job = (SELECT job FROM emp WHERE  ename = 'SCOTT') 

AND e.ename <> 'SCOTT'; 



第二步:部门名称,部门人数,平均工资 



SELECT d.dname,COUNT(*),AVG(e.sal) 

FROM emp e ,dept d 

WHERE  e.job = (SELECT job FROM emp WHERE  ename = 'SCOTT') 

AND e.ename <> 'SCOTT' 

AND e.deptno = d.deptno 

GROUNP BY d.ename ; 

 ----------------------------------------------------------------------------------------- 

 范例2 :列出薪金高于在部门30工作的所有员工的薪金,以及高于公司平均工资的员工姓名和薪金、部门名称 

 部门平均工资,个人的工资等级。 



确定要使用的数据表: 

emp : 员工的姓名和薪金 

dept : 部门名称 

salgrade : 工资等级 



已知的关联字段: 

雇员与部门: emp.deptno = dept.deptno; 

雇员与工资等级:emp.sal BETWEEN salgrade.losal AND salgrade.hisal; 



第一步:查询出所有在30部门工作的员工工资, 

SELECT  sal  FROM  emp WHERE  deptno = 30; 



第二步:查询所有大于部门30的员工的工资 

SELECT sal FROM emp  

WHERE sal >ALL( 

SELECT sal FROM emp WHERE deptno= 30; 

) 



第三步:查询所有高于公司平均工资的员工姓名和薪金 

SELECT ename ,sal FROM emp  

WHERE sal >ALL (  

SELECT  sal FROM emp  WHERE depeno = 30 

)AND sal > (SELECT AVG(sal) FROM emp ); 



第四步:查询部门名称和部门的平均工资 

SELECT e.ename,e.sal,temp.ag,d.dname 

FROM emp e ,( 

SELECT deptno,trunc(AVG(sal)) ag 

FROM emp  

GROUP BY deptno 

) temp,dept d 

WHERE e.sal >ALL( 

SELECT sal FROM emp WHERE deptno = 30 

  )AND e.sal > (SELECT AVG(sal)FROM emp) 

  AND d.deptno = e.deptno 

  AND temp.deptno = e.deptno ; 

第五步: 个 人的工资等级 



SELECT e.ename,e.sal,temp.ag,d.dname 

FROM emp e ,( 

SELECT deptno,trunc(AVG(sal)) ag 

FROM emp  

GROUP BY deptno 

) temp,dept d,salgrade s 

WHERE e.sal >ALL( 

SELECT sal FROM emp WHERE deptno = 30 

  )AND e.sal > (SELECT AVG(sal)FROM emp) 

   AND d.deptno = e.deptno 

   AND temp.deptno = e.deptno  

   AND e.sal BETWEEN s.losal AND s.hisal; 

 ---------------------------------------------------------------------------------