DB/오라클(Oracle)

[Oracle] 오라클 GROUP BY, HAVING 사용법

푸코잇 2023. 12. 2. 00:10

 

GROUP BY란?

오라클에서 제공하는 GROUP BY는 특정 칼럼을 기준으로 집계를 내는 데 사용된다.

예를 들어 PLAYER 테이블에서 포지션 별로 묶어 집계를 낸다고 가정해 보자.

 

SELECT POSITION FROM PLAYER
GROUP BY POSITION;

ORACLE-GROUP-BY

 

POSITION 칼럼을 기준으로 그룹을 만들었다.

그 결과 GK, DF, FW, MF 4가지 포지션이 있는 걸 알 수 있다.

 

SELECT POSITION, AVG(HEIGHT) FROM PLAYER
GROUP BY POSITION;

ORACLE-GROUP-BY-집계함수

 

집계함수를 이용하여 포지션별 평균키도 조회할 수 있다.

 

 

SELECT TEAM_ID, POSITION FROM PLAYER
GROUP BY TEAM_ID, POSITION
ORDER BY TEAM_ID;

ORACLE-GROUP-BY-여러개

 

GROUP BY 여러개 칼럼으로도 집계가능하다.

 

-- ORA-00979 ERROR
SELECT * FROM PLAYER
GROUP BY POSITION;

ORACLE-ORA-00979-에러

 

POSITION 칼럼으로 그룹을 했는데 전체 칼럼(*)을 조회하면 에러가 발생한다.

잘 생각해 보면 당연한 결과인걸 금방 알 수 있을 것이다.

마찬가지로 GROUP BY절에 지정된 칼럼이 아닌 HEIGHT나 WEIGHT 칼럼도 조회할 수 없다.

 

HAVING이란?

HAVING은 GROUP BY로 집계한 결과에 조건을 추가하는 것이다.

그럼 WHERE이랑 다를 게 없지 않냐고 생각이 들 수 있다.

하지만, 집계함수의 경우 WHERE에서 사용할 수 없다는 점!!

 

-- 몸무게가 80이상인 선수들의 평균키가 185이상인 포지션 조회
SELECT POSITION, AVG(HEIGHT) FROM PLAYER
WHERE WEIGHT >= 80
GROUP BY POSITION
HAVING AVG(HEIGHT) >= 185;

 

ORACLE-HAVING