본문 바로가기

[내일배움캠프]스파르타코딩클럽 AI 웹개발/Today I Learned

[내일배움캠프 31일차 TIL] SQL GROUP BY ~ HEVING / WHERE

SQL에서 HAVING과 WHERE 모두 조건문, 즉 필터링을 하는데 이용한다

 

 

WHERE 
SELECT 컬럼명 FROM 테이블명 WHERE 조건절

 

WHERE 뒤에는 조건절이 오게 된다

순서는 항상 FROM 뒤에 위치하며 다양한 비교 연산자들이 사용되어 조건을 줄 수 있다

 

 

HAVING
SELECT 컬럼명 FROM 테이블명 GROUP BY 컬럼명 HAVING 조건절

 

HAVING 뒤에도 조건절이 오는데, WHERE과의 가장 큰 차이점은 HAVING은 항상 GROUP BY절과 함께 사용되며 항상 GROUP BY 뒤에 위치한다는 것이다. 즉, 그룹화가 되어진 테이블에 조건을 준다는 것이다.

WHERE과 마찬가지로 조건절에 다양한 비교연산자를 사용하여 조건을 줄 수 있다

 

 

차이점

 

WHERE는 기본적인 조건절로 모든 필드를 조건에 둘 수 있다. 하지만 HAVING은 GROUP BY된 이후 특정한 필드로 그룹화 되어진 테이블에 조건을 줄 수 있다.

만약 전체 테이블에서 쿼리를 수행하고 싶다면 WHERE를, 전체 테이블을 그룹화한 뒤, 해당 그룹에서 조건을 걸어 가져오고 싶을 땐 HAVING을 사용하게 된다

 

 

다음 문제를 살펴보자

 

완료된 중고 거래의 금액이 70만원 이상을 회원 ID, 닉네임, 총거래금액을 조회해야 한다

여기서의 조건은 완료된 중고거래거래의 총 금액이 70만원 이상이 될 것이다.

그리고 이것을 회원ID 혹은 닉네임으로 그룹화해야 하며, 총 금액을 계산해야하니 집계함수도 사용해야 할 것이다.

그리고 총거래금액을 기준으로 오름차순으로 정렬해야 하므로 마지막에 ORDER BY를 사용해서 정렬해주어야 한다.

 

문제는 여기!

 

 

 

1. 완료된 중고거래

완료된 중고거래는 모든 쿼리에 대해 필터링은 진행해야하므로 WHERE절을 사용해줄 것이다.

WHERE STATUS = "DONE"

 

위와 같은 조건을 주어 완료된 중고거래에 대해 조사를 할 수있다

 

 

2. 거래의 총금액이 70만원 이상

거래의 총 금액을 계산하기 위해 USER_ID혹은 NICKNAME으로 GROUP BY를 한 것에 대해 SUM(PRICE)를 해주어 각 아이디별 거래의 총 금액을 계산해 줄 수 있다. 그리고 이때의 총 거래금액이 70만원 이상이어야 하므로 HAVING을 사용해서 조건을 줄 것이다.

GROUP BY USER_ID HAVING SUM(PRICE) >= 700000

 

위와 같이 조간을 주어 거래 총 금액이 70만원 이상인 사람을 찾을 수 있다.

 

 

 

 

 

전체 코드는 아래 접은글에서!

더보기
SELECT USER_ID, NICKNAME, SUM(PRICE) TOTAL_SALES
FROM USED_GOODS_BOARD A JOIN USED_GOODS_USER B ON A.WRITER_ID=B.USER_ID
WHERE STATUS = "DONE"
GROUP BY 1 HAVING SUM(PRICE) >= 700000
ORDER BY 3

 

 


이전의 문제들은 모두 where 혹은 case를 사용해 조건을 주었다면 이번 문제는 having을 사용해 그룹에 대해한 조건을 어떻게 해결할 것인가에 대한 문제였다. 조건이 많을수록 복잡해지거나 혼용하기 쉬운데, 문제를 잘 읽고 적절하게 사용할 수 있도록 연습을 해야겠다!