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 |