Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL GROUP BY 내부에서 ORDER BY 대신 MAX() 함수 활용하기


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() 같은 집계 함수를 사용하는 것이 더 효율적이고 권장되는 방법입니다.