책/예제 따라가며 쉽게 배우는 오라클 연습문제

예제 따라가며 쉽게 배우는 오라클 연습문제

이대은 2022. 5. 1. 04:55

오탈자 있을 수 있습니다.

1) 사원번호가 7499인 사원의 이름, 입사일, 부서번호를 출력하여라.

SELECT ename, hiredate, deptno
FROM emp
WHERE empno = 7499;

 

2) 이름이 ALLEN인 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE ename = 'ALLEN';

 

3) 이름이 K보다 큰 글자로 시작하는 사원의 모든 정보를 출력하여라.
(글자 비교 가능  :  A부터 Z순으로 커짐)

SELECT *
FROM emp
WHERE ename > 'K';

 

4) 입사일이 02-APR-81보다 늦고 09-DEC-82보다 빠른 사원의 이름, 급여, 부서번호를 출력하여라. 
(날짜는 사용하는 컴퓨터의 표현 형식을 따라 표기해야 함)

SELECT ename, sal, deptno
FROM emp
WHERE hiredate > '81/04/02' AND hiredate < '82/11/09';

 

5) 급여가 1600보다 크고 3000보다 작은 사원의 이름, 직무, 급여를 출력하여라.

SELECT ename, job, sal
FROM emp
WHERE sal > 1600 AND sal < 3000;

 

6) 직업이 MANAGER이거나 SALESMAN인 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE job = 'MANAGER' OR job = 'SALESMAN';

 

7) 급여가 1500이상이고, 부서번호가 30번인 사원 중 직무가 MANAGER인 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE sal >= 1500 AND deptno = 30 AND job = 'MANAGER';

 

8) 직무가 MANAGER가 아닌 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE NOT job = 'MANAGER';

 

9) 1981년 4월 2일 이후에 입사한 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE hiredate > '81/04/02';

 

10) 사원번호가 7698보다 작거나 같은 사원들의 사원번호와 이름을 출력하여라.

SELECT empno, ename
FROM emp
WHERE empno <= 7698;

 

11) 사원번호가 7654와 7782 사이 이외의 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE NOT (empno > 7654 AND empno < 7782);

 

12) 부서가 30번이고 급여가 1500 이상인 사원의 이름, 부서, 급여를 출력하여라.

SELECT ename, deptno, sal
FROM emp
WHERE deptno = 30 AND sal >= 1500;

 

13) 입사일이 81년 이외에 입사한 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE NOT (hiredate LIKE '81%');

 

14) 부서 번호가 20, 30번을 제외한 모든 사원의 이름, 사원번호, 부서 번호를 출력하여라.

SELECT ename, empno, deptno
FROM emp
WHERE NOT (deptno = 20 OR deptno = 30);

 

15) 이름이 S로 시작하는 사원의 사원번호, 이름, 입사일, 부서번호를 출력하여라.

SELECT empno, ename, hiredate, depto
FROM emp
WHERE ename LIKE 'S%';

 

16) 입사일이 81년도인 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE hiredate LIKE '81%';

 

17) 이름 중 S자가 들어가 있는 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE ename LIKE '%S%';

 

18) 이름이 S자로 시작하고 마지막 글자가 T인 사원의 모든 정보를 출력하여라 (단, 이름은 전체 5자리이다.)

SELECT *
FROM emp
WHERE ename LIKE 'S___T';

혹은

SELECT *
FROM emp
WHERE ename LIKE 'S%T' AND LENGTH(ename) = 5;

 

19) 이름의 처음 글자는 관계없고 두 번째 글자가 A인 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE ename LIKE '_A%';

 

20) 커미션이 NULL이 아닌 사원의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE NOT (comm IS NULL);

혹은

SELECT *
FROM emp
WHERE comm is NOT NULL;

 

21) 부서번호가 30인 사원들의 모든 정보를 사원번호에 대해 오름차순으로 정렬하여라.

SELECT *
FROM emp
WHERE deptno = 30
ORDER BY empno ASC;

혹은

SELECT *
FROM emp
WHERE deptno = 30
ORDER BY empno;

 

22) 사원의 모든 정보를 부서번호에 대해 내림차순으로 정렬하고 이름에 대해 오름차순으로, 급여에 대해 내림차순으로 정렬하여라.

