DKU/데이터베이스기초

[데이터베이스기초] 4주차 - 실습과제

ʕ민지ʔ 2022. 9. 2. 17:23

[실습과제1]

1. BOSTON에 있는 부서의 이름은 무엇인가

select dname
from dept
where loc = 'boston';

2. 담당업무가 ANALYST인 사원의 이름, 입사일자를 보이시오

select ename, hiredate
from emp
where job='analyst';

3. 입사일자가 1981년 9월 1일 이후인 사원의 이름과 입사일자를 보이시오

select ename, hiredate
from emp
where hiredate>='1981-09-01';

4. 연봉이 3000에서 4000 사이인 사원의 이름, 연봉을 보이시오

select ename, sal
from emp
where sal between 3000 and 4000;

5. 사장의 이름을 보이시오 (힌트: 사장은 매니저가 없다)

select ename
from emp
where mgr is null;

6. 담당업무가 MANAGER가 아닌 사원들의 이름, 담당업무를 보이시오

select ename, job
from emp
where job <> 'manager';

7. 담당업무가 CLERK, ANALYST, SALESMAN인 사원들의 이름, 담당업무, 급여를 보이시오

select ename, job, sal
from emp
where job in ('clerk', 'analyst', 'salesman');

8. 연봉이 3000에서 4000 사이 이거나 담당업무가 MANAGER인 사원의 이름, 연봉을 보이시오

select ename, sal
from emp
where (sal between 3000 and 4000)
or (job = 'manager');

9. 보너스를 받는 사원들의 이름과 보너스 금액을 보이시오

select ename, comm
from emp
where comm is not null;

10. 부서번호가 20인 사원 중에서 담당업무가 CLERK이고 매니저의 사원번호가 7902인 사람의 이름을 보이시오

select ename
from emp
where deptno = 20
and job = 'clerk'
and mgr = 7902;

 

[실습과제2]

1. 담당업무가 CLERK인 사원은 모두 몇 명인가

select count(*)
from emp
where job = 'clerk';

2. 담당업무가 CLERK인 사원의 최고 연봉 금액과 최저 연봉금액, 그리고 두 금액의 차이 금액을 보이시오

select max(sal), min(sal), max(sal)-min(sal)
from emp
where job='clerk';

3. 입사일이 1981년 9월 1일 이후인 사원의 평균 연봉을 보이시오

select avg(sal)
from emp
where hiredate>='1981-09-01';

4. 매니저의 사원번호가 7698, 7639, 7782이 아닌 사원의 이름, 담당업무를 보이시오

select ename, job
from emp
where mgr not in (7698, 7639, 7782);

위 코드의 경우 사장이 빠지게 되므로 아래의 코드와 같이 작성해야 한다.

select ename, job
from emp
where mgr not in (7698, 7639, 7782) or mgr is null;

5. 1982년도와 1983년도에 입사한 사원의 이름, 입사일자를 보이시오

select ename, hiredate
from emp
where hiredate between '1982-01-01' and '1983-12-31';

6. 담당업무 이름에 NA를 포함하고 있는 사원의 이름, 담당업무를 보이시오

select ename, job
from emp
where job like '%NA%';

7. 보너스를 받는 사원의 이름과 보너스와 연봉을 합한 금액을 보이시오

select ename, sal+comm
from emp
where comm is not null;

8. 모든 사원의 연봉을 10% 올려주려면 현재보다 돈이 얼마나 더 있어야 하는지 보이시오

select sum(sal*1.1)-sum(sal)
from emp;
select sum(sal*0.1)
from emp;

 

[실습과제3]

1. 모든 사원들의 이름을 알파벳 역순으로 보이시오

select ename
from emp
order by ename desc;

2. 모든 담당업무명을 알파벳 순으로 보이시오

select distinct job
from emp
order by ename;

3. 모든 사원의 이름과 업무, 급여를 급여 순으로 보이시오

select ename, job, sal
from emp
order by sal;

4. 모든 사원의 이름과 부서번호를 입사일자순으로 보이시오

select ename, deptno
from emp
order by hiredate;

5. 모든 사원의 사원번호, 이름, 급여를 부서번호순으로 보이시오

select empno, ename, sal
from emp
order by deptno;

6. 담당 업무별 평균 연봉을 보이시오

select job, avg(sal)
from emp
group by job;

7. 부서별 평균 연봉을 보이되 많은 연봉 우선으로 보이시오

select deptno, avg(sal)
from emp
group by deptno
order by avg(sal) desc;

8. 각 부서별 최고 연봉을 보이시오

select deptno, max(sal)
from emp
group by deptno;

9. 모든 사원의 정보를 담당업무에 대해 오름차순으로, 그리고 같은 업무 내에서는 연봉 내림차순으로 정렬하여 보이시오

select *
from emp
order by job, sal desc;

10. 각 매니저별 담당 사원의 인원수, 평균 연봉을 보이시오

select mgr, count(*), avg(sal)
from emp
group by mgr;

위의 코드와 같이 작성할 수도 있으나, mgr이 null인 행이 포함되므로 아래의 코드가 바람직하다.

select mgr, count(*), avg(sal)
from emp
where mgr is not null
group by mgr;

11. 각 담당업무별로 최고 연봉과 최저 연봉을 보이시오

select job, max(sal), min(sal)
from emp
group by job;

12. 담당업무별 인원수, 평균연봉을 보이되 업무별 인원수가 3명 이상인 경우에 대해서만 보이시오

select job, count(*), avg(sal)
from emp
group by job
having count(*) >= 3;

13. 각 부서별 부서번호, 사원수, 연봉 합계를 보이시오

select deptno, count(*), sum(sal)
from emp
group by deptno;

14. 각 부서별 부서번호, 사원수, 연봉 합계를 보이되 사원수가 3명 이상인 부서의 정보만 보이시오

select deptno, count(*), sum(sal)
from emp
group by deptno
having count(*) >= 3;

15. 부서번호, 부서별 사원수, 연봉 합계를 보이되 급여 합계가 9000~10000 사이인 경우만 보이시오. 단, 입사일자가 1981-01-01 이전 사원은 제외하고, 연봉 합계가 많은 순으로 출력하시오.

select deptno, count(*), sum(sal)
from emp
where hiredate > '1981-01-01'
group by deptno
having sum(sal) between 9000 and 10000
order by sum(sal) desc;