MySQL 테이블에서 두 번째로 높은 급여를 구하는 문제는 데이터베이스 학습 및 면접에서 자주 등장하는 대표적인 질문입니다. 핵심은 ORDER BY 절과 LIMIT, OFFSET 절을 함께 사용하는 것입니다.
예제 데이터 준비
개념을 이해하기 위해 다음과 같은 'Salary' 테이블의 데이터를 사용하겠습니다.
mysql> Select * from Salary; +--------+--------+ | Name | Salary | +--------+--------+ | Gaurav | 50000 | | Rahul | 40000 | | Ram | 45000 | | Raman | 45000 | +--------+--------+ 4 rows in set (0.00 sec)
LIMIT와 OFFSET으로 두 번째 최고 급여 조회하기
급여를 내림차순(DESC)으로 정렬한 뒤, 첫 번째 행은 건너뛰고(OFFSET 1) 그다음 한 개의 행만 가져오면(LIMIT 1) 두 번째로 높은 급여를 얻을 수 있습니다.
mysql> Select * from Salary order by Salary DESC limit 1 offset 1; +-------+--------+ | name | Salary | +-------+--------+ | Raman | 45000 | +-------+--------+ 1 row in set (0.00 sec)
쿼리 동작 원리
- ORDER BY Salary DESC : 급여를 기준으로 높은 순서대로 정렬합니다.
- OFFSET 1 : 정렬된 결과에서 첫 번째 행, 즉 최고 급여를 가진 행을 건너뜁니다.
- LIMIT 1 : 건너뛴 후 남은 결과 중 한 개의 행만 반환합니다.
서브쿼리를 활용한 대체 방법
LIMIT/OFFSET 방식 외에도 MAX() 함수와 서브쿼리를 조합하여 두 번째로 높은 급여를 구할 수 있습니다.
mysql> SELECT MAX(Salary) AS SecondHighest
-> FROM Salary
-> WHERE Salary NOT IN (SELECT MAX(Salary) FROM Salary);이 쿼리는 전체 급여 중 최댓값을 제외한 나머지 급여들 중에서 다시 최댓값을 찾는 방식으로 동작합니다.
주의할 점
위 예제처럼 동일한 급여(45,000)를 받는 직원이 여러 명인 경우, 중복 값 처리 방식에 따라 결과가 달라질 수 있습니다. 중복을 제거하고 고유한 급여 순위를 기준으로 조회하려면 DISTINCT 키워드를 함께 사용하는 것이 안전합니다.