SELECT *
FROM emp

ORDER BY deptno DESC, ename ASC, sal DESC;

 

23) 부서번호가 10인 사원의 사원번호, 이름, 급여, 커미션을 커미션에 대해 오름차순으로 정렬한 후 사원번호에 대해 내림차순으로 정렬하여라.

SELECT empno, ename, sal, comm
FROM emp
WHERE deptno = 10
ORDER BY comm, empno DESC;

 

24) 사원의 모든 정보를 부서번호에 대해 오름차순으로 정렬한 후 급여가 많은 사원부터 차례로 출력하여라.

SELECT *
FROM emp
ORDER BY deptno, sal DESC;

 

25) 급여가 1500부터 3000 사이의 사원에 대해서만 급여의 15%를 회비로 지불하기로 하였다. 조건에 해당되는 사원의 이름, 급여, 회비(소수 이하 2자리까지 반올림)를 출력하여라.

SELECT ename, sal, ROUND(sal*0.15, 2) AS 회비
FROM emp
WHERE sal > 1500 AND sal < 3000;

 

26) 이름의 글자수가 6자 이상인 사원의 이름을 앞에서 3자만 구하여 소문자로 이름만 출력하여라.

SELECT LOWER(SUBSTR(ename, 1, 3)
FROM emp
WHERE LENGTH(ename) >= 6;

 

27) 직무가 'CLERK'인 사원들의 사원번호, 이름, 급여를 표시하여라.
(단, 급여는 1000 단위마다 콤마(,)를 찍고 앞에는 국가별 회폐 단위를 붙여 표시하여라)

SELECT empno, ename, TO_CHAR(sal, 'L999,999') 
FROM emp
WHERE job='CLERK';

 

28) 모든 사원에 대해 사원의 이름은 앞에서 세 글자만 대문자로, 직무는 소문자로 하여 이름(세 글자), 직무, 부서 번호를 출력하여라.

SELECT UPPER(SUBSTR(ename, 1, 3)) "이름", LOWER(job) "직무", depton
FROM emp;

 

29) 모든 사원에 대해 사원의 이름과 부서번호를 합성시켜 "연결예제"라는 heading으로 출력하여라.

SELECT CONCAT(ename, deptno) "연결예제"
FROM emp;

혹은

SELECT ename || deptno "연결예제"
FROM emp;

 

30) 사원의 직무가 'SAL'로 시작하는 사원의 이름과 사원 이름의 길이를 출력하여라.

SELECT ename, length(ename) "이름 길이"
FROM emp
WHERE SUBSTR(job, 1, 3)='SAL';

 

31) 이름의 두 번째 글자가 'A'인 사원들의 이름과 직무를 출력하여라.
(단, 직무는 앞에서부터 세 글자만 표시하여라)

SELECT ename, SUBSTR(job, 1, 3) "job"
FROM emp
WHERE ename LIKE '_A%':

 

32) 모든 사원에 대해 입사일로부터 90일이 지난 후의 날짜를 계산해서 이름, 입사일, 90일 후의 날짜, 급여를 출력하여라.

SELECT ename, hiredate, hiredate+90, sal

FROM emp;

 

33) 모든 사원에 대해 입사한 달의 근무 일 수를 계산하여 부서번호, 이름, 근무 일 수를 출력하여라.

SELECT deptno, ename, LAST_DAY(hiredate)-hiredate "근무일수"
FROM emp;

 

34) 모든 사원에 대해 입사한 날로부터 60일이 지난 후의 '월요일'이 몇 년, 몇 월, 몇 일인지를 구하여 이름, 입사일, 60일 후의 '월요일' 날짜를 출력하여라.

SELECT ename, hiredate, NEXT_DAY(hiredate+60, '월') "월요일"
FROM emp;

 

35) 현재의 7일 전과 7일 후, 그리고 30일이 지난 후의 첫 번째 월요일을 출력하여라.

SELECT SYSDATE-7, SYSDATE+7, NEXT_DAY(SYSDATE+30, '월')
FROM dual;

 

36) 모든 사원에 대해 입사일로부터 6개월이 지난 후의 날짜를 계산해서 이름, 입사일, 6개월 후의 날짜를 출력하여라.

