JOIN 활용 SQL 연습문제
176
5 asked
연습문제
메인 카테고리별로 할인 가격이 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;
Answer 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)와 같은 집계 함수와 함께 사용되므로 오류가 발생하지 않습니다.
감사합니다.
잔재미코딩 드림
실습을 따라하는데 데이터베이스가 보이지 않아요
0
49
1
섹션1 4강부터 강의 실행 안됨 이슈
0
74
1
강의 자료 다운로드 관
0
88
1
강의 영상이 안나와요..
0
78
1
섹션4 화면 자체가 안나와요
0
116
1
강의 화면이 안 보이고, 목소리밖에 안나와요 ;;
0
114
1
데이터 삭제 질문
0
120
1
mysql 설치가 되지 않습니다.
0
1375
3
강의 결과 질문 - SQLD, 데이터베이스 설계, 프로젝트 구축 하여 취업
0
144
1
지마켓 파일 불러왔는데, 테이블이 생성이 안됩니다
0
117
1
실습 코드 깃허브 업로드
0
143
1
sql_safe_updates 옵션
0
152
1
sql 설치 문제
0
1418
2
서브쿼리를 JOIN으로 바꾸기
0
153
1
중고급 SQL과 실전 데이터 문의
1
154
1
(맥환경) workbench 이용할 때 패스워드 입력 안해도 자동으로 활성화 가능해져요..
0
348
1
강의 커리큘럼 질문 있습니다.
0
175
1
강의 자료 이미지가 보이지 않습니다.
0
160
1
Join 구문에서 메인 테이블
0
175
1
예제문제 추가 쿼리 질문
0
203
2
강의 화면 출력이 되지 않는 현상
0
208
1
파이썬으로 다루는 MySQL
0
204
1
Dbeaver 라는 SQL 쿼리 실행 툴을 써도 될까요?
0
302
1
Sakila PDF 파일 오류
0
186
1

