Oracle

[DB/SQL] 오라클 그룹 조건 주는 방법 GROUP BY , HAVING

원코딩 2022. 7. 6. 07:46

 

 

 

 

테이블의 각 열에 대한 계산이 필요할 때 사용하는 것이 집합 함수이다. 

그리고 특정 그룹에 대한 연산이 필요할 때 사용하는 것이 GROUP BY이다.

그룹에 조건을 줄 때는 WHERE절이 아닌, HAVING절을 이용한다.

 

 


 

1. 집합 함수

집합 함수는 테이블의 각 열에 대한 계산이 필요할 때 사용된다.

 

COUNT

행의 개수를 반환한다.

* 테이블 전체 행의 개수를 알고 싶을 때 사용하기도 하고,

* 집합의 개수,

* 조건절의 개수 등 원하는 행의 개수를 확인 할 수 있어서 매우 유용하게 사용된다! 

MAX

컬럼의 최대값을 반환한다. 

* 페이징 기법에서 사용되기도 한다.

마지막 값에서 +1 을 하면 자동으로 값을 증가 시킬 수 있다.

SQUENCE의 대체 방법으로 사용된다.

MIN

컬럼의 최소값을 반환한다. 

SUM

컬럼 값의 합계를 반환한다. 

예) 월급의 합계, 매출의 합계, 수량의 합계

AVG

행의 개수를 반환한다. 테이블 전체 행의 개수를 알고 싶을 때 사용하기도 하고,

예) 월급의 평균, 수량의 평균, 평균온도

 

 

 

2. GROUP BY

같은 속성값끼리 그룹을 만들 수 있다.

(  지난번에 만들었던 과일가게 테이블을 활용해보도록 하겠다. )

 

예제1) 

같은 월에 입고된 과일은 몇 건인지 구하라.

 

 

해설)

1.같은 월을 계산하기 위해 SUBSTR 함수로 월별로 추출했다. 

SUBSTR(stardate,4,2) > stardate 값의 앞에서부터 4번째의 2글자를 추출하라. 

22/07/08 형태에서 앞에서 부터 4번째 글자인 0부터 두글자니깐 '07'의 형태로 추출된다. 

 

2.행의 개수를 반환하기 위해 COUNT(*) 집합함수를 사용했다.

 

3. 같은 월별로 그룹을 주어야 하기 때문에 SUBSTR(stardate,4,2) 입력한다. 

 

결과)

5월에 2건

6월에 4건

7월에 3건

으로 확인되었다. 

 

 

예제2)

수량이 같은 과일의 개수가격의 합계를 구하라.

"수량이 같은" : 그룹 group by sea

"개수" : count(*) 

"가격의 합계" : sum(price) 

 

 

그룹을 주고 출력할 때 주의할 점이 있다. 

SELECT 절에 집합함수를 사용할 때는 단일컬럼, 단일행 함수를 함께 사용할 수 없다! 

SELECT 절에는 오직 

* 그룹으로 사용할 컬럼

* 집합 함수 

만 사용 가능하다. 

 

 

이렇게 단일 컬럼인 name을 같이 출력 하려고 하면 오류가 뜬다. 

 

3. HAVING

그룹에 조건을 줄 때 사용한다.

HAVING 절은 반드시 GROUP BY 와 함께 사용되며,

GROUP BY에 조건을 줄 때는 WHERE이 아닌 HAVING만 사용 가능하다.

 

예제1)

같은 월에 입고된 과일은 몇 건인지 구하라. 단, 3건 이상인 경우만 출력하라.

 

 

5월에 2건 있었던 부분은 제외하고 출력되었다. 

 

 

 

예제2)

수량이 같은 과일의 개수 가격의 합계를 구하라.

단, 수량이 2개 이상인 과일만 출력하시오.

"수량이 같은" : 그룹 group by sea

"개수" : count(*) 

"가격의 합계" : sum(price) 

"수량이 2개 이상" : 그룹조건 having count(*)>=2

 

 

HAVING 절은 그룹으로 묶인 컬럼의 조건을 나타낸다!

 

 

 

 

 


 

 

그룹으로 묶고, 

그룹의 조건을 주는 것은 

어렵지 않지만! 

 

그룹을 사용하면

SELECT 절에 

단일컬럼, 단일행 함수는 

사용할 수 없다는 것을 꼭 기억하자.