테이블에 저장된 최댓값이 여러 행에 중복되어 있을 때, 해당 값들을 모두 한 번에 조회하고 싶다면 JOIN 개념을 활용하면 됩니다. 이 글에서는 서브쿼리로 최댓값을 구한 뒤 원본 테이블과 조인하여 중복된 최댓값 행까지 모두 가져오는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1389
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentMarks int
-> );
Query OK, 0 rows affected (2.73 sec)
2. 데이터 삽입하기
INSERT 명령어를 사용해 레코드를 입력합니다. 이때 의도적으로 동일한 점수(40점, 97점)를 여러 번 삽입하여 중복 값이 존재하도록 만들었습니다.
mysql> insert into DemoTable1389(StudentMarks) values(40);
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable1389(StudentMarks) values(40);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1389(StudentMarks) values(68);
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable1389(StudentMarks) values(78);
Query OK, 1 row affected (0.43 sec)
mysql> insert into DemoTable1389(StudentMarks) values(97);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1389(StudentMarks) values(97);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable1389(StudentMarks) values(97);
Query OK, 1 row affected (0.49 sec)
3. 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1389;
실행 결과는 다음과 같습니다.
+-----------+--------------+
| StudentId | StudentMarks |
+-----------+--------------+
| 1 | 40 |
| 2 | 40 |
| 3 | 68 |
| 4 | 78 |
| 5 | 97 |
| 6 | 97 |
| 7 | 97 |
+-----------+--------------+
7 rows in set (0.00 sec)
4. 중복된 최댓값 모두 조회하기
핵심은 서브쿼리로 테이블의 최댓값(MAX)을 먼저 구한 다음, 그 결과를 원본 테이블과 조인(JOIN)하는 것입니다. 조인 조건에서 서브쿼리가 반환한 최댓값과 일치하는 모든 행이 선택되므로, 중복된 최댓값도 함께 조회됩니다.
mysql> select tbl.StudentId,tbl.StudentMarks from DemoTable1389 tbl
-> join ( select max(StudentMarks) as MaxMarks from DemoTable1389) tbl1
-> on tbl1.MaxMarks=tbl.StudentMarks;
실행 결과는 다음과 같습니다. 최댓값인 97점이 중복된 세 개의 행이 모두 출력된 것을 확인할 수 있습니다.
+-----------+--------------+
| StudentId | StudentMarks |
+-----------+--------------+
| 5 | 97 |
| 6 | 97 |
| 7 | 97 |
+-----------+--------------+
3 rows in set (0.00 sec)
정리
단순히 MAX() 함수만 사용하면 최댓값 자체 하나만 반환되기 때문에 해당 값을 가진 행 정보를 얻을 수 없습니다. 하지만 위 예제처럼 MAX()를 포함한 서브쿼리와 원본 테이블을 조인하면, 최댓값을 가진 모든 행(중복 포함)을 손쉽게 조회할 수 있습니다. 이 패턴은 성적, 매출 등 최고 기록을 가진 대상이 여러 명일 때 유용하게 활용됩니다.