ORACLE SQL공부를 하다가 HAVING 절을 잘 모르고 있다는 것을 알게되어 이참에 GROUP BY절과 함께 HAVING절도 다시 정리해보고자 한다.
GROUP BY 절
GROUP BY 절은 같은 속성값끼리 묶어 그룹을 만들때 사용하는 구문이다.
그룹을 주고 출력할때는 주의점이 있는데,
SELECT 절에 집합함수를 사용할 때는 단일컬럼, 단일행 함수를 함께 사용할 수 없다.
이때는 SELECT 절에 오직 "그룹으로 사용할 컬럼"과 "집계함수(집합함수)"만 사용가능하다.
HAVING 절
HAVING 절은 SQL 쿼리에서 그룹화된 결과 집합에 조건을 적용하는데 사용하는 구문이다.
주로 GROUP BY 절과 함께 사용되며,
GROUP BY로 그룹화된 결과 집합에서 특정 그룹을 필터링하고, 집계된 결과 집합에서 그룹간의 비교를 수행하여 특정 조건을 충족하는 그룹만 선택할 때 사용된다.
간단히 말해서, HAVING 절은 GROUP BY로 그룹화된 결과에 대한 조건을 지정하여 그룹간의 비교와 필터링을 수행하는데 사용된다.
> WHERE절과 헷갈릴 수도 있는데, 명확한 차이가 존재한다.
WHERE절은 테이블의 레코드를 필터링하기 위해 사용한다. 테이블의 각 레코드에 대한 조건을 적용하에 특정 레코드를 선택하는 것이 WHERE절의 역할이다.
하지만 HAVING절은 GROUP BY절로 그룹화된 결과집합에 조건을 적용하여 그룹간의 비교를 수행한다. 이것은 명확히 WHERE절이 하는 역할과는 다르다.
형식)
SELECT [그룹으로 묶을 컬럼]
FROM 테이블명
WHERE 조건
GROUP BY [그룹으로 묶을 컬럼 값]
HAVING [그룹 조건]
ORDER BY 정렬 컬럼
예시)
프로그래머스 - [59041] 동명동물 수 찾기
문제)
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
답)
SELECT NAME, COUNT(NAME) AS COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME
위의 SQL 쿼리에서 HAVING 절은 COUNT(NAME)>1 이라는 조건을 사용하여 이름이 두번 이상 나타난 그룹을 선택한다. 이 조건은 그룹화된 결과 집합에서 그룹 간의 비교를 통해 이름이 두 번 이상 나타난 그룹만을 선택한 것이다.
'DB > Oracle' 카테고리의 다른 글
[Oracle] SELECT 결과 상위 N개만 검색 / FETCH FIRST N ROWS ONLY (0) | 2023.11.05 |
---|---|
[Oracle] 데이터 중복 제거 / DISTINCT, GROUP BY (0) | 2023.10.21 |
[Oracle] 반올림, 버림(절사) / ROUND 함수, TRUNC 함수 (0) | 2023.10.12 |
[Oracle] 날짜정보 추출 함수 / EXTRACT (0) | 2023.10.12 |
[Oracle] 문자열 형변환 / TO_CHAR 함수 (날짜 포맷, 소수점, 천단위 콤마) (0) | 2023.10.12 |