작성
·
93
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
안녕하세요. 답변 도우미입니다.
질문하신 내용에 대해 상세히 설명드리겠습니다.
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)
와 같은 집계 함수와 함께 사용되므로 오류가 발생하지 않습니다.
감사합니다.
잔재미코딩 드림