본문 바로가기
내가 공부하려고 올리는/DB

오라클 - MIN 함수 실습(서브쿼리 대신 하기)

by 결딴력 2021. 11. 16.
반응형

TEMP

위와 같은 값을 갖는 TEMP 테이블에서

직급별로 최소 연봉을 갖는 직원의 사번과 연봉을 알아내려면

어떻게 해야할까요?

 

아마 질문을 듣고 서브 쿼리를 사용할 줄 아시는 분들은

서브쿼리 사용법을 떠올리실 겁니다.

 

그렇다면 서브쿼리를 사용하지 않고는

어떻게 구할 수 있을까요?

 

정답부터 말씀드리면,

정답은 다음과 같습니다.

 

실행문과 결과

 

그렇다면 이 SELECT문을 하나하나 찬찬히 분해해보겠습니다.

 

우선 직급과 사번, 연봉을 추출해야 합니다.

 

직급은 그대로

'SELECT LEV'로 추출합니다.

 

연봉은 MIN 함수를

'MIN(SALARY)'를 사용해서 추출합니다.

 

그렇다면 사번은 어떻게 해야 할까요?

 

SUBSTR(MIN(LPAD(TO_CHAR(SALARY), 10, '0')||EMP_ID), 11) EMP_ID를

하나씩 분해해 보겠습니다.

 

우선 TO_CHAR(SALARY)로 숫자 타입이 급여를 문자 타입으로 변환합니다.

이후 변환된 문자 타입의 SALARY를 LPAD() 함수를 사용하여

값을 10자리로 만들고 빈칸에는 숫자 '0'을 채워 넣습니다.

이후 10자리로 만든 SALARY의 최솟값을 구하고,

결합 연산자를 사용해 EMP_ID와 결합시킵니다.

 

결합까지 마친 함수는 위와 같은 모습입니다.

이제 앞에 10자리를 제외하고 EMP_ID만을 남기면 되기 때문에

SUBSTR을 사용해 앞에 10자리를 지우고 남은 글자를 출력해줍니다.

 

어차피 지울 SALARY를 굳이 LPAD를 사용해서 최솟값을 구하는 이유는

구하고자 하는 최솟값이 SALARY의 최솟값이기 때문입니다.

직급별로 최소 SALARY를 구한 값과 그에 맞는 EMP_ID를 연결해주고

나중에 SALARY를 지워서 EMP_ID만을 남기는 것입니다.

 

간단한 함수들이 사용됐고,

과정을 알고 나면 쉽지만

막상 문제로 맞닥뜨리면 생각하기 정말 어려운 문제인 것 같습니다.

 

내용 오류 발견하시면 댓글이나 메일 부탁드립니다!

 

반응형

댓글