MySQL에서 제품별 평균 가격을 계산한 뒤, 그 평균값이 특정 값보다 작은 제품만 조회하고 싶다면 GROUP BY와 HAVING 절을 함께 사용하면 됩니다. WHERE 절은 집계 함수를 사용할 수 없기 때문에, 집계 결과에 조건을 걸 때는 반드시 HAVING 절을 활용해야 합니다.
1. 테이블 생성하기
먼저 예제로 사용할 테이블을 생성합니다.
mysql> create table DemoTable848( ProductId int, ProductPrice int ); Query OK, 0 rows affected (1.20 sec)
2. 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 샘플 레코드를 추가합니다. ProductId 100과 101의 제품이 여러 번 등장하도록 구성했습니다.
mysql> insert into DemoTable848 values(100,30); Query OK, 1 row affected (0.57 sec) mysql> insert into DemoTable848 values(101,50); Query OK, 1 row affected (1.06 sec) mysql> insert into DemoTable848 values(100,40); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable848 values(101,25); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable848 values(100,20); Query OK, 1 row affected (0.31 sec)
3. 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable848;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-----------+--------------+ | ProductId | ProductPrice | +-----------+--------------+ | 100 | 30 | | 101 | 50 | | 100 | 40 | | 101 | 25 | | 100 | 20 | +-----------+--------------+ 5 rows in set (0.00 sec)
4. 평균 가격이 특정 값보다 작은 제품 조회하기
이제 핵심인 쿼리입니다. 제품별로 가격의 평균을 계산한 후, 평균 가격이 35 미만인 제품만 조회합니다. GROUP BY로 제품 ID별로 묶고, HAVING 절에서 AVG() 함수의 결과에 조건을 적용합니다.
mysql> select ProductId,avg(ProductPrice) from DemoTable848 group by ProductId having AVG(ProductPrice) < 35;
실행 결과는 다음과 같습니다.
+-----------+-------------------+ | ProductId | avg(ProductPrice) | +-----------+-------------------+ | 100 | 30.0000 | +-----------+-------------------+ 1 row in set (0.00 sec)
결과 분석
출력 결과를 보면 ProductId가 100인 제품만 조회되었습니다. 이유는 다음과 같습니다.
- ProductId 100: (30 + 40 + 20) ÷ 3 = 30.0000 → 35 미만이므로 조건 충족 ✓
- ProductId 101: (50 + 25) ÷ 2 = 37.5000 → 35 이상이므로 조건 미충족 ✗
이처럼 HAVING 절을 사용하면 GROUP BY로 집계된 평균값에 조건을 걸어 원하는 제품만 정확하게 필터링할 수 있습니다. 참고로 WHERE 절은 집계가 이루어지기 전의 개별 행에 조건을 적용할 때 사용하며, AVG(), SUM(), COUNT() 같은 집계 함수의 결과에는 사용할 수 없다는 점을 기억해 두시면 좋습니다.