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

MySQL에서 DISTINCT를 활용해 중복을 제거한 평균값 계산하는 방법

개요

MySQL에서 평균값을 구할 때는 AVG() 함수를 사용합니다. 만약 중복된 레코드를 제외하고 고유한(distinct) 값만 대상으로 평균을 계산하고 싶다면, AVG() 함수와 함께 DISTINCT 키워드를 활용하면 됩니다.

이번 글에서는 서브쿼리를 이용해 중복 데이터를 먼저 제거한 뒤, 남은 고유 레코드의 평균을 구하는 방법을 단계별로 살펴보겠습니다.

1. 예제 테이블 생성

먼저 실습에 사용할 테이블을 생성합니다.

mysql> create table DemoTable1934
    (
    StudentName varchar(20),
    StudentMarks int
    );
Query OK, 0 rows affected (0.00 sec)

학생 이름(StudentName)과 점수(StudentMarks) 두 개의 열로 구성된 간단한 테이블입니다.

2. 샘플 데이터 삽입

INSERT 명령을 사용해 몇 개의 레코드를 입력합니다. 의도적으로 동일한 데이터를 중복해서 넣어, 나중에 DISTINCT가 어떻게 작동하는지 확인해 보겠습니다.

mysql> insert into DemoTable1934 values('Chris',56);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1934 values('Chris',56);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1934 values('David',78);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1934 values('David',78);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1934 values('Carol',45);
Query OK, 1 row affected (0.00 sec)

3. 전체 레코드 조회

SELECT 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select * from DemoTable1934;

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

+-------------+--------------+
| StudentName | StudentMarks |
+-------------+--------------+
| Chris       |           56 |
| Chris       |           56 |
| David       |           78 |
| David       |           78 |
| Carol       |           45 |
+-------------+--------------+
5 rows in set (0.00 sec)

현재 총 5개의 레코드가 있으며, Chris(56)와 David(78)의 데이터가 각각 두 번씩 중복되어 저장되어 있습니다.

4. 중복 제거 후 평균 구하기

이제 핵심 쿼리입니다. 내부 서브쿼리에서 SELECT DISTINCT를 사용해 중복 레코드를 먼저 제거하고, 그 결과에 대해 AVG() 함수로 평균을 계산합니다.

mysql> select avg(tbl.StudentMarks)
    from
    (
    select distinct StudentName,StudentMarks
    from DemoTable1934
    ) as tbl;

위 쿼리의 실행 결과는 다음과 같습니다.

+-----------------------+
| avg(tbl.StudentMarks) |
+-----------------------+
|               59.6667 |
+-----------------------+
1 row in set (0.00 sec)

결과 분석

DISTINCT 적용 후 남은 고유 레코드는 Chris(56), David(78), Carol(45) 세 개입니다. 따라서 평균은 다음과 같이 계산됩니다.

(56 + 78 + 45) ÷ 3 = 179 ÷ 3 ≈ 59.6667

만약 DISTINCT 없이 전체 5개 레코드에 대해 AVG()를 실행했다면 결과는 62.6이 되었을 것입니다. 이처럼 서브쿼리와 DISTINCT를 조합하면 중복 데이터의 영향을 배제하고 정확한 평균값을 얻을 수 있습니다.