본문 바로가기

SQL - Mysql & Oracle/SQL 실전 코딩 테스트

[Oracle] 리트코드 176번 Second Highest Salary SQL코드 해설

반응형

오늘은 리트코드에서 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을 반환하기 때문에 문제의 함정을 피해갈 수 있다. 

     

     

    반응형