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

MySQL에서 GROUP BY와 MAX()로 학생별 최고 점수(Marks1, Marks2) 조회하기

학생의 개별 과목 최고 점수를 조회하려면 MAX() 함수GROUP BY 절을 함께 사용하면 됩니다. 이번 글에서는 실제 예제를 통해 테이블 생성부터 데이터 삽입, 그리고 학생별로 Marks1과 Marks2의 최대값을 구하는 방법까지 단계별로 살펴보겠습니다.

1. 테이블 생성하기

먼저 학생 이메일 ID와 두 과목의 점수를 저장할 테이블을 생성합니다.

mysql> create table DemoTable
   -> (
   -> StudentEmailId varchar(20),
   -> Marks1 int,
   -> Marks2 int
-> );
Query OK, 0 rows affected (0.90 sec)

2. 데이터 삽입하기

INSERT 명령을 사용하여 샘플 레코드를 추가합니다. 같은 학생(John)이 여러 행에 걸쳐 서로 다른 점수를 가지도록 데이터를 구성했습니다.

mysql> insert into DemoTable values('John@gmail.com',45,32);
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable values('John@gmail.com',32,45);
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable values('Carol@gmail.com',32,45);
Query OK, 1 row affected (1.64 sec)
mysql> insert into DemoTable values('David@gmail.com',45,32);
Query OK, 1 row affected (0.18 sec)

3. 전체 레코드 확인하기

SELECT 문으로 테이블에 저장된 모든 데이터를 확인합니다.

mysql> select *from DemoTable;

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+-----------------+--------+--------+
| StudentEmailId  | Marks1 | Marks2 |
+-----------------+--------+--------+
| John@gmail.com |      45 |     32 |
| John@gmail.com |      32 |     45 |
| Carol@gmail.com |     32 |     45 |
| David@gmail.com |     45 |     32 |
+-----------------+--------+--------+
4 rows in set (0.00 sec)

4. 학생별 최대 개별 점수 조회하기

이제 핵심인 쿼리입니다. GROUP BY로 학생 이메일 ID를 기준으로 그룹화한 뒤, MAX()를 적용하면 각 학생의 Marks1과 Marks2 중 최고 점수를 각각 구할 수 있습니다.

mysql> select StudentEmailId,max(Marks1),max(Marks2) from DemoTable
   -> group by StudentEmailId;

실행 결과는 다음과 같습니다.

+-----------------+-------------+-------------+
| StudentEmailId  | max(Marks1) | max(Marks2) |
+-----------------+-------------+-------------+
| John@gmail.com  |          45 |          45 |
| Carol@gmail.com |          32 |          45 |
| David@gmail.com |          45 |          32 |
+-----------------+-------------+-------------+
3 rows in set (0.00 sec)

결과 해석

출력 결과를 보면 원본 테이블에는 4개의 행이 있었지만, GROUP BY로 그룹화된 후에는 학생당 하나의 행씩 총 3개의 행만 반환됩니다. 특히 John@gmail.com의 경우 두 레코드에 걸쳐 Marks1은 45, Marks2는 32였고, 반대로 Marks1은 32, Marks2는 45였는데, MAX() 덕분에 각 컬럼의 최고 점수인 45와 45가 정확히 집계된 것을 확인할 수 있습니다.