SELECT ename, hiredate, ADD_MONTHS(hiredate, 6) "6개월 후"
FROM emp;

 

37) 사원번호가 짝수인 사원들의 모든 정보를 출력하여라.

SELECT *
FROM emp
WHERE MOD(empno, 2) = 0;

 

38) 모든 사원의 이름, 급여, 커미션, 총액(급여+커미션)을 구하여 총액이 많은 순서로 출력하여라.
(단, 커미션이 null인 사원도 0으로 해서 포함하여라)

SELECT ename, sal, comm, sal+NVL(comm, 0) AS "총액"
FROM emp
ORDER BY 총액 DESC;

 

39) 급여가 1500부터 3000사이의 사원에 대해서만 급여의 15%를 회비로 지불하기로 하였다. 조건에 해당되는 사원의 이름, 급여, 회비(소수 이하 2자리까지 반올림)를 출력하여라.

SELECT ename, sal, ROUND(sal*0.15, 2) "회비"
FROM emp
WHERE sal > 1500 AND sal < 3000;

 

40) 사원들의 사원번호와 급여, 커미션, 연봉((comm+sal)*12)을 연봉이 많은 순서로 출력하여라.
(단,  커미션이 null인 사원도 0으로 계산하여라)

SELECT empno, sal, comm, (NVL(comm, 0)+sal)*12 AS "연봉"
FROM emp
ORDER BY 연봉 DESC;

 

41) 모든 사원에 대해 사원들의 이름, 급여, 커미션을 급여가 적은 것부터 출력하여라.
(단, 커미션이 없는 사원은 'No Commision'이라는 말이 출력되게 하여라.)

SELECT ename, sal, NVL(TO_CHAR(comm, '999999'), 'No Commission') "comm"
FROM emp
ORDER BY sal;

혹은

SELECT ename, sal, DECODE(comm, NULL, 'No Commision', comm, comm) "comm"
FROM emp
ORDER BY sal;

 

42) 'CLERK'은 20%, 'SALESMAN'은 15%, 'ANALYST'는 10%, 'MANAGER'는 5%, 'PRESIDENT'는 0%와 같이 업무에 따라 급여 인상을 다르게 할 경우, 모든 사원들의 이름, 직무, 급여, 인상 후의 급여를 출력하여라.

SELECT ename, job, sal, DECODE(job, 'CLERK', sal*1.20,
                                                                'SALESMAN', sal*1.15,
                                                                'ANALYST', sal*1.10,
                                                                'MANAGER', sal*1.05,
                                                                'PRESIDENT', sal) "Decode"
FROM emp;

 

43) 모든 사원들의 입사한 년도와 입사한 달을 출력하여라.

SELECT TO_CHAR(hiredate 'YY/MM') "hire"
FROM emp;

 

44) 10번 부서에 대해 급여의 평균 값, 최대 값, 최소 값, 인원수를 구하여 출력하여라.

SELECT AVG(sal), MAX(sal), MIN(sal), COUNT(ename) "인원수"
FROM emp
WHERE deptno=10;

 

45) 각 부서별 같은 직무를 갖는 사원의 인원수를 구하여 부서번호, 직무, 인원수를 출력하여라.

SELECT deptno, job, COUNT(ename)
FROM emp
GROUP BY deptno, job
ORDER BY deptno;

 

46) 사원들의 직무별 평균급여와 최고급여, 최저급여를 평균급여에 대해 오르차순으로 정렬하여라.

SELECT AVG(sal), MAX(sal), MIN(sal)
FROM emp
GROUP BY job
ORDER BY AVG(sal);

 

47) 사원이름의 두 번째 글자가 'A'인 사원들의 수를 출력하여라.

SELECT COUNT(ename)
FROM emp
WHERE SUBSTR(ename, 2, 1) = 'A';

 

48) 사원들의 평균급여, 총 급여, 최고 급여액, 최저 급여액을 구하여라.

SELECT AVG(sal), SUM(sal), MAX(sal), MIN(sal)
FROM emp;

 

49) 평균 급여가 1500이 넘는 직무와 평균급여를 구하여라.

SELECT job, AVG(sal)
FROM emp
GROUP BY job
HAVING AVG(sal) > 1500;

 

50) 부서별 평균 급여가 2000보다 적은 부서 사원들의 부서번호를 출력하여라.

