MySQL에서 테이블 내 최소값과 동일한 값을 가진 여러 행을 한 번에 조회해야 하는 경우가 자주 있습니다. 예를 들어, 가장 저렴한 가격을 가진 책이 여러 권일 때 해당 책들의 제목을 모두 가져오고 싶다면 MIN() 함수와 서브쿼리를 활용하면 됩니다.
이번 글에서는 실제 예제를 통해 단계별로 방법을 살펴보겠습니다.
1. 테이블 생성하기
먼저 책 제목과 가격을 저장할 테이블을 생성합니다.
mysql> create table DemoTable1414
-> (
-> BookTitle varchar(40),
-> BookPrice int
-> );
Query OK, 0 rows affected (0.82 sec)
2. 샘플 데이터 삽입하기
INSERT 문을 사용하여 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1414 values('Deep dive using java',560);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1414 values('C++ in depth',360);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1414 values('Data structure in C',590);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1414 values('Algorithm in C++',1090);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1414 values('Java in Depth',360);
Query OK, 1 row affected (0.33 sec)3. 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1414;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----------------------+-----------+
| BookTitle | BookPrice |
+----------------------+-----------+
| Deep dive using java | 560 |
| C++ in depth | 360 |
| Data structure in C | 590 |
| Algorithm in C++ | 1090 |
| Java in Depth | 360 |
+----------------------+-----------+
5 rows in set (0.00 sec)
4. 최소 가격을 공유하는 책 제목 조회하기
이제 핵심 쿼리입니다. 서브쿼리로 MIN(BookPrice) 값을 구한 뒤, 그 값과 일치하는 행의 제목만 선택합니다.
mysql> select BookTitle from DemoTable1414
-> where BookPrice= ( select min(BookPrice) from DemoTable1414);
실행 결과
최소 가격인 360을 공유하는 두 권의 책 제목이 정상적으로 출력됩니다.
+---------------+
| BookTitle |
+---------------+
| C++ in depth |
| Java in Depth |
+---------------+
2 rows in set (0.00 sec)
정리
WHERE 절 안에 select min(컬럼명) 형태의 서브쿼리를 넣으면, 특정 컬럼의 최소값을 가지는 모든 행을 손쉽게 조회할 수 있습니다. 이 방식은 GROUP BY나 JOIN 없이도 간단하게 해결할 수 있어, 소규모 데이터 조회 시 매우 유용합니다.