본문 바로가기

오라클

Group by 절

group by절

- 레코드들을 특정 컬럼값에 맞춰서 그룹을 나누는 작업

- 편가르기

- 그룹을 왜 묶을까?

1. 그룹을 나눠서 구분해서 관리하려고? 따로 정렬하기 위해서? :X

2. 나눠놓은 그룹을 완전 분리 > 별도의 테이블로 관리 : X

3. 각각의 나눠놓은 그룹별로 집계함수를 적용하기 위해서 : O(group by 절의 목적)



group by 컬럼명

- 그룹을 나누는데 기준이 되는 컬럼명(1개 or 그이상)


gropu by 구문

- select 컬럼리스트 from 테이블명 [where절] [group by 절] [order by 절]


group by 사용 시 컬럼리스트에 올 수 있는 대상

a. 집계함수 

b. group by의 대상 컬럼

c. a와 b를 제외하고는 모두 불가능


ex) tblinsa. 부서별(그룹) 평균(집계) 급여?

select buseo, round(avg(basicpay)) from tblinsa group by buseo; 


ex) 남자직원 몇명? 여자직원 몇명? > 성별로 그룹을 나눈뒤 count() 함수 적용

select 

    count(decode(substr(ssn,8,1),'1',1)) as 남자직원수,

    count(decode(substr(ssn,8,1),'2',1)) as 여자직원수

from tblinsa;


**실행 순서 : from > where > group by > select > order by


ex) tblinsa. buseo별로 평균 급여를 가져오시오.

- 추가조건. 각 직원이 월급이 2백만원 이상인 사람들만 가지고 bueso 별로 그룹 짓기 > 평균 급여

select buseo,round(avg(basicpay)),count(*)  

    from tblinsa 

    where basicpay >=2000000 

    group by buseo; 



having 절

- group by 절과 반드시 함께 사용

- 조건절(where 절과 같은 역할)

- from 절(모든 레코드 반환, 개개인 반환) -> 조건 -> where 절(각 개인에 대한 조건 & 질문) -> 결과 -> 만족하는 레코드 반환

- group by 절(레코드 그룹 형성) -> 통계 함수 적용 -> 통계 함수 적용 값 조건 -> having(통계 함수에 대한 조건) -> 결과 -> 만족하는 그룹 반환


ex)

select buseo,round(avg(basicpay)) 

    from tblinsa 

        group by buseo 

            having avg(basicpay) >=1500000; 



실행 순서 : from > where -> group -> having -> select -> order by

select buseo,round(avg(basicpay)) as pay 

    from tblinsa 

        where basicpay >=1500000 

            group by buseo

                having avg(basicpay) >=1500000

                    order by pay asc;  




'오라클' 카테고리의 다른 글

키의 개념 및 종류  (0) 2018.09.06
데이터베이스 모델링  (0) 2018.09.06
사용자 계정(SQL)  (0) 2018.09.06
계층형 쿼리(Hierarchical Query)  (0) 2018.09.06
페이징 (웹)  (0) 2018.09.05