SELECT deptno
FROM emp
GROUP BY deptno
HAVING AVG(sal) < 2000;

 

51) EMP와 DEPT 테이블을 조인하여 모든 사원에 대해 부서번호, 부서이름, 사원이름, 급여를 출력하여라.

SELECT e.deptno, d.dname, e.ename, e.sal
FROM emp e, dept d
WHERE e.deptno = d.deptno;

 

52) 이름이 'ALLEN'인 사원의 부서이름을 출력하여라.

SELECT d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno AND e.ename='ALLEN';

 

53) 'ALLEN'과 직무가 같은 사원의 이름, 부서이름, 급여, 부서위치를 출력하여라.

SELECT e.ename, d.dname, e.sal, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno AND job = (SELECT job
                                                                    FROM emp
                                                                    WHERE ename='ALLEN');

 

54) 전체 사원의 평균 급여보다 급여가 많은 사원의 사원번호, 이름, 부서 이름, 입사일, 부서위치, 급여를 출력하여라.

SELECT e.empno, e.ename, d.dname, e.hiredate, d.loc, e.sal
FROM emp e, dept d
WHERE e.deptno = d.deptno AND sal > (SELECT avg(sal)
                                                                   FROM emp); 

 

55) 10번 부서 사원들 중에서 20번 부서의 사원과 같은 직무를 갖는 사원의 사원번호, 이름, 부서이름, 입사일, 부서위치를 출력하여라.

SELECT e.empno, e.ename, d.dname, e.hiredate, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.deptno = 10
AND e.job IN(SELECT job
                       FROM emp
                       WHERE deptno = 20);

 

56) 'ALLEN'의 급여보다 많고 'SCOTT'의 급여보다 적은 사원의 사원번호, 이름, 부서이름, 부서위치, 급여를 급여가 많은 순으로 출력하여라.

WHERE  e.empno, e.ename, d.dname, d.loc, e.sal
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND sal > (SELECT sal
                  FROM emp
                  WHERE ename = 'ALLEN')
AND sal < (SELECT sal
                  FROM emp
                  WHERE ename = 'SCOTT')
ORDER BY sal DESC;

 

57) 사원들의 이름, 부서이름, 급여를 출력하여라.

SELECT e.enaem, d.dname, e.sal
FROM emp e, dept d
WHERE e.deptno = d.deptno;

 

58) 각 부서별 부서번호(모든 부서에 대해서), 부서이름, 부서위치, 사원의 수를 출력하여라.

SELECT d.deptno, d.dname, d.loc, COUNT(ename)
FROM emp e, dept d
WHERE e.deptno(+)=d.deptno
GROUP BY d.deptno, d.dname, d.loc
ORDER BY d.deptno;

 

59) 'FORD'와 부서가 같은 사원들의 이름, 부서이름, 직무, 급여를 출력하여라.

SELECT e.ename, d.dname, e.job, e.sal
FROM emp e, dept d
WHERE e.deptno = d.deptno AND e.deptno = (SELECT deptno
                                                                             FROM emp
                                                                             WHERE ename='FORD'); 

 

60) 부서이름이 'SALES'인 사원들의 평균 급여보다 급여가 많고, 부서이름이 'RESEARCH'인 사원들의 평균 급여보다 급여가 적은 사원들의 이름, 부서번호, 급여, 직무를 출력하여라.

SELECT ename, deptno, sal, job
FROM emp
WHERE sal > (SELECT AVG(e.sal)
                       FROM emp e, dept d
                       WHERE e.deptno = d.deptno AND d.dname = 'SALES')
AND       sal > (SELECT AVG(e.sal)
                        FROM emp e, dept d
                        WHERE e.deptno = d.deptno AND d.dname = 'RESEARCH');

 

61) 30번 부서의 최고 급여보다 급여가 많은 사원의 사원번호, 이름, 급여를 출력하여라.

SELECT empno, ename, sal
FROM emp
WHERE sal > (SELECT MAX(sal)
                       FROM emp
                       WHERE deptno=30);

 

62) 10번 부서 사원들의 사원이름과 상사의 이름을 출력하여라.

SELECT e1.ename, e2.ename AS "상사"
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno AND e1.deptno = 10;