MySQL에서 직원 급여 데이터가 저장된 테이블에서 가장 높은 급여부터 세 번째로 높은 급여까지 순서대로 조회하려면 LIMIT과 OFFSET 절을 활용하면 됩니다. 이번 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 샘플 테이블 생성
먼저 직원 급여를 저장할 테이블을 생성합니다.
mysql> create table DemoTable867(EmployeeSalary int);
Query OK, 0 rows affected (0.64 sec)
2. 테스트 데이터 삽입
INSERT 문을 사용하여 여러 직원의 급여 데이터를 입력합니다.
mysql> insert into DemoTable867 values(63737);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable867 values(899833);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable867 values(23644);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable867 values(89393);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable867 values(534333);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable867 values(889322);
Query OK, 1 row affected (0.08 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable867;
실행 결과는 다음과 같습니다.
+----------------+
| EmployeeSalary |
+----------------+
| 63737 |
| 899833 |
| 23644 |
| 89393 |
| 534333 |
| 889322 |
+----------------+
6 rows in set (0.00 sec)
4. 첫 번째(가장 높은) 급여 조회
급여를 내림차순(DESC)으로 정렬한 뒤 LIMIT 1을 적용하면 가장 높은 급여 하나만 가져올 수 있습니다. 중복된 값이 있을 경우를 대비해 DISTINCT도 함께 사용합니다.
mysql> select distinct(EmployeeSalary) from DemoTable867 order by EmployeeSalary DESC LIMIT 1;
실행 결과:
+----------------+
| EmployeeSalary |
+----------------+
| 899833 |
+----------------+
1 row in set (0.02 sec)
5. 두 번째로 높은 급여 조회
두 번째로 높은 급여를 구하려면 LIMIT 1 OFFSET 1을 사용합니다. OFFSET 1은 정렬된 결과에서 첫 번째 행을 건너뛰고 그다음 행부터 가져오라는 의미입니다.
mysql> select distinct(EmployeeSalary) from DemoTable867 order by EmployeeSalary DESC LIMIT 1 OFFSET 1;
실행 결과:
+----------------+
| EmployeeSalary |
+----------------+
| 889322 |
+----------------+
1 row in set (0.00 sec)
6. 세 번째로 높은 급여 조회
같은 원리로 OFFSET 값을 2로 지정하면 앞의 두 행을 건너뛰고 세 번째로 높은 급여를 조회할 수 있습니다.
mysql> select distinct(EmployeeSalary) from DemoTable867 order by EmployeeSalary DESC LIMIT 1 OFFSET 2;
실행 결과:
+----------------+
| EmployeeSalary |
+----------------+
| 534333 |
+----------------+
1 row in set (0.00 sec)
정리: LIMIT과 OFFSET의 핵심 원리
이 기법의 핵심은 간단합니다.
- ORDER BY 컬럼명 DESC: 급여를 내림차순으로 정렬하여 높은 값부터 나열합니다.
- DISTINCT: 동일한 급여 값이 여러 개 존재할 때 중복을 제거하여 순위가 밀리지 않도록 합니다.
- LIMIT n: 가져올 행의 개수를 지정합니다.
- OFFSET m: 정렬된 결과에서 처음 m개의 행을 건너뜁니다.
따라서 N번째로 높은 급여를 구하고 싶다면 LIMIT 1 OFFSET (N-1) 패턴을 사용하면 됩니다. 예를 들어 네 번째로 높은 급여는 LIMIT 1 OFFSET 3으로 조회할 수 있습니다. 이 방법은 MySQL 8.0 이상이라면 윈도우 함수인 DENSE_RANK()나 ROW_NUMBER()를 사용하는 대안도 있으니, 복잡한 순위 처리가 필요하다면 함께 참고하시기 바랍니다.