반응형

- 한 줄 정리 : order by가 보여주기 위해서 오름,내림차순으로 정리하는 것(보기 편안하게)이면,

group by도 이와 동일하게 보여주게끔 정리해주진 않지만, 우리가 보이는 order by로 정리된 시각화된 자료 처럼 그룹화 되어있다고 생각하면 된다.

 

 

Order by

- 실행순위가 맨 마지막이다. (오름차순, 내림차순 정렬 명령어)

- 1차정렬 : 일단 1차로 deptno로 정렬할게

- 사이에 오름차순, 내림차순이 들어갈 수 있다. (default 값이 오름차순) (ASC - 오름차순, DESC - 내림차순)

- 2차정렬 : 일단 1차정렬이 이뤄지고 나서, 그 1차정렬의 범위 안에서 2차적으로 정렬이 된다.

 

-- 급여순위별 정렬(많이받는순)
select * from sawon
order by sapay desc

 

-- 부서별 급여 순위별 정렬
select * from sawon
order by deptno,sapay desc

-- 부서별 급여 순위별 정렬
select * from sawon
order by deptno desc,sapay

-- group by
-- 부서별 인원수
select
   deptno, -- group화된 항목만 기록할 수 있다. 이같이 레이블을 넣어주어야, 뭐의 count인지 구분이 된다.
   count(*) as deptnoCount
   from sawon
   group by deptno -- 같은 데이터끼리 묶임(order by를 연상시키면 도움이 된다.)
   order by deptno -- 위에 그대로 사용하면 데이터가 뒤죽박죽 나온다.

그룹화된 항목을 넣으면 이런 오류가 나온다.

-- 성씨별 인원수
-- group by 항목은 기본필드 뿐만 아니라, 연산필드도 포함된다.
-- 내가 출력할 데이터를 먼저 적고, order by로 묶는다. 그리고 group by를 실행시키면 순서가 편안하다.
select
   substr(saname,1,1),
   count(*)
   from sawon
   group by substr(saname,1,1)
   order by substr(saname,1,1)

-- 부서별 성별 인원수
select
   deptno,sasex,
   count(*)
   from sawon
   group by deptno,sasex
   order by deptno,sasex

-- 부서별 성별 인원수로 급여평균, 급여합계 보기
select
   deptno,sasex,
   count(*) 인원수,
   floor(avg(sapay)) 급여평균,
   sum(sapay) 급여합계
   from sawon
   group by deptno,sasex
   order by deptno,sasex

-- 고객테이블에서 지역(시/도)별 인원 수
select
   substr(goaddr,1,2),
   count(*)
   from gogek
   group by substr(goaddr,1,2)
   order by substr(goaddr,1,2)

-- 고객테이블(뷰포함)
Q1. 나이별 인원 수
select
   age,
   count(*)
   from gogek_view3
   group by age
   order by age

Q2. 띠별 인원 수
select
   띠,
   count(*)
   from gogek_view3
   group by 띠
   order by 띠

Q3. 출생년대별 인원 수
    출생년도   인원 수
    1970년대   3
    1980년대   3
select
   trunc(birth_year,-1),
   count(*)
   from gogek_view3
   group by trunc(birth_year,-1)
   order by trunc(birth_year,-1)

Q4. 연령대별 인원 수
    20대 30대 40대
select
   trunc(age,-1),
   count(*)
   from gogek_view3
   group by trunc(age,-1)
   order by trunc(age,-1)
-- having절(group by에 대한 조건절)
-- 인원수가 5인 초과인 부서정보만 추출
select
   deptno,
   count(*)
   from sawon
   group by deptno
   having count(*)>5
   order by deptno

-- 사원테이블(뷰)를 이용해서 다음통계를 작성
select * from sawon_view

Q1. 입사년도별 인원수
select
   to_char(sahire,'YYYY'),
   count(*)
   from sawon_view
   group by to_char(sahire,'YYYY')
   order by to_char(sahire,'YYYY')

Q2. 입사년대별 인원수
select
   substr(to_char(sahire,'YYYY'),1,3)*10,
   count(*)
   from sawon_view
   group by substr(to_char(sahire,'YYYY'),1,3)*10
   order by substr(to_char(sahire,'YYYY'),1,3)*10
   
-- 선생님 풀이   
select
   substr(to_char(sahire,'YYYY'),1,3) || '0' as 입사년대,
   count(*) 인원수
   from sawon
   group by substr(to_char(sahire,'YYYY'),1,3) || '0'
   order by substr(to_char(sahire,'YYYY'),1,3) || '0'

Q3. 입사월별 인원수
select
   to_char(sahire,'MM'),
   count(*)
   from sawon_view
   group by to_char(sahire,'MM')
   order by to_char(sahire,'MM')


Q4. 입사계절별 인원수
select
   입사월,
   count(*)
   from sawon_view
   group by 입사월
   order by 입사월

Q5. 직급별 급여평균 중 4000만원 이상인 직급
select
  sajob,
  floor(avg(sapay)),
  count(*)
  from sawon_view
  group by sajob
  having floor(avg(sapay)) > 4000
  order by sajob

 

 

- group by 이해

- order by를 그대로 가져온다.

- 1차적으로 deptno의 안에서 같은 데이터끼리 묶어준다. (10은 10끼리, 20은 20끼리)

- deptno만 묶고 group by를 했을시에 10기준 6명으로 잡힌다.

통계(집계)함수
count(필드) : 해당도메인 갯수 (단, null은 포함하지 않는다)
count(*)    : 전체 레코드 수 구하기

sum(필드)   : 필드합을 구한다(숫자)
avg(필드)   : 필드평균 구한다)(숫자)

max(필드)   : 최대값(숫자/날짜)
min(필드)   : 최소값(숫자/날짜)

select
    count(*) 전체레코드수,
    count(samgr) samgr컬럼수,  -- null 포함 안됨
    sum(sapay) 전체급여합계,
    avg(sapay) 전체급여평균,
    max(sapay) 최대급여액,
    min(sapay) 최소급여액,
    max(sahire) 최근입사일자,
    min(sahire) 최초입사일자
from sawon

GROUP BY절


- GROUP BY 절은 데이터들을 원하는 그룹으로 나눌 수 있다.
- 나누고자 하는 그룹의 컬럼명을 SELECT절과 GROUP BY절 뒤에 추가하면 된다.
- 집계함수와 함께 사용되는 상수는 GROUP BY 절에 추가하지 않아도 된다. (개발자 분들이 많이 실수 함)
- 아래는 집계 함수와 상수가 함께 SELECT 절에 사용되는 예이다.

 

 

반응형

'데이터베이스↗' 카테고리의 다른 글

데이터베이스 Join  (0) 2024.05.28
ERwin Data Modeler  (0) 2024.05.27
데이터베이스 통계함수  (0) 2024.05.23
데이터베이스 서브쿼리  (0) 2024.05.23
데이터베이스 뷰 View  (0) 2024.05.23