[oracle] 오라클 SQL - 복수행 함수


오라클 SQL 복수행 함수

5장. 복수행 함수

5장 : group by & having
복수행 함수 : AVG, SUM, COUNT, MAX, MIN, STDDEV, VARIANCE

Group by절 이해

    --emp table에서 
    --job 컬럼과 sal 컬럼 리턴
    select job, sal
    from emp;

    --emp table에서
    --job을 그룹한 컬럼과 sal 컬럼의 합 리턴
    select job, sum(sal)
    from emp
    group by job;

    --emp table에서
    --deptno와 job을 그룹한 컬럼과 sal 컬럼의 합 리턴
    --deptno 정렬한 후 job으로 정렬
    select deptno, job, sum(sal)
    from emp
    group by deptno, job
    order by deptno, job;
    --가공한 결과에 의한 Group by
    --문제 입사일자의 월(Month)를 활용한 집계
    --emp table에서
    --hiredate 컬럼에서 'mm' month를 문자화해서 그룹한 후
    --월로 정렬해서 리턴
    select to_char(hiredate, 'mm') as 월, count(*) as 인원수
    from emp
    group by to_char(hiredate, 'mm')
    order by 월;

group by절 관련 중요 문법

    -- select 리스트에서 복수행 함수로 감싼 이외의 모든 컬럼은 반드시 group by절에 나타나야 한다. 단, literal은 예
    --* 복수행 함수를 감싼 컬럼(sum(sal)을 제외한 나머지 컬럼이 group by에 나와야한다.
    --에러  
    select job, sum(sal)
    from emp;함

    --리턴
    select job, sum(sal)
    from emp
    group by job;

    --literal은 예외로 리턴
    select '부서별 직무별' gubun, deptno, job, sum(sal)
    from emp
    group by deptno, job
    order by deptno, job;

5-5. 그룹 함수 유형

    select          sal from emp;       --결과값 : 14명
    select distinct sal from emp;       --결과값 : 12명
    
    select avg(sal)          from emp;  --결과값 : 2073...
    select avg(distinct sal) from emp;  --결과값 : 2064...

5-6.

    --* 모든 그룹 함수는 null을 무시한다. 단 count(*) 예외 
    drop table t1 purge;
    
    create table t1 (no number);
    
    insert into t1 values (1000);
    insert into t1 values (1000);
    insert into t1 values (2000);
    insert into t1 values (2000);
    insert into t1 values (null);
    insert into t1 values (null);
    
    commit;
    
    select no, no, no
    from t1;
    --count(*)           --no 컬럼에 들어간 모든 값 개수(null포함) : 6  
    --count(no)          --no 컬럼에 들어간 데이터 개수           : 4   
    --count(distinct no) --no 컬럼에 중복값을 제거한 데이터 개수    : 2  
    select count(*), count(no), count(distinct no)
    from t1;
    
    --count(*)      --사원수라는 의미             : 6 
    --count(comm)   --커미션을 받는 사원 수라는 의미 : 4 
    select count(*), count(comm)
    from emp
    where deptno = 30;

5-11. 그룹 함수 및 null 값

    select          sal from emp;       --결과값 : 14명
    select distinct sal from emp;       --결과값 : 12명
    
    select avg(sal)          from emp;  --결과값 : 2073...
    select avg(distinct sal) from emp;  --결과값 : 2064...

    select comm,
           nvl(comm, 0)
    from emp;
    
    select avg(comm) a,           --커미션 받는 사원들의 평균 커미션 
           avg(nvl(comm, 0)) b    --전체 사원들의 평균 커미션
    from emp;

5-20. where절 vs having절

    --여기서 where을 쓸까? having을 쓸까? 좋은 방법은 where
    --ex) where : 대통령 선거시 A시 뺄것 먼저 선택 후 시군구 집계 
    --ex) having :대통령 선거 시군구 집계를 다 한 후에 A시만 빼
    --where
    select deptno, sum(sal)
    from emp
    where deptno != 20   --    !=   <>  ^=   3가지 가능  
    group by deptno;
    
    --having
    select deptno, sum(sal)
    from emp
    group by deptno
    having deptno != 20;


    --복수행 함수 적용 전 걸러낸다. 
    --문법 에러
    select deptno, sum(sal)
    from emp
    where sum(sal) < 10000
    group by deptno;

    --복수행 함수 적용 후 걸러낸다.
    --리턴 
    select deptno, sum(sal)
    from emp
    group by deptno
    having sum(sal) < 10000;
    
    --즉 where을 먼저 처리해보고 안되면 having을 쓰자.

    --where 절에는 그룹함수 사용 불가능.
    --having 절에 그룹함수 사용 가능.

5-26 그룹함수의 중첩

    --부서별 평균 급여 구하기
    select avg(sal)
    from emp
    group by deptno;
    
    --부서별 최대 평균 급여 구하기
    select max(avg(sal))
    from emp
    group by deptno;

References

개발자님들 덕분에 많이 배울 수 있었습니다. 감사의 말씀 드립니다.





© 2020. GANGPRO. All rights reserved.