[Oracle] 오라클 #14, group by, having 절(그룹)

group by 절


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

- 편가르기


그룹을 왜묶을까?

    

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

2. 나눠놓은 그룹들을 완전분리 -> 별도의 테이블로 관리하기 위해서? : X 

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

    

- group by 컬럼명

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

    

- group by 구문

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

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

    1. 집계함수(주목적)

    2. group by의 대상 컬럼

    3. 1과 2를 제외하고는 모두 불가능

    

예제


tblinsa 테이블 부서별 평균급여

select round(avg(basicpay)) from tblinsa where buseo = '총무부'; --171만

select round(avg(basicpay)) from tblinsa where buseo = '개발부';--138만원

select round(avg(basicpay)) from tblinsa where buseo = '영업부'; --160만원

select round(avg(basicpay)) from tblinsa where buseo = '기획부';--185만

select round(avg(basicpay)) from tblinsa where buseo = '인사부'; -- 153만

select round(avg(basicpay)) from tblinsa where buseo = '자재부';--141만원

select round(avg(basicpay)) from tblinsa where buseo = '홍보부';--145만원


위의 절 전체를 이거 하나로...

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


--tblinsa.부서별(그룹)평균급여.

--집계함수, group by 대상 컬럼 : 집합값

--나머지 컬럼 : 개인값


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


select count(*),substr(ssn,8,1) as "성별" from tblinsa group by substr(ssn,8,1);


--남자직원 몇명? 여자직원 몇명?

select count(*),substr(ssn,8,1) as "성별" from tblinsa group by substr(ssn,8,1);


select

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

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

from tblinsa;


--입사한 월 기준 : 각 월별 몇명씩 입사?

select to_char(ibsadate,'mm')||'월' as "입사월",count(*)

from tblinsa 

group by to_char(ibsadate,'mm') 

--order by "입사월";

order by count(*) desc;


select count(*) from tblinsa group by name;


select substr(name,1,1),count(*) from tblinsa

    group by substr(name,1,1)

        order by count(*) desc,substr(name,1,1) asc;


--백만원 단위로 그룸 > 각각의 그룹 몇명?

select floor(basicpay /1000000) * 100||'만원대',count(*) from tblinsa

    group by floor(basicpay /1000000);


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


--질문?


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

select round(avg(basicpay)) 

    from tblinsa 

        group by buseo;

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

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

    from tblinsa 

        where basicpay>=2000000 

            group by buseo ;



create table gg as

    select * from tblinsa where buseo='영업부';


select decode(substr(name,1,1),'김','티') from tblinsa;


select first

from tblname where weight = (select max(weight) from tblname) or weight = (select min(weight) from tblname);


select*from tblZoo;



--새끼를 낳는동물, 알을 낳는 동물

select born,count(*) from tblZoo group by born;


select family,round(avg(leg)),sum(leg),count(*),min(leg),max(leg) from tblZoo group by family;


select sizeof,born,wing,count(*) from tblZoo group by sizeof,born,wing;


--select + group by + where절

select thermo,count(*) from tblZoo group by thermo;

select thermo,count(*) from tblZoo where born = 'young' group by thermo;



having절

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

- where절과 같은 역할.

- from절이 모든 레코드(행)를 반환하면 거기에 대한 조건으로 where절이 동작한다.-> 각 레코드에 대한 조건 -> 만족하는 레코드 반환.

- group by절 : 레코드를 통해 그룹을 지음


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

>>> 부서부서별 평균급여 출력


select buseo,round(avg(basicpay)) from tblinsa where basicpay>=1500000 group by buseo;

>>> 부서와 부서별 평균급여(기본급이 1500000이상인)


select buseo,round(avg(basicpay)) from tblinsa where basicpay>=1500000 group by buseo having avg(basicpay)>=1500000;

>>> 부서, 부서별 평균급여(기본급의 평균이 1500000 이상인 그룹만 group by절로 그룹화하고 그중 basicpay가 1500000 이상인 레코드만 가져와라)


select * from tblZoo having avg(leg)<2;        

>>> tblZoo 테이블에서 다리평균이 2 보다 작은(다리가 2개도 안되는 동물은 안가져온다.) 레코드는 그룹화하지 않는다.

댓글

Designed by JB FACTORY