그룹함수 (이채남 선생님 저 '오라클 실습' 참고)
-- 참고 자료
select * from temp;
19970101 김길동 74/01/25 AA0001 정규 Y 등산 100000000 부장
19960101 홍길동 73/03/22 AB0001 정규 Y 낚시 72000000 과장
19970201 박문수 75/04/15 AC0001 정규 Y 바둑 50000000 과장
19930331 정도령 76/05/25 BA0001 정규 Y 노래 70000000 차장
19950303 이순신 73/06/15 BB0001 정규 Y 56000000 대리
19966102 지문덕 72/07/05 BC0001 정규 Y 45000000 과장
19930402 강감찬 72/08/15 CA0001 정규 Y 64000000 차장
19960303 설까치 71/09/25 CB0001 정규 Y 35000000 사원
19970112 연흥부 76/11/05 CC0001 정규 Y 45000000 대리
19960212 배뱅이 72/12/15 CD0001 정규 Y 39000000 과장
*빈 값은 모두 NULL
-- 그룹함수
-- (1)COUNT
select count(*), count(8) from temp; -- 10, 10
select count(*), count(8) from dual; -- 1,1
--> *나 의미없는 값을 넣으면 row수만큼 읽어온다
select * from temp order by lev, hobby;
select count(emp_id), count(tel), count(hobby) from temp; -- 10, 0, 4
--> count() 괄호 안에 컬럼을 넣으면, 해당 컬럼이 null이 아닌 레코드의 개수를 읽어온다
select lev,
count(*),
count(hobby)
from temp
group by lev
order by lev;
-- 과장 4 2
-- 대리 2 0
-- 부장 1 1
-- 사원 1 0
-- 차장 2 1
--참고. GROUP 함수의 특징
select count(*) from temp
where hobby = '공부';
-- 또는
select count(hobby) from temp
where hobby = '공부';
-- count(*)
----------
-- 0
-- 1 row selected. --> 0 rows selected 가 아님. 해당 1개의 그룹(*group by 절이 없으므로 레코드 전체가 하나의 그룹)에 대해 1건의 결과를 출력하며, 그 그룹 중 '공부'가 취미인 레코드가 0개라는 1건의 결과를 출력함
select count(*)
from temp
where lev = '과장'
and salary >= 40000000;
select count(distinct lev) from temp;
-- min과 max
select min(emp_id) from temp;
select lev, min(emp_id)
from temp
group by lev;
-- 연습문제 그룹함수 연습
TEMP에서 직급별로 최소연봉을 가진 직원의 사번과 연봉을 읽어오자. (단,SUBQUERY를 사용하면 안 된다.)
select to_char(salary) from temp;
select lpad(to_char(salary),10,'0') from temp;
select min(lpad(to_char(salary),10,'0')) from temp;
select substr(min(lpad(to_char(salary),10,'0')||emp_id),11,8) EMP_ID from temp;
select lev, substr(min(lpad(to_char(salary),10,'0')||emp_id),11,8) EMP_ID, min(salary) SAL
from temp
group by lev;
-- SUM, AVG
-- 주의 : number type 컬럼만 인수로 받을 수 있다
-- 따라하기
select lev, count(*), sum(salary), avg(salary), sum(salary)/count(*) AVG2
from temp
group by lev;
-- 주의! 평균을 구할때는 NULL 값을 유의해야 한다.
--실험
select avg(salary) from temp; --57600000
update temp set salary = 0 where emp_name = '홍길동';
select count(salary), avg(salary), sum(salary)/count(*) AVG2 from temp; -- 10, 50400000, 50400000
update temp set salary = null where emp_name = '홍길동';
select count(*), count(salary), avg(salary), sum(salary), sum(salary)/count(*) AVG2 from temp; -- 10, 9, 56000000, 504000000, 50400000
--> 결국 avg(salary)= sum(salary)/count(salary) 로 구해진다는 것 (홍길동을 제외한 나머지 9명의 연봉 평균이 구해졌다.)
--> 전체 10명의 평균을 구하기 위해서는 nvl 함수를 사용해줘야 한다.
select avg(nvl(salary,0)) from temp; --50400000
rollback;
'Oracle_DB_Unix admin > 미분류' 카테고리의 다른 글
(참조) SELECT절에 사용된 Sub Query 예제 (0) | 2016.03.01 |
---|---|
JOIN (오라클 및 ANSI 표준) -- '오라클 실습' 연습문제 풀이 겸 (0) | 2016.02.10 |
데이터 형 변환 함수 (이채남 선생님 저 '오라클 실습' 참고) (0) | 2016.01.28 |
날짜 함수 (이채남 선생님 오라클 실습 2장 중) (0) | 2016.01.27 |
데이터 형 변환이 일어나는 예 (0) | 2015.10.25 |