본문 바로가기

배우기/복습노트[oracle sql]

[실습문제] 2023. 10. 30.(월) 문제 풀이(7문제)

728x90
반응형

실습문제1. PROFESSOR 테이블에서 2000년대 이전에 입사한 교수의 이름, 입사일, 이메일, 홈페이지 주소를 출력하여라. 단, 홈페이지 주소가 없는 경우 email_id를 사용하여 다음과 같이 출력되게 하라.

http://www.itwill.co.kr/myprode 

일단 원래라면 hpage가 빈 문자열일 경우와 null인 경우 두 개의 상황을 먼저 따져야 하지만 우리는 null이라고 이미 알고 있었다는 가정하에 풀었기 때문에, 나중에는 스스로 이런 포인트도 찾아봐야 할 것이다.

이 문제의 핵심은 nvl 사용법도 있지만 where절에 있다.

 

본 where 절은 hiredate < to_date('2000/01/01', 'YYYY/MM/DD/') 의 표현을 올바르게 했는지를 파악하여야 한다.

to_date의 포맷을 YYYY/MM/DD 처럼 읽어주세요, 라는 의미이다. 그렇기 때문에 to_date('2000-01-01', 'YYYY/MM/DD')처럼 앞뒤 포맷이 다르면 안된다. DBMS 날짜 포맷과 같은 경우만 날짜처럼 생긴 문자에 대하여 자동 파싱이 가능하다(날짜로 인식 및 날짜 변환). 

where hiredate < '2000/01/01' 했을 때 수행이 되기도 한다. 이는 묵시적 형 변환이 일어난 케이스이므로 성능에 영향을 미쳐서 지양해야 한다.

또한 2000년대 이전 조건을 extract하여 year만 뽑을 수도 있으나(내가 처음에 풀었던 방법), 이는 hiredate를 가공한 것으므로 이것 또한 성능에 좋지 않다.

이렇게 하나씩 알아내 가는 것이 튜닝의 기초이다.

즉, index scan을 고려한다면 위와 같은 방법은 좋지 않다.

 

 

실습문제 2. emp2 테이블에서 각 직원의 이름, 생년월일, 직급을 출력하여라. 단, 직급이 없는 경우는 '수습'으로 출력하고 생년월일은 다음과 같은 형식으로 출력하여라. 1976/05/25 => 1976년 5월 25일

이렇게 푸는 방법이 있긴 하지만, 다음과 같은 방법이 있다.

선생님께서는 위와 같은 방법으로 푸는 학생이 많다고 하셨다. 

아래와 같이 설명해주신 방법이 더 깔끔해보여서 앞으로 이렇게 접근해야겠다.

★to_char 날짜 포맷으로 적절하지 않은 문자를 함께 표현할 때에는 문자열 앞뒤에 쌍따옴표를 붙이면 된다.

대신 05월 01일처럼 출력되며 5월 1일 이런식으로는 출력할 수 없다고 한다.

5월 1일처럼 출력하려면 첫 번째 방법으로 풀이해야 한다고 말씀하셨다.

 

 

실습문제 3. emp 테이블에서 10번 부서원만 선택하여 입사 일자를 '01 MAY 1981' 형태로 출력하여라.

이 문제는 간단히 해결하였다.

 

 

실습문제 4. emp 테이블에서 september 28, 1981에 입사한 사원의 이름, 업무, 입사일자를 출력하여라.

단, where절에 'september 28, 1981' 그대로 사용할 것(상수 변경 없이)

날짜의 언어를 바꾸는 명령어 정도는 기억해 두면 좋다.

실습문제 3처럼 위와 같이 hiredate에 to_char를 씌우는 것은 성능에 문제가 있으므로, 아래와 같이 풀이하면 더 좋다.

아래와 같이 풀이하라고 한 이유는 다음과 같은 문제가 발생하기 때문이다.

september 대신에 february를 넣어보자.

조회가 되지 않는 이유는 february에 공백이 있기 때문이다. 달을 영어로 작성한 경우 september가 제일 길어서 모든 길이가 여기에 맞추어져서 feb는 이 sep의 길이에 남은 부분이 공백으로 채워지고, 그 공백이 검색이 되지 않았다.

그러므로 두 번째 같은 방법으로 풀면 이렇게 해결이 안 되는 부분을 처리할 수 있다.

 

728x90

 

실습문제 5. student 테이블에서 jumin 컬럼을 사용하여 생년월일이 다음 사이인 학생의 정보를 출력하세요.

(19760205~19760924)

★to_date함수를 쓸 때 무조건 포맷 쓰는 습관 기르기.

여기서 RR을 쓰지 않으면 어떤 다른 포맷에 따라서는 YY로 들어갈 수 있으므로 2076으로 인식될 수 있음을 주의하자.

 

 

실습문제 6. emp 테이블에서 각 직원이 입사한 첫 달에 근무한 근무일수를 출력하여라. 단 토, 일, 공휴일 모두 근무했다고 가정하자.

이 문제는 last_day함수만 알면 바로 풀 수 있다.

 

 

실습문제 7. emp 테이블을 이용하여 현재까지 근무일수를 XX년 XX개월 XX일 형태로 출력하여라.

예) 400일 → 1년 1개월 4일

풀이과정에 있어서 가장 헷갈린 문제였다.

먼저 근속연수는 쉽게 구할 수 있다.

총 근무개월 수를 구한 후에 12로 나누면 근속연수이다.

그럼 연수는 해결!

 

다음은 몇 개월을 일했는가 이다.

조금 복잡하지만 mod 함수를 쓰면 된다.

총 근무개월수에서 근속연수를 나누면 그 나머지가 남은 월 수이기 때문에 간단히 구할 수 있다.

 

제일 어려운 남은 일 수...

헷갈리므로 차근차근 짚어가보자.

일 수는 몇 개월 일했는지에 대한 부분에서 가져올 수 있다.

몇 개월을 일했는가를 셀 때 일은 세지 않는다는 걸 생각하면 쉽다.

일을 제외한, 고용 날짜로부터 딱 총 근무개월수만큼 채운 미래의 날짜를 계산해보자.

이는 위 식에서 '기준일자' 로 표현할 수 있다.

그렇다면 현재 날짜에서 딱 고용날짜로부터 단 '1일도 빠지거나 붙어있지 않은', 딱 총 근무개월수만큼 채운 날짜를 빼면 남은 일수가 도출된다.

 

마지막 너무 헷갈렸다.

혹시 마지막 해석이 읽을때마다 이해가 가지 않는다면 기준일자를 이해했다 가정하고 나머지 일 수를 왜 빼는가에 집중하면 해결할 수 있겠다.

728x90
반응형