서브쿼리(하위 쿼리)를 활용하면 Employee 테이블에서 최대 급여와 두 번째 최대 급여를 간단하게 조회할 수 있습니다. 이 글에서는 실제 예제를 통해 단계별로 방법을 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다. 아래 쿼리를 실행해 EmployeeMaxAndSecondMaxSalary 테이블을 만들어 보세요.
mysql> create table EmployeeMaxAndSecondMaxSalary
-> (
-> EmployeeId int,
-> Employeename varchar(20),
-> EmployeeSalary int
-> );
Query OK, 0 rows affected (0.88 sec)2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 직원 정보를 테이블에 입력합니다.
mysql> insert into EmployeeMaxAndSecondMaxSalary values(1,'John',34566); Query OK, 1 row affected (0.20 sec) mysql> insert into EmployeeMaxAndSecondMaxSalary values(2,'Bob',56789); Query OK, 1 row affected (0.17 sec) mysql> insert into EmployeeMaxAndSecondMaxSalary values(3,'Carol',44560); Query OK, 1 row affected (0.26 sec) mysql> insert into EmployeeMaxAndSecondMaxSalary values(4,'Sam',76456); Query OK, 1 row affected (0.29 sec) mysql> insert into EmployeeMaxAndSecondMaxSalary values(5,'Mike',65566); Query OK, 1 row affected (0.14 sec) mysql> insert into EmployeeMaxAndSecondMaxSalary values(6,'David',89990); Query OK, 1 row affected (0.19 sec) mysql> insert into EmployeeMaxAndSecondMaxSalary values(7,'James',68789); Query OK, 1 row affected (0.12 sec) mysql> insert into EmployeeMaxAndSecondMaxSalary values(8,'Robert',76543); Query OK, 1 row affected (0.13 sec)
3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 봅니다.
mysql> select *from EmployeeMaxAndSecondMaxSalary;
실행 결과는 다음과 같습니다.
+------------+--------------+----------------+ | EmployeeId | Employeename | EmployeeSalary | +------------+--------------+----------------+ | 1 | John | 34566 | | 2 | Bob | 56789 | | 3 | Carol | 44560 | | 4 | Sam | 76456 | | 5 | Mike | 65566 | | 6 | David | 89990 | | 7 | James | 68789 | | 8 | Robert | 76543 | +------------+--------------+----------------+ 8 rows in set (0.00 sec)
4. 서브쿼리로 최대 급여와 두 번째 최대 급여 구하기
이제 핵심인 서브쿼리를 사용한 조회 쿼리입니다. 첫 번째 서브쿼리는 MAX() 함수로 전체 급여 중 가장 큰 값을 가져오고, 두 번째 서브쿼리는 NOT IN 조건을 이용해 최대 급여를 제외한 나머지 값 중에서 다시 최댓값을 구하는 방식입니다.
mysql> select (select max(EmployeeSalary) from EmployeeMaxAndSecondMaxSalary) MaximumSalary,
-> (select max(EmployeeSalary) from EmployeeMaxAndSecondMaxSalary
-> where EmployeeSalary not in(select max(EmployeeSalary) from
EmployeeMaxAndSecondMaxSalary)) as SecondMaximumSalary;실행 결과, 상위 두 개의 급여가 정상적으로 출력됩니다.
+---------------+---------------------+ | MaximumSalary | SecondMaximumSalary | +---------------+---------------------+ | 89990 | 76543 | +---------------+---------------------+ 1 row in set (0.00 sec)
정리
위 결과를 보면 최대 급여는 89,990(David), 두 번째 최대 급여는 76,543(Robert)임을 확인할 수 있습니다. 이처럼 MAX() 함수와 NOT IN 연산자를 결합한 서브쿼리를 활용하면 별도의 정렬이나 LIMIT 절 없이도 상위 N번째 값을 손쉽게 구할 수 있습니다. 참고로 동점 처리나 대량 데이터 환경에서는 DENSE_RANK() 윈도우 함수를 사용하는 방법도 고려해 볼 수 있습니다.