반응형
- 한 줄 정리 : 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 |