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

MySQL에서 HAVING 절과 avg() 함수로 중복 데이터의 개별 평균 구하기

MySQL에서 AVG() 같은 집계 함수의 결과를 조건으로 필터링하려면 WHERE 절 대신 HAVING 절을 사용해야 합니다. WHERE 절은 그룹화 이전의 개별 행에 적용되는 반면, HAVING 절은 GROUP BY로 그룹화된 결과에 조건을 적용할 수 있기 때문입니다.

1. 테이블 생성하기

먼저 예제에 사용할 테이블을 만들어 보겠습니다.

mysql> create table DemoTable1338
    -> (
    -> Name varchar(10),
    -> Score int
    -> );
Query OK, 0 rows affected (1.54 sec)

2. 데이터 삽입하기

INSERT 명령으로 레코드를 추가합니다. 여기서는 동일한 이름이 중복되어 저장되도록 점수와 함께 삽입했습니다.

mysql> insert into DemoTable1338 values('Chris',8);
Query OK, 1 row affected (0.80 sec)
mysql> insert into DemoTable1338 values('Bob',4);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1338 values('Bob',9);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable1338 values('Chris',6);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable1338 values('David',5);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1338 values('David',7);
Query OK, 1 row affected (0.40 sec)

3. 전체 데이터 확인하기

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

mysql> select * from DemoTable1338;

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

+-------+-------+
| Name  | Score |
+-------+-------+
| Chris |     8 |
| Bob   |     4 |
| Bob   |     9 |
| Chris |     6 |
| David |     5 |
| David |     7 |
+-------+-------+
6 rows in set (0.00 sec)

4. 중복 요소의 평균 구하기

다음 쿼리는 이름별로 그룹화하여 각 이름의 평균 점수를 계산하고, HAVING 절로 평균이 9.5 미만인 그룹만 필터링한 뒤, ORDER BY로 평균값 기준 오름차순 정렬합니다.

mysql> select Name,avg(Score) from DemoTable1338
    -> group by Name
    -> having avg(Score) < 9.5
    -> order by avg(Score);

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

+-------+------------+
| Name  | avg(Score) |
+-------+------------+
| David |     6.0000 |
| Bob   |     6.5000 |
| Chris |     7.0000 |
+-------+------------+
3 rows in set (0.00 sec)

결과를 보면 David(6.0), Bob(6.5), Chris(7.0) 순으로 오름차순 정렬된 것을 확인할 수 있습니다. 이처럼 집계 함수의 결과에 조건을 적용하려면 반드시 HAVING 절을 사용해야 한다는 점을 기억하세요.