본문 바로가기

데이터베이스/Oracle

7-1 다중행 함수, GROUP BY절과 HAVING절

다중행 함수

여러 행을 바탕으로 하나의 결과 값을 도출해내기 위해 사용하는 함수

하나의 행으로 결과를 출력하는 특징을 갖고 있기에 다중행 함수를 사용한 SELECT절에는 기본적으로 여러 행이 결과로 나올 수 있는 열을 함께 사용할 수 없음

다중행 함수 SUM 사용 질의 결과
다중행 함수를 사용한 SELECT절에는 여러 행이 결과로 나올 수 있는 열을 함께 사용할 수 없음

 

ORA-00937: 단일 그룹의 그룹 함수가 아닙니다

본 오류는 SELECT절에 (1)다중행 함수를 사용하여 결과 값이 한 행으로 나온 데이터(SUM(SAL)와

(2)여러 행이 나올 수 있는 데이터(ENAME)를 함께 명시했을 때 발생함

 

다중행 함수의 종류 설명
SUM 지정한 데이터의 반환
COUNT 지정한 데이터의 개수 반환 
MAX 지정한 데이터 중 최댓값 반환
MIN 지정한 데이터 중 최솟값 반환
AVG 지정한 데이터의 평균값 반환

 

 

1. SUM 함수

합계를 구할 데이터를 지정함, NULL 데이터를 제외하고 합계를 구함

DISTINCT를 지정하면 같은 결과 값을 가진 데이터는 합계에서 한번만 사용됨 = 중복 데이터를 제외하고 계산함

기본 형식 SUM(DISTINCT 혹은 ALL (선택, 기본값: ALL),
         합계를 구할 열이나 연산자, 함수를 사용한 데이터)
OVER(분석을 위한 여러 문법을 지정(선택))

SUM 함수는 NULL 데이터를 제외하고 합계를 구함
SUM 함수에서 DISTINCT, ALL 사용한 질의 결과

 

 

2. COUNT 함수

결과 행의 개수를 출력함, NULL 데이터는 제외하고 개수를 구함

COUNT 함수에 *을 사용하면 SELECT문의 결과 값으로 나온 행 데이터의 개수를 반환해 줌

WHERE절의 조건식을 함께 사용하면 특정 조건을 만족하는 데이터 출력할 수 있음

기본 형식 COUNT(DISTINCT 혹은 ALL (선택, 기본값: ALL),
              개수를 구할 열이나 연산자, 함수를 사용한 데이터)
OVER(분석을 위한 여러 문법을 지정(선택))

COUNT 함수를 사용한 질의 결과
WHERE 조건식과 함께 사용한 질의 결과
COUNT 함수에서 DISTINCT, ALL을 사용한 질의 결과

 

NULL 데이터는 반환 개수에서 제외되기 때문에 아래 두 질의의 결과는 같음

COUNT 함수는 NULL 데이터를 제외하고 개수를 구함
COUNT 함수와 IS NOT NULL을 사용한 질의 결과 (COUNT 함수만 사용한 것과 결과 값이 같음)

 

 

3. MAX, MIN 함수

MAX: 결과 행에서 최댓값을 출력함

MIN: 결과 행에서 최솟값을 출력함

숫자, 날짜, 문자 데이터의 크기 비교 가능

기본 형식 MAX(DISTINCT 혹은 ALL (선택, 기본값: ALL),
         최댓값을 구할 열이나 연산자, 함수를 사용한 데이터)
OVER(분석을 위한 여러 문법을 지정(선택))
기본 형식 MIN(DISTINCT 혹은 ALL (선택, 기본값: ALL),
        최솟값을 구할 열이나 연산자, 함수를 사용한 데이터)
OVER(분석을 위한 여러 문법을 지정(선택))

MAX 함수를 사용한 질의 결과
MIN 함수를 사용한 질의 결과
MAX 함수로 제일 최근 입사일 출력하기
MIN 함수로 제일 오래된 입사일 출력하기

 

 

4. AVG 함수

결과 행의 평균 값을 반환함, NULL 데이터는 제외하고 평균을 구함

숫자 또는 숫자로 암시적 형 변환이 가능한 데이터만 사용할 수 있음

기본 형식 AVG(DISTINCT 혹은 ALL (선택, 기본값: ALL),
        평균 값을 구할 열이나 연산자, 함수를 사용한 데이터)
OVER(분석을 위한 여러 문법을 지정(선택))

AVG 함수를 사용한 질의 결과
AVG와 DISTINCT를 사용한 질의 결과
AVG 함수는 NULL 데이터를 제외하고 평균을 구함

 

 

GROUP BY절

그룹화: 여러 데이터에서 의미 있는 하나의 결과를 특정 열 값별로 묶어서 출력

SELECT문에서 GROUP BY절을 작성하여 데이터를 그룹화할 수 있음

GROUP BY절에는 명시하는 열을 여러 개 지정할 수 있음 (먼저 지정한 열: 대그룹 → 그 다음 지정한 열: 소그룹으로 나눔)

별칭은 인식되지 않기에 열 이름이나 연산식을 그대로 지정해 주어야 함

기본 형식 SELECT 조회할 열1 이름, 열2 이름, ... 열N 이름
FROM 조회할 테이블 이름
WHERE 조회할 행을 선별하는 조건식
GROUP BY 그룹화할 열을 지정(여러 개 지정 가능)
ORDER BY 정렬하려는 열 지정

 

AVG 함수와 GROUP BY절 사용한 질의 결과
AVG 함수, GROUP BY, ORDER BY절 사용한 질의 결과

 

GOURP BY절을 사용해 출력 데이터를 그룹화할 때 유의할 점

다중행 함수를 사용하지 않은 일반 열을 GROUP BY절에 명시하지 않으면 SELECT절에서 사용할 수 없다는 점임

아래 상황에서 DEPTNO열과 AVG(SAL)열은 한 행으로 출력되지만, ENAME 열은 여러 행으로 구성되어 각 열별 데이터 수가 달라져 출력이 불가함

GROUP BY절에 없는 열을 SELECT 절에 포함하는 경우 오류가 발생함

 

ORA-00979: GROUP BY 표현식이 아닙니다.

본 오류는 ENAME도 GROUP BY절에 포함시키면 해결됨

GROUP BY절을 사용한 그룹화는 그룹화된 열 외에 일반 열을 SELECT절에 명시할 수 없다는 점을 반드시 기억해야 함

 

 

HAVING절

SELECT문에 GROUP BY절이 존재할 때만 사용할 수 있음

GROUP BY절을 통해 그룹화된 결과 중 출력 그룹을 선별하는 조건식을 지정함

별칭은 사용할 수 없음

기본 형식 SELECT 조회할 열1 이름, 열2 이름, ... 열N 이름
FROM 조회할 테이블 이름
WHERE 조회할 행을 선별하는 조건식
GROUP BY 그룹화할 열을 지정(여러 개 지정 가능)
HAVING 출력 그룹을 제한하는 조건식
ORDER BY 정렬하려는 열 지정

 

조건식을 지정하고 참인 결과만 출력한다는 점에서 HAVING절은 WHERE절과 비슷하다고 볼 수 있음

하지만 WHERE절은 출력 대상 행을 제한하는데, HAVING절은 그룹화된 대상을 출력에서 제한하는데 쓰임

둘의 쓰임새가 전혀 다르다는 점을 기억해야 함

HAVING절 대신 WHERE절을 사용하는 경우 오류가 발생함

 

아래의 경우 WHERE절을 추가한 SELECT문에서는 10번 부서의 PRESIDENT 데이터가 출력되지 않음

이는 WHERE절이 GROUP BY절과 HAVING절을 사용한 데이터 그룹화보다 먼저 출력 대상이 될 행을 제한하기 때문임

HAVING절만 사용하는 경우
WHERE절을 실행한 후 나온 결과 데이터가 GROUP BY절과 HAVING절의 그룹화 대상 데이터가 됨

 


 

참고 도서: https://www.yes24.com/Product/Goods/65849798

 

Do it! 오라클로 배우는 데이터베이스 입문 - 예스24

기본기가 무엇보다 중요한 데이터베이스처음 공부할 때 탄탄한 기본기를 쌓자!데이터베이스는 탄탄한 기본기를 쌓아야만 실무에서 어려운 SQL문을 만나도 흔들리지 않는다. 『Do it! 오라클로 배

www.yes24.com

 

반응형

'데이터베이스 > Oracle' 카테고리의 다른 글

8-1 조인  (0) 2024.02.01
7-2 그룹화와 관련된 여러 함수  (0) 2024.01.27
6-4 DECODE 함수와 CASE문  (3) 2024.01.24
6-3 형 변환 함수와 NULL 처리 함수  (0) 2024.01.24
6-2 숫자 함수와 날짜 함수  (0) 2024.01.18