Oracle基础练习



1. 计算100被9除的余数(取模计算)
答:select mod(100,9) from dual
 
2. 读取系统时间,并转换成一定的格式(yyyy/mm/dd hh:mm:ss)
格式:年度(4位数字)+'/'+月份(2位数字)+'/'+日期(2位数字)+’ ’+小时:分:秒
答:select to_char(systimestamp,'yyyy/mon/dd hh24:mi:ss') from dual
 
3. 如何用一条SQL,取得本月第一天、最后一天,当天日期(没时间)、之后第3 天日期
 
Select
 
Extract(DAY FROM Add_months(last_day(sysdate)+1,-1)) --本月第一天
 
,last_day(sysdate) --最后一天
 
,sysdate --当天日期(没时间)
 
,sysdate+3 --之后第3 天日期
 
from dual
 
4. 用一SQL显示所有职工的佣金内容数据,格式如下:
如有佣金值,则显示“佣金:”+佣金值;没有,则显示“佣金:无”
SELECT ENAME,nvl2(comm,'佣金:'||comm,'佣金:无') comm FROM EMP;
 
5. 查询一下单位中所有的人数,最高工资,最低工资,平均工资,最高分红,最低分红   
 
select count(1),max(sal),min(sal),avg(sal),max(comm),min(comm) from emp;
 
6. 查询每个部门中担任相同职务的人数   
select deptno,job,count(job) from emp group by deptno,job
 
7. 查询每个部门中职工(CLERK)的人数   
select deptno,job,count(job) from emp group by deptno,job having job='CLERK'
 
8. 查询不同年度参加工作的人的人数和平均工资   
SELECT COUNT(1),AVG(SAL),EXTRACT(YEAR FROM HIREDATE) FROM EMP 
 
GROUP BY EXTRACT(YEAR FROM HIREDATE)
 
9. 查询每个经理的直接下属人数   
SELECT DEPTNO,COUNT(1) FROM EMP WHERE MGR IN 
 
(SELECT EMPNO FROM EMP WHERE JOB='MANAGER') GROUP BY DEPTNO
 
10. 查询每个部门的平均工资,以及该部门的最高工资和平均工资的差   
SELECT DEPTNO,AVG(SAL),MAX(SAL)-AVG(SAL) FROM EMP GROUP BY DEPTNO
 
11. 查询人数超过3个人的职务,按照人数排序   
SELECT * FROM (SELECT JOB,COUNT(JOB) J FROM EMP GROUP BY JOB ORDER BY J) 
 
WHERE J>3 
 
12. 查询人数超过3人的部门,按部门排序   
SELECT * FROM (SELECT DEPTNO,COUNT(1) J FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO) WHERE J>3
 
13. 查询有超过两个“职员”的部门
SELECT * FROM (SELECT DEPTNO,COUNT(1) J FROM EMP GROUP BY DEPTNO ORDER BY DEPTNO) WHERE J>2
 
14. 按照不同工资1000以下,1000~2000,2000~3000,3000以上分等,每等级有多少个人?
 
SELECT SAL_GRADE,COUNT(1) FROM(
 
SELECT CASE 
 
        WHEN SAL>=3000 THEN 1
 
        WHEN SAL>=2000 AND SAL<3000 THEN 2
 
        WHEN SAL>=1000 AND SAL<2000 THEN 3
 
        ELSE  4
 
        END SAL_GRADE
 
FROM EMP)GROUP BY SAL_GRADE
 
15. 查询所有职工的姓名,以及他们直接领导的姓名(如果有的话)   
SELECT A.ENAME,B.ENAME FROM EMP A,EMP B WHERE A.MGR=B.EMPNO
 
16. 查询员工为“SMITH”的所有上级  
 
set serveroutput on;
 
DECLARE
 
   mgrno emp.empno%TYPE;
 
   TYPE empno_type IS TABLE OF emp.empno%TYPE
 
      INDEX BY BINARY_INTEGER;
 
   empnos empno_type;
 
   indx int:=0;
 
BEGIN
 
   SELECT mgr
 
     INTO mgrno
 
     FROM emp
 
    WHERE ename = 'SMITH';
 
 
 
   COMMIT;
 
 
 
   WHILE (mgrno IS NOT NULL)
 
   LOOP
 
      EXECUTE IMMEDIATE 'SELECT MGR FROM EMP WHERE EMPNO=(' || mgrno || ')'
 
                   INTO mgrno;
 
      empnos (indx) := mgrno;
 
      EXIT WHEN mgrno IS NULL;
 
      indx:=indx+1;
 
   END LOOP;
 
 
 
   FOR i IN empnos.FIRST .. empnos.LAST
 
   LOOP
 
      DBMS_OUTPUT.put_line (empnos (i));
 
   END LOOP;
 
END;
 
17. 查询员工为“JONES”的所有下级   
 
select empno,ename,job,mgr,deptno,level
 
,sys_connect_by_path(ename,'\') as path
 
,connect_by_root(ename) as top_manager 
 
from emp 
 
start with ename='JONES'
 
CONNECT BY PRIOR EMPNO=MGR;
 
18. 查询每个经理(MANAGER)的所有下级  
 
select empno,ename,job,mgr,deptno,level,
 
sys_connect_by_path(ename,'\') as path
 
,connect_by_root(ename) as top_manager 
 
from emp 
 
start with job='MANAGER'
 
CONNECT BY PRIOR EMPNO=MGR;
 
19. 假设,每个人的工资每满1000元,要多扣除10%的税费,不足一千元的扣除5%的税费查看每个职工扣多少钱?   
例如:2320元要扣除   2000   *   20%   +   320   *   5%   =   416
select sal,floor(sal/1000)*0.1*1000+(sal-floor(sal/1000)*1000)*0.05 from emp
 
20. 计算职工津贴,
算法为:参加工作每满一年津贴加15元,不足一年的如果超过4个月,则加10元
 
select floor(months_between(sysdate,hiredate)/12)*15+
 
case when floor(mod(months_between(sysdate,hiredate),12))>4 then 10 else 0 end  from emp;
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值