반갑습니다!
저번 포스트에서 GROUP BY 키워드를 이용하여
여러 중복 데이터들을 그룹화하였습니다
그리고 그룹화 후 count(), sum(), avg() 등의 함수를 이용하여
특정 컬럼에 대해 집계하여 갯수, 합계, 평균 등의 값을 구했었는데요
이번에는 그룹화 이후에 특정 조건을 첨부하여 조건 조회하는
HAVING 키워드에 대해서 알아보겠습니다 ^^!
이어지는 이번 포스트 역시 동일한 샘플 데이터를 사용합니다
편의를 위해서 하단에 파일 첨부하겠습니다!
일단 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 메세지가 검출될 수도 있지만,
문법적 오류가 없는 상황 속에서는 사용자의 의도와 다른 방향으로 정상 작동하므로
어디가 문제가 되는건지 파악하지 못 할 때도 있는데요 ^^
그러므로 내부 처리 순서에 대해서 꼭 인지하고 있어야 하겠습니다!
집계 작업과 관련된 내용에 대한 포스트는 이렇게 마무리하겠습니다
집계 작업과 관련된 추가적인 내용을 더 다룬다면
추후에 포스트로 다시 찾아뵙겠습니다 ^^
읽어주셔서 감사합니다!
'MySQL > Aggregation&Subquery 다루기' 카테고리의 다른 글
[Aggregation&Subquery] 3. GROUP BY()로 데이터 그룹화하기 (0) | 2024.08.07 |
---|---|
[Aggregation&Subquery] 2. SUM(), AVG(), MIN(), MAX()로 집계하기 (0) | 2024.08.07 |
[Aggregation&Subquery] 1. COUNT()로 레코드 개수 구하기 (0) | 2024.08.07 |