SQL

SQL Having절 사용 방법과 null 존재하는 데이터 삭제하기

crazydeer 2022. 2. 21. 22:00
반응형

emp 테이블

 

Having 절

having절을 사용하는 이유는 where절에서는 그룹함수로 검색 조건을 줄 수 없습니다.

따라서 having절을 사용해야 합니다. 

위치는 group by 다음, order by 전입니다.

 

예를 들어

 

> SELECT job, avg(sal)

>   FROM emp

>   WHERE avg(sal) >= 4000;

>   GROUP BY job;

 

이렇게 쓸 수 없고 아래와 같이 써야 합니다.

 

> SELECT job, avg(sal)

>   FROM emp

>   GROUP BY job

>   HAVING avg(sal) >= 4000;

 

>> 실행 순서는 FROM, GROUP BY, HAVING, SELECT 순입니다.

 

SELECT절의 6가지 절

FROM

WHERE

GROUP BY

HAVING

ORDER BY

 

>> 이때 HAVING절과 GROUP BY절의 순서에 유의해야 합니다. 오류가 나지는 않지만 데이터가 다르게 조회될 수 있습니다.

 

 

예제) 직업, 직업 토탈 월급을 출력하는데 직업이 SALESMAN 사원은 제외하고 출력하고
직업 토탈 월급이 5000 이상인 것만 출력하고 직업 토탈 월급이 높은 것부터 출력하시오

(토탈 월급을 천단위로 출력되게 하시오)

 

방법 1.

> Select job, to_char(sum(sal), '999,999')

From emp

Where job <> 'SALESMAN'

Group by job

Having sum(sal) >= 5000

Order by sum(sal) desc;

 

방법 2.

> Select job, to_char(sum(sal), '999,999')

From emp

Group by job

Having sum(sal) >= 5000 and job <> 'SALESMAN'

Order by sum(sal) desc;

 

위 두가지 모두 동작하지만 방법 2와 같이 쓰지 않는 것이 좋습니다. 

검색 속도(성능) 면에서 떨어지기 때문입니다.

WHERE절에서 일반 검색 조건을, 

HAVING절에서 그룹함수를 이용한 검색 조건을 적는 것이 일반적입니다.

 

 

예제) 입사한 연도(4자리), 입사한 연도 토탈 월급을 출력하시오

 

> Select to_char(hiredate, 'RRRR'), sum(sal)

From emp

Group by to_char(hiredate, 'RRRR');

 

설명)

hiredate를 GROUP BY에서 하는 것이 아니라 to_char(hiredate, 'RRRR')를 GROUP BY 해야 합니다.

 

* null이 있는 데이터를 삭제하는 방법

> DELETE FROM emp

WHERE hiredate is null;

 

 

반응형