본문 바로가기
oracle

1019_GROUP BY, HAVING 절

by 신방동불주먹 2022. 10. 19.

< GROUP BY >

 

특징 :

- 여러 데이터에서 의미 있는 하나의 결과를 특정 열 값별로 묶어서 출력한다

- UNION 과 같은 결과의 값을 간결화한다

- ORDER BY 와 함께 사용하여 그룹화 한 값을 정렬할 수 있다

-  조회되는 컬럼 수의 개수가 같으면 일반함수와 함께 사용 할 수 있다

 

 

<ORDER BY>

작성 형식 :

SELECT 컬럼명

FROM 테이블 명

WHERE 조건식

ORDER BY 컬럼명 ( 맨 마지막에 작성 )

 

 

<UNION>

- union을 이용해 출력한 각 부서의 급여 평균

select avg(sal) from emp where deptno = 10
UNION
select avg(sal) from emp where deptno = 20
UNION
select avg(sal) from emp where deptno  = 30;
  • 출력 순서를 deptno 순으로 정렬하려면 데이터를 강제로 입력해야함

 

 

 

<GROUP BY>

1. 조회되는 컬럼의 개수가 같으면 일반함수와 사용할수 있다.

select deptno
from emp
group by deptno; --데이터 개수 :3

select avg(sal) --avg 개수 :3
from emp
group by deptno; --3개의 그룸끼리모인다

--합치면
select deptno, avg(sal)
from emp
group by deptno;

2. order by 와 함께 사용하여 그룹화 한 데이터를 정렬 

SELECT DEPTNO,JOB,AVG(SAL)
FROM EMP
GRUOP BY DEPTNO,JOB
ORDER BY DEPTNO,JOB;

 

  •  유의점 : GROUP BY절에 없는 열을 SELECT절에 포함했을 경우 각 열별 데이터 수가 달라져 출력이 불가능하다
  • ORA-00937: 단일 그룹의 그룹 함수가 아닙니다 

 

 

 

< HAVING >

특징 :

- 묶인 그룹에 대한 조건을 제시 

- GROUP BY 절과 항상 함께 사용한다

- 조건식을 작성할 때 그룹함수를 사용한다

- GROUP BY, HAVING 절 보다 WHERE절이 우선 실행된다

 

 

작성 형식 :

SELECT 컬럼명

FROM 테이블 명

WHERE 조건식 (그룹함수 사용 불가)

GROUP BY 기준 컬럼명

HAVING 조건식 (그룹함수 사용)

ORDER BY 컬럼명 ( 맨 마지막에 작성 )

 

 

1. 그룹화 된 값의 조건을 설정

select deptno, avg(sal)
from emp
group by deptno
having  avg(sal) > 2000;

2. WHERE 조건식에 그룹함수 사용한 경우 : ORA00934 : 그룹함수는 허가되지 않습니다. 오류 발생

SELECT DEPTNO,JOB,AVG*SAL)
FROM EMP
WHERE AVG(SAL) >= 2000
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;

 

3. WHERE 절과 HAVING절을 모두 사용한 경우 : WHERE절이 먼저 실행 된다

SELECT DEPTNO,JOB,AVG(SAL)
FROM EMP 
WHERE SAL <= 3000
GROUP BY DEPTNO, JOB
HAVING AVG(SAL >= 2000
ORDER BY DEPTNO, JOB;

 

'oracle' 카테고리의 다른 글

1021_DML(Data Manipulation Language, 조작어)  (0) 2022.10.24
1020-Join문  (0) 2022.10.24
1019_그룹 함수(다중행 함수)  (0) 2022.10.19
1018-Order By(데이터 정렬), 연산자  (0) 2022.10.19
DQL(질의어)데이터 조회  (0) 2022.10.19