MySQL에서 테이블 내 최댓값과 최솟값에 해당하는 행을 동시에 조회하려면 서브쿼리와 함께 MIN(), MAX() 함수를 사용하면 됩니다. 두 값을 하나의 결과로 합쳐서 비교하기 위해 UNION ALL을 활용합니다.
1. 샘플 테이블 생성
먼저 직원 이름과 급여를 저장할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> EmployeeName varchar(20),
-> EmployeeSalary int
-> );
Query OK, 0 rows affected (0.70 sec)
2. 데이터 삽입
INSERT 명령어로 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('Bob',8800);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Chris',9800);
Query OK, 1 row affected (0.63 sec)
mysql> insert into DemoTable values('David',7600);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Sam',9600);
Query OK, 1 row affected (0.14 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------------+----------------+
| EmployeeName | EmployeeSalary |
+--------------+----------------+
| Bob | 8800 |
| Chris | 9800 |
| David | 7600 |
| Sam | 9600 |
+--------------+----------------+
4 rows in set (0.00 sec)
4. 최대·최소 급여 행 조회 쿼리
아래 쿼리는 서브쿼리에서 MAX()와 MIN()으로 각각 최대 급여와 최소 급여를 구한 뒤, UNION ALL로 두 값을 묶어 IN 조건으로 일치하는 행을 반환합니다.
mysql> select *from DemoTable
-> where EmployeeSalary in ( select max(EmployeeSalary) from DemoTable
-> union all
-> select min(EmployeeSalary) from DemoTable
-> );
실행 결과는 다음과 같습니다.
+--------------+----------------+
| EmployeeName | EmployeeSalary |
+--------------+----------------+
| Chris | 9800 |
| David | 7600 |
+--------------+----------------+
2 rows in set (0.05 sec)
결과를 보면 가장 높은 급여(9,800)를 받는 Chris와 가장 낮은 급여(7,600)를 받는 David의 행이 한 번의 쿼리로 모두 출력된 것을 확인할 수 있습니다. 이 방식은 서브쿼리가 먼저 최댓값과 최솟값을 계산하고, 메인 쿼리가 해당 값과 일치하는 전체 행을 가져오기 때문에 최댓값이나 최솟값이 여러 행에 중복되어 있더라도 해당하는 모든 행을 정확하게 조회할 수 있다는 장점이 있습니다.