GROUP BY 절 내부에 ORDER BY를 직접 사용하는 대신, MAX() 집계 함수를 활용하면 원하는 결과를 손쉽게 얻을 수 있습니다. 이 방식은 이름별 최고 순위처럼 각 그룹의 최댓값을 조회할 때 특히 유용하며, 성능 면에서도 더 효율적인 접근 방법입니다.
기본 문법
사용 방법은 다음과 같습니다.
SELECT yourNameColumnName, MAX(yourRankColumnName) FROM yourTableName GROUP BY yourNameColumnName;
문법을 제대로 이해하기 위해 실제 테이블을 하나 만들어 보겠습니다.
1. 테이블 생성
테이블을 생성하는 쿼리는 다음과 같습니다.
mysql> create table MaxDemo
-> (
-> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserName varchar(20),
-> UserRank int
-> );
Query OK, 0 rows affected (0.77 sec)2. 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into MaxDemo(UserName,UserRank) values('Larry',2);
Query OK, 1 row affected (0.21 sec)
mysql> insert into MaxDemo(UserName,UserRank) values('Sam',1);
Query OK, 1 row affected (0.17 sec)
mysql> insert into MaxDemo(UserName,UserRank) values('Sam',2);
Query OK, 1 row affected (0.15 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from MaxDemo;
출력 결과
+--------+----------+----------+ | UserId | UserName | UserRank | +--------+----------+----------+ | 1 | Larry | 2 | | 2 | Sam | 1 | | 3 | Sam | 2 | +--------+----------+----------+ 3 rows in set (0.00 sec)
4. MAX() 함수로 그룹별 최댓값 조회
이제 MAX() 함수를 활용해 원하는 결과를 가져오는 쿼리는 다음과 같습니다.
mysql> select UserName,MAX(UserRank) from MaxDemo group by UserName;
출력 결과
+----------+---------------+ | UserName | MAX(UserRank) | +----------+---------------+ | Larry | 2 | | Sam | 2 | +----------+---------------+ 2 rows in set (0.00 sec)
실행 결과를 보면 'Sam'이라는 이름이 두 번 등록되어 있지만(순위 1과 2), GROUP BY와 MAX()를 조합하면 각 이름별로 가장 높은 순위만 깔끔하게 추출됩니다. 이처럼 GROUP BY 내부에서 정렬된 값이 필요하다면 ORDER BY보다 MAX(), MIN(), SUM() 같은 집계 함수를 사용하는 것이 더 효율적이고 권장되는 방법입니다.