SQL - Mysql & Oracle/SQL 실전 코딩 테스트
[Oracle] 리트코드 176번 Second Highest Salary SQL코드 해설
BK_Paul
2022. 9. 7. 09:27
반응형
오늘은 리트코드에서 176번 문제인 Second Highest Salar에 대한 해설을 Oracle 기반으로 해보고자 한다. 이 문제에서 사용할 SQL 개념은 Sub Query, Max 함수 그리고 시공간 복잡도의 효율화이다. 해당 개념들을 최대한 간결하고 쉽게 설명하는 동시에 코드 해설을 해보고자 한다.
목차
1. 문제의 출처 및 기본 설명
2. Oracle 코드 해설 - SQL 코드 효율화하기
문제의 출처 및 기본 설명
문제의 출처는 이 주소에 있으니 참고하길 바란다. 문제의 요구사항은 Employee 테이블에서 2번째로 높은 연봉이 과연 얼마인지 추출하는 것이다. 여기서 또 핵심은 만약 두 번째가 없다면 반드시 null 값을 반환해야 한다는 것이다.
Oracle 코드 해설 - SQL 코드 효율화 하기
1
2
3
4
5
6
7
8
9
10
11
|
-- Point2. 2번재 높은 값 반환하기
SELECT MAX(a.salary) as SecondHighestSalary
FROM employee a
where 1 = 1
-- Point1. 가장 높은 값 제외 시켜주기
and a.SALARY not in ( SELECT max(b.salary)
FROM employee b
)
|
cs |
- 문제의 Point 해설
- Point1. Subquery를 통한 가장 높은 연봉 제외하기
- 우선 가장 높은 연봉을 찾아내 주어야 하기 때문에 in 연산자 안에 정수를 받아야 한다.
- 이때 이 숫자를 제외해주어야 하기 때문에 not과 in 연산자를 활용하였고, 사실 이 부분으 !=, <> 등 다양한 풀이가 가능하다.
- 또한 subquery 영역으로 데이터를 제외 시켜주었기에 원하는 row만 테이블에서 빠지게 된다.
- Point2. Max 집계 함수를 통한 정답 찾기
- Max함수를 쓰는데는 2가지 이유가 있다.
- 첫 번째는 남아있는 테이블 Row 중에서 가장 큰 값을 찾으면 바로 두 번째 높은 연봉을 반환할 수 있다.
- 두 번째는 만약 테이블에 아무런 값이 남아 있지 않다면 집계함수는 null을 반환하기 때문에 문제의 함정을 피해갈 수 있다.
- Point1. Subquery를 통한 가장 높은 연봉 제외하기
반응형