: 특정 기준으로 레코드를 그룹으로 나눈다.(수단) > 각각의 그룹을 대상으로 집계 함수를 실행한다.(목적)
[WITH <Sub Query>]
SELECT column_list
FROM table_name
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition] - group by랑 무조건 같이 쓰기
[ORDER BY order_expression [ASC|DESC]]
SELECT 컬럼리스트 4. 컬럼 지정 (보고 싶은 컬럼만 가져오기) > Projection
FROM 테이블 1. 테이블 지정
WHERE 검색조건 2. 조건 지정 (보고 싶은 행만 가져오기) > Selection
GROUP BY 그룹기준 3. 그룹을 나눈다.
ORDER BY 정렬기준; 5. 정렬해서
select
buseo,
round(avg(basicpay)) as "부서별 평균 급여",
count(*) as "부서별 인원수",
sum(basicpay) as "부서별 총지급액",
max(basicpay) as "부서별 최고급여",
min(basicpay) as "부서별 최저급여"
from tblInsa
group by buseo;
-- 남자수? 여자수?
select * from tblComedian;
-- 컬럼값으로 보여줌
select
count(decode(gender, 'm', 1)) as 남자수,
count(decode(gender, 'f', 2)) as 여자수
from tblComedian;
-- 행으로 보여줌
select
gender,
count(*)
from tblComedian
group by gender;
컬럼값 | 행 |
---|---|
📌 저번에 select 주의 사항에서
집계함수와 일반컬럼을 함께 쓸 수 없다고 했으나
그룹으로 지은 컬럼은 가능하다!
select
count(*), buseo
from tblInsa
group by buseo
order by count(*) desc;
-- 다중그룹
select
count(*), buseo,jikwi
from tblInsa
group by buseo,jikwi
order by buseo,jikwi;
select
count(*), jikwi,buseo
from tblInsa
group by jikwi,buseo
order by jikwi,buseo;
--tblInsa. 과장+부장 몇명? 사원 + 대리 몇명?
select
case
when jikwi in ('과장', '부장') then 1
when jikwi in ('대리', '사원') then 2
end,
count(*)
from tblInsa
group by case
when jikwi in ('과장', '부장') then 1
when jikwi in ('대리', '사원') then 2
end;
: 그룹에 대한 조건
: having을 만족하는 그룹만 결과셋에 남는다.
-- 전직원 중 급여가 150만원 이상 사람들을 부서별로 그룹지어 인원수를 가져오시오
select --4. 각 그룹별 > 집계함수
buseo,
count(*),
round(avg(basicpay))
from tblInsa --1. 60명의 데이터를 가져온다.
where basicpay >= 1500000 --2. 60명을 대상으로 조건을 검사한다.
group by buseo; --3. 2번을 통과한 사람들을 대상으로 그룹을 짓는다. (7개의 부서가 아닐 수 도 있음)
-- 전직원을 부서별로 그룹 짓고, 그 그룹별 평균 급여가 150만원 이상인 그룹의 인원수
select
buseo, --4. 각 그룹별 > 집계함수
count(*),
round(avg(basicpay))
from tblInsa --1. 60명의 데이터를 가져온다.
group by buseo --2. 60명을 대상으로 그룹을 짓는다. (7개의 그룹이 만들어짐)
having avg(basicpay) >=1500000; --3. 그 그룹을 대상으로 조건을 검사한다.
-- 부서내(group by) 과장/부장(where)의 인원수가 3명 이상(having)인 부서?
select
buseo, count(*)
from tblInsa
where jikwi in ('과장','부장')
group by buseo
having count(*) >= 3;