[Oracle] 오라클 #14, group by, having 절(그룹)
- Database/Oracle
- 2019. 3. 3. 20:12
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개도 안되는 동물은 안가져온다.) 레코드는 그룹화하지 않는다.
'Database > Oracle' 카테고리의 다른 글
[Oracle] 오라클 #16, 조인(join) 개념과 종류, 예제 및 응용 (1) | 2019.03.04 |
---|---|
[Oracle] 오라클 #15, 서브쿼리에 대해서(예제 및 응용) (0) | 2019.03.03 |
[Oracle] 오라클 #13, update, delete문과 rollback (2) | 2019.02.27 |
[Oracle] 오라클 #12, insert 삽입구문(특이한 insert 구문) (4) | 2019.02.25 |
[Oracle] 오라클 #11, 시퀀스(Sequence) (0) | 2019.02.23 |