본문 바로가기
국비 과정/Oracle DataBase

DB - 0826 예제

by 코딩호야 2022. 8. 26.

Q ] 가장최근에 입사한 사원의 입사일과 가장 먼저 입사한 사원의 입사일을 출력하시요
A ] select max(hiredate) 최근입사 , min(hiredate) 먼저입사 from emp;

Q ] 30번 소속 사원중에서 커미션을 받는 사원의 수를 카운트 하시요.
A ] select count(deptno) from emp where deptno = '30' and nvl(comm,0) != 0;
A ] select count(*) from emp where deptno = 30 and comm > 0;
// * 로 count 해주면 null 값도 카운트 해준다.

 

Q ] mgr 컬럼(상관의 사원번호)에서 중복을 배제하고 출력하시요.
A ] select distinct(mgr) from emp; //연산이 아니므로 null 값도 출력됨.

 

Q ] 소속 부서별 사원의 수와 커미션을 받는 사원의 수를 카운트하시요 
단 0원도 받는사원이다.
A ] select deptno,  count(*) , count(comm) from emp group by(deptno);

Q ] emp 테이블에서 년도별로 사원들이 몇명 입사했는지 카운트 하시요.
A ] select substr(hiredate,1,2) "년도", count(*) "카운트" 
from emp group by(substr(hiredate,1,2));
A ] select to_char(hiredate,'YYYY'),count(*) 
from emp group by to_char(hiredate,'YYYY');

A ]  select count(decode(to_char(hiredate,'yyyy'),'1980',1))as "1980",
    count(decode(to_char(hiredate,'yyyy'),'1981',1))as "1981",
    count(decode(to_char(hiredate,'yyyy'),'1982',1))as "1982",
    count(decode(to_char(hiredate,'yyyy'),'1987',1))as "1987"
    from emp;

    => 문자형으로 바꾼 입사년도를 1980년과 비교를 하여서 true 면 1 의 값을 주었다.
(decode 1번식 , '1980',1)
1의 값을 준 (1980년도) 것을 count 하였다.

 

Q ] 부서별 평균급여를 구하고 그 결과 평균급여가 2000 이상인 부서만 출력하세요.
A ] select deptno , avg(sal) from emp group by deptno 
HAVING avg(sal) >= 2000;

Q ] 1981년 5월 31일 이후 입사자 중에서 
커미션이 null 이거나 0 인 사원의 커미션은 500으로 
그렇지 않으면기존 커미션을 출력하라.

A ] select ename 입사자 , hiredate ,
decode(comm,null,500,
    0 ,  500,
    comm)커미션 
   from emp 
   where hiredate > to_date(19810531)
   order by ename;

Q ] 부서별로 월급의 최대값과 최소값을 구하되 최대 급여가 2900 이상인 부서만 출력
A ]  select deptno, max(sal) "최대값",min(sal)"최소값" from emp
    group by deptno
    having max(sal) >= 2900;

Q ] 부서별 평균 급여를 구하고 그결과 평균 급여가 2000 이상인 부서만 출력하세요.
A ] select deptno , avg(sal) from emp
    group by deptno
    having avg(sal) >=2000;

Q ] 급여가 1000 이상인 사람들로 부서별 평균 급여를 구하고
그결과 평균 급여가 2000이상인 부서만 출력하세요.
A ] select deptno ,avg(sal) from emp 
    where sal >= 1000
    group by deptno
    having avg(sal) >=2000;


select job,count(*) cnt
from emp
where deptno in(10,20,30)
group by job
having count(*) > 2;

=> 그룹화해서 조건을 주겟다.

Q ] 이름에 'LA' 가 들어잇지 않고 
job의 월급의 합이 1000이상이 job 그룹과
job에 속한 사원수를 출력하시요
job , 카운트 , 합 형식으로 나오게 하시요.
    
A ] select job ,count(*)"카운트" , sum(sal)"합"
    from emp
    where ename not like '%LA%'
    group by job
    having sum(sal) >= 1000;

 

Q ] 'DALLAS' 에서 근무하는 사원의 이름과 직급과 월급과 근무지를 출력하는 쿼리문을 작성하시요

A ]  select deptno from dept where LOC = 'DALLAS';
A ]  select ename , job , sal from emp where deptno = 20;
=> 위 두 쿼리문을 아래의 한쿼리문으로 작성가능하다.

A ]  select e.ename, e.job , e.sal , d.loc from emp  e, dept d
where e.deptno = d.deptno AND d.loc = 'DALLAS';

Q ] 'RESERARCH' 부서에서 근무하는 사원들의 이름 , 입사일 , 월급 , 근무지 , 근무부서명 을 출력하시요
A ] select e.ename , e.hiredate , e.sal , d.loc
from emp e, dept d
where e.deptno = d.deptno AND d.dname ='RESERARCH';

Q ] 직급이 'MANAGER' 인 사원의 이름 , 월급 , 근무지 를 출력하는 쿼리문 작성
A ]  select e.ename , e.sal, d.loc
    from emp e , dept d
    where e.deptno = d.deptno and e.job = 'MANAGER';

Q ] 'ACCOUNTING' 부서 소속 사원들의 이름과 입사일과 근무지를 출력하시요
A ] select e.ename , e.hiredate , d.loc
    from emp e , dept d
    where e.deptno = d.deptno and d.dname = 'ACCOUNTING';

 

 

Q ] 각사원의 급여가 몇 등급인지 살펴보는 쿼리문
A ] select ename , sal , grade  from emp , salgrade 
where sal between losal and hisal;

Q ] emp 테이블의 한명의 사원이름과 소속 부서명 , 급여의 등급을 출력하는 쿼리문
( 사원 테이블에는 부서 이름과 급여 등급은 없고 , 부서 번호와 급여만 있다.)
A ] select e.ename , d.dname , s.grade
from emp e, dept d , salgrade s
where e.deptno = d.deptno and e.sal between s.losal and s.hisal;