2024. 8. 14. 22:16ㆍLanguage/SQL
이전에 배운 집계함수(SUM, AVG, COUNT 등)는 'WHERE' 문과 사용할 수 없기에, 'SELECT' 문과 함께 사용하였다. 그러면 'GROUP BY' 를 통해 그룹화(카테고리화)된 데이터에 그룹별로 조건을 적용해 결과를 얻는 방법은 없을까?
질문에 대한 해답을 찾기 위해 검색을 해보니 'HAVING' 이란 것이 있었고 의문을 해소 할 수 있었다. '아 이런게 있구나' 하고 넘기기엔 아쉬워 좀 더 알아보고 이렇게 게시글에 내용을 정리하게 되었다.
1. 기본 문법
SELECT 그룹화 컬럼명, 집계함수(컬럼명) 별명
FROM 테이블명
GROUP BY 그룹화 컬럼명
HAVING 집계함수(컬럼명) 조건식
기본적으로 'HAVING' 은 'WHERE' 과 같이 데이터를 필터링하는 조건절의 역할을 한다. 하지만 둘은 분명하게 용도가 다르다.
- WHERE : 지정한 테이블(및 컬럼)의 모든 레코드(= row, tuple)에 작성한 조건이 적용된다.
- HAVING : 그룹화된 결과 레코드에 작성한 조건이 적용된다.
즉, 'ORDER BY' 사용 전엔 'WHERE' 를 통해 조건을 적용하고 이후에는 'HAVING' 을 통해 조건을 적용하는 것이다. 그러니 자연스럽게 사용 순서도 'WHERE - ORDER BY - HAVING' 순으로 사용할 거라 예상할 수 있다.
2. 사용 예시
'food_orders' 테이블 에서 주문 횟수가 50번 이상인 음식점의 이름과 주문 횟수를 파악해보자.
SELECT restaurant_name, COUNT(restaurant_name) order_count
FROM food_orders
GROUP BY restaurant_name
HAVING order_count >= 50
'GROUP BY' 를 사용해 'restaurant_name' 컬럼을 그룹화하고 'COUNT(restaurant_name)' 를 사용해 그룹별 레코드 개수를 카운팅하였다. 이후 'HAVING' 을 통해 그룹화된 결과 데이터에 '>= 50' 이란 조건식을 적용해 위의 이미지와 같은 결과를 얻을 수 있었다.
'Language > SQL' 카테고리의 다른 글
[SQL] 조건별 데이터 연산 - IF, CASE (0) | 2024.08.16 |
---|---|
[SQL] 문자 데이터 가공 - REPLACE, SUBSTRING, CONCAT (0) | 2024.08.16 |
[SQL] 데이터 정렬 - ORDER BY (0) | 2024.08.14 |
[SQL] 카테고리별 연산 - GROUP BY (0) | 2024.08.14 |
[SQL] 데이터 계산 - SUM, AVG, COUNT, MIN, MAX (0) | 2024.08.14 |