inflearn logo
강의

Course

Instructor

[Renewal] First-time SQL and Database (MySQL) Bootcamp [From Beginner to Application]

Getting Familiar with SUBQUERY by Solving Real Problems (Updated)

JOIN 활용 SQL 연습문제

176

gfis2127465

5 asked

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;

python sql mysql dbms/rdbms 데이터-엔지니어링

Answer 1

0

funcoding

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

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

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