2026_01_07일 자습 시간 문제
문제1. 아래의 SQL을 WITH 절로 작성하고 튜닝전과 튜닝후의 버퍼의 갯수를 비교하시오 ( 이수자 평가 예상문제 10번)
코드 :
--튜닝전
SELECT d.department_name, s.sum_sal
FROM (
-- [반복 1] 메인 집합을 위한 부서별 합계 계산
SELECT department_id, SUM(salary) AS sum_sal
FROM employees
GROUP BY department_id
) s
JOIN departments d ON s.department_id = d.department_id
WHERE s.sum_sal > (
-- [반복 2] 평균값을 구하기 위해 똑같은 로직을 또 작성
SELECT AVG(sum_sal)
FROM (
SELECT department_id, SUM(salary) AS sum_sal
FROM employees
GROUP BY department_id
)
);
--튜닝후
WITH w_employees AS ( SELECT department_id, SUM(salary) AS sum_sal
FROM employees
GROUP BY department_id)
SELECT d.department_name, s.sum_sal
FROM w_employees s
JOIN departments d ON s.department_id = d.department_id
WHERE s.sum_sal > (SELECT AVG(sum_sal) FROM w_employees f);
문제2. 정규식 함수를 이용하여 다음과 같이 출력하시오
문제3. OCP 문제. 아래의 OCP 문제를 테스트 하시오
테스트 환경 세팅
코드 :
--문제3. OCP 문제. 아래의 OCP 문제를 테스트 하시오
DROP TABLE TEST_EMP;
-- 1. 세션의 날짜 포맷을 문제와 동일하게 'DD-MON-YY'로 변경 (중요)
-- 영문 환경 가정을 위해 언어도 변경합니다.
ALTER SESSION SET NLS_DATE_LANGUAGE = 'AMERICAN';
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY';
-- 2. 테스트용 테이블 생성 및 데이터 삽입
CREATE TABLE TEST_EMP (
EMP_NAME VARCHAR2(10),
JOIN_DATE DATE,
SALARY NUMBER(8, 2)
);
-- 데이터 한 건 입력 (오늘 날짜와 급여 5000)
INSERT INTO TEST_EMP VALUES ('YuYeonsu', SYSDATE, 5000);
COMMIT;
-- 데이터 확인 (날짜가 DD-MON-YY 형태로 나오는지 확인)
SELECT * FROM TEST_EMP;
-- [A] 형변환 에러 발생 예상 (ORA-01843 또는 ORA-01861)
-- 이유: '10-02-2018'의 포맷이 세션 설정(DD-MON-YY)과 맞지 않음
SELECT join_date
FROM TEST_EMP
WHERE join_date > '10-02-2018';
-- [B] 성공: 날짜와 숫자가 문자로 변환되어 연결됨
SELECT join_date || ' ' || salary AS result_b
FROM TEST_EMP;
-- [C] 성공: 날짜가 문자로 변환되어 SUBSTR 수행 후, 숫자 10을 뺌
-- 예: '07-JAN-26' -> '07' -> 7 - 10 = -3
SELECT SUBSTR(join_date, 1, 2) - 10 AS result_c
FROM TEST_EMP;
-- [D] 성공: 문자 '20'이 숫자로 변환되어 날짜에 20일을 더함
SELECT join_date + '20' AS result_d
FROM TEST_EMP;
-- [E] 성공: 문자 '120.50'이 숫자로 변환되어 급여에 더해짐
SELECT salary + '120.50' AS result_e
FROM TEST_EMP;