MySQL에서 서브쿼리(subquery)를 활용하면 특정 컬럼의 최댓값을 가진 모든 행을 손쉽게 조회할 수 있습니다. 이 글에서는 예제 테이블을 만들고, MAX() 함수와 서브쿼리를 조합하여 최대 나이를 가진 모든 사용자를 선택하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성하기
먼저 이름(Name)과 나이(Age) 컬럼을 가진 테이블을 생성합니다.
mysql> create table DemoTable
(
Name varchar(100),
Age int
);
Query OK, 0 rows affected (0.46 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 여러 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('Chris',23);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable values('David',55);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('Bob',53);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('Mike',54);
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable values('Sam',55);
Query OK, 1 row affected (0.18 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행하면 다음과 같은 결과가 출력됩니다.
+-------+------+
| Name | Age |
+-------+------+
| Chris | 23 |
| David | 55 |
| Bob | 53 |
| Mike | 54 |
| Sam | 55 |
+-------+------+
5 rows in set (0.00 sec)
4. 서브쿼리로 최대 나이를 가진 사용자 조회하기
핵심은 WHERE 절 안에서 MAX() 함수를 사용한 서브쿼리를 작성하는 것입니다. 내부 서브쿼리가 먼저 실행되어 테이블 전체의 최대 나이(55)를 구하고, 외부 쿼리는 그 값과 일치하는 모든 행을 반환합니다.
mysql> select *from DemoTable
where Age=(select max(Age) from DemoTable);
위 쿼리를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
+-------+------+
| Name | Age |
+-------+------+
| David | 55 |
| Sam | 55 |
+-------+------+
2 rows in set (0.00 sec)
동작 원리 정리
이 쿼리의 실행 순서는 다음과 같습니다.
① 서브쿼리 (select max(Age) from DemoTable)가 먼저 실행되어 최대 나이인 55를 반환합니다.
② 외부 쿼리는 Age = 55 조건을 만족하는 모든 행을 조회합니다.
③ 따라서 David와 Sam처럼 동일한 최댓값을 가진 여러 명의 사용자가 한 번에 모두 조회됩니다.
만약 GROUP BY 없이 단순히 ORDER BY Age DESC LIMIT 1을 사용했다면 최대값을 가진 행 중 하나만 반환되었을 것입니다. 이처럼 서브쿼리와 MAX() 함수를 함께 사용하면 최댓값을 공유하는 모든 레코드를 누락 없이 가져올 수 있다는 점이 큰 장점입니다.