Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 서브쿼리로 Employee 테이블의 최고 급여와 두 번째 최고 급여 조회하기

서브쿼리(하위 쿼리)를 활용하면 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() 윈도우 함수를 사용하는 방법도 고려해 볼 수 있습니다.