인프런 커뮤니티 질문&답변

지연님의 프로필 이미지

작성한 질문수

처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지] (업데이트)

실제 문제 풀어보며 SUBQUERY 익숙해지기 (업데이트)

JOIN 활용 SQL 연습문제

24.07.27 15:14 작성

·

63

0

연습문제

메인 카테고리별로 할인 가격이 10만원 이상인 상품이 몇개 있는지를 출력해보기 (JOIN 활용 SQL 과 서브쿼리 활용 SQL 모두 작성해보기)

정답은 첫번째 코드처럼 WHERE, GROUP BY절이 쓰였는데

저는 처음 이 문제를 보고 두번째 코드처럼 GROUP BY, Having 절을 생각해서 넣었더니 오류값이 나오더라구요 HAVING절이 GROUP BY 이후에 자주 쓰이기도 하고 집계도 넣을 수 있어서 똑같은 조건문을 WHERE 대신 HAVING절에 넣어줬는데 혹시 오류가 난 이유가 있을까요? 오류메세지는 Unknown column 'items.dis_price' in 'having clause'라고 떴습니다. 제가 GROUP BY가 쓰일때는 HAVING이랑 WHERE가 같은 역할을 하는것 같다고 생각하는데 어떤 부분에서 차이가 있는지 설명해주시면 좀 더 분명하게 이해할 수 있을 것 같습니다.

SELECT ranking.main_category, COUNT(*)
FROM ranking JOIN items ON items.item_code = ranking.item_code
WHERE items.dis_price >= 100000
GROUP BY ranking.main_category;
SELECT ranking.main_category, COUNT(*)
FROM ranking JOIN items ON items.item_code = ranking.item_code
GROUP BY ranking.main_category
Having items.dis_price >= 100000;

답변 1

0

잔재미코딩 DaveLee님의 프로필 이미지

2024. 07. 29. 10:28

안녕하세요. 답변 도우미입니다.

질문하신 내용에 대해 상세히 설명드리겠습니다.

SQL에서 WHERE 절과 HAVING 절은 유사한 역할을 하지만 적용되는 시점과 범위가 다릅니다.

1. WHERE 절:

- WHERE 절은 GROUP BY 이전에 사용됩니다.

- WHERE 절은 각 행에 대해 조건을 걸어 필터링합니다.

- 따라서, 개별 레코드(행)를 조건에 맞게 필터링한 후 GROUP BY를 수행합니다.

2. HAVING 절:

- HAVING 절은 GROUP BY 이후에 사용됩니다.

- HAVING 절은 그룹화된 데이터에 대해 조건을 걸어 필터링합니다.

- 따라서, 집계 함수(`COUNT`, SUM, AVG 등)와 함께 사용됩니다.

이 두 가지 절의 차이를 이해하는 것이 중요합니다. HAVING 절은 주로 집계된 데이터를 필터링할 때 사용되며, 개별 레코드가 아닌 집계된 결과에 조건을 걸 때 유용합니다.

질문에서 발생한 오류인 "Unknown column 'items.dis_price' in 'having clause'"는 HAVING 절이 그룹화된 데이터에 대해 필터링을 시도하는데, items.dis_price는 개별 행에 대한 컬럼이기 때문에 발생한 오류입니다. HAVING 절에서 사용하려면 집계 함수와 함께 사용되어야 합니다.

이제 두 가지 방식의 SQL 쿼리를 각각 설명드리겠습니다:

### JOIN을 활용한 SQL 쿼리:

```sql

SELECT ranking.main_category, COUNT(*)

FROM ranking

JOIN items ON items.item_code = ranking.item_code

WHERE items.dis_price >= 100000

GROUP BY ranking.main_category;

```

이 쿼리는 WHERE 절을 사용하여 items.dis_price가 10만원 이상인 개별 레코드를 필터링한 후, main_category별로 그룹화하여 개수를 셉니다.

### 서브쿼리를 활용한 SQL 쿼리:

```sql

SELECT main_category, COUNT(*)

FROM (

SELECT ranking.main_category

FROM ranking

JOIN items ON items.item_code = ranking.item_code

WHERE items.dis_price >= 100000

) AS subquery

GROUP BY main_category;

```

이 쿼리는 서브쿼리를 사용하여 WHERE 절로 items.dis_price가 10만원 이상인 레코드를 필터링한 후, main_category별로 그룹화하여 개수를 셉니다.

### HAVING 절을 사용한 올바른 예제:

HAVING 절을 사용하려면 집계 함수와 함께 사용하는 것이 적합합니다. 예를 들어, main_category별로 평균 할인 가격이 10만원 이상인 카테고리를 구할 수 있습니다:

```sql

SELECT ranking.main_category, COUNT(*)

FROM ranking

JOIN items ON items.item_code = ranking.item_code

GROUP BY ranking.main_category

HAVING AVG(items.dis_price) >= 100000;

```

이 경우, HAVING 절은 AVG(items.dis_price)와 같은 집계 함수와 함께 사용되므로 오류가 발생하지 않습니다.

감사합니다.

잔재미코딩 드림

지연님의 프로필 이미지

작성한 질문수

질문하기