본문 바로가기
MySQL/Aggregation&Subquery 다루기

[Aggregation&Subquery] 4. HAVING키워드로 조건 지정하기

by Fletcher 2024. 8. 7.

 

반갑습니다!

저번 포스트에서 GROUP BY 키워드를 이용하여

여러 중복 데이터들을 그룹화하였습니다

 

그리고 그룹화 후 count(), sum(), avg() 등의 함수를 이용하여

특정 컬럼에 대해 집계하여 갯수, 합계, 평균 등의 값을 구했었는데요

 

이번에는 그룹화 이후에 특정 조건을 첨부하여 조건 조회하는

HAVING 키워드에 대해서 알아보겠습니다 ^^!

 

 

이어지는 이번 포스트 역시 동일한 샘플 데이터를 사용합니다

편의를 위해서 하단에 파일 첨부하겠습니다!

customers.sql
0.01MB
orders.sql
0.06MB

 

 

 

 

 

 

 

 

 

일단 customers 테이블과 orders 테이블에 대해 JOIN 연산 진행 후

GROUP BY 키워드로 그룹화하여 조회하였습니다 ^^

 

 

 

여기서 amount의 평균 값을 구한 다음에,

그 평균값이 특정 수치 이상인 데이터들만 한 번 조건 조회해볼까요?

 

HAVING 키워드를 이용해서 amount_avg 컬럼을 기준으로

값이 300 이상인 레코드만 조회하도록 조건을 지정하였습니다

그리고 조회 결과에 대해 ORDER BY로 내림차순 정렬을 하여 보기 좋게 가공하였습니다 ^^

 

 

 

※ 중요 ※

HAVING 키워드 자체는 별다른 것이 없습니다

근데 이 내용을 다룰 때 꼭 알아둬야 하는게, SQL내부 처리 순서입니다

WHERE 구  →  GROUP BY 구  →  HAVING 구  →  SELECT 구  →  ORDER BY 구

 

만약에 사용자가 GROUP BY를 적용한 다음에 특정 조건을 적용시켜서

데이터를 추려내고 싶다는 의도 하에 SQL문을 작성할 때,

WHERE 구와 GROUP BY구만 작성을 한다면 의도와 다른 결과가 출력됩니다 ^^;;

 

내부처리 순서상

①전체 데이터 중에서  →  ②WHERE 조건에 맞는 데이터들이 먼저 추려진 다음에

→  ③GROUP BY로 그룹화가 진행 되기 때문에,

만약 방금 말씀드린 예시와 같은 의도대로 결과를 출력하려면,

GROUP BY보다 처리 순서가 후순위인 HAVING 구를 사용해야 합니다

 

 

위 내부 처리 순서를 앞전에 한 번 다룬 적이 있는데요

WHERE 구문이 SELECT 구문보다 처리 순서가 앞서기 때문에

WHERE 조건식에 SELECT 구에서 지정한 별칭을 컬럼 이름으로 사용하면 Error 메세지가 검출되며

의도대로 작업이 처리되지 않는 부분이 바로 이 내부처리 순서와 관련된 내용이었습니다 ^^

 

물론, HAVING 구가 SELECT 구보다 처리 순서상 앞서기 때문에

WHERE 구에서와 마찬가지로 SELECT 구에서 지정한 별칭은

HAVING 구에서도 사용이 불가능합니다 ^^

 

 

SQL문 작성시,

만약 WHERE도 사용하고 HAVING도 사용하면

전체 데이터가 조건에 의해 추려지는 작업총 2번이 진행됩니다

①WHERE 조건으로 데이터를 추려내고

②GROUP BY로 데이터를 그룹화한 뒤

③HAVING 조건으로 다시 한 번 데이터를 추려낸다

 

 

 

 

 

SQL문 작성시 종종 이 내부처리 순서에 의해서

사용자의 의도대로 결과가 출력되지 않을 때가 있습니다 ^^

 

해당 상황에 대해서 문법적 오류가 있다면

다행히도 자체적으로 특정 Error 메세지가 검출될 수도 있지만,

문법적 오류가 없는 상황 속에서는 사용자의 의도와 다른 방향으로 정상 작동하므로

어디가 문제가 되는건지 파악하지 못 할 때도 있는데요 ^^

 

그러므로 내부 처리 순서에 대해서 꼭 인지하고 있어야 하겠습니다!

 

 

 

집계 작업과 관련된 내용에 대한 포스트는 이렇게 마무리하겠습니다

집계 작업과 관련된 추가적인 내용을 더 다룬다면

추후에 포스트로 다시 찾아뵙겠습니다 ^^

 

읽어주셔서 감사합니다!