ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle - ORDER BY / GROUP BY / HAVING
    데이터베이스/Oracle 2020. 11. 11. 17:05
    728x90
    반응형

    ORDER BY

    ORDER BY란 SELECT한 컬럼에 대해 정렬을 할 때 작성하는 구문으로

                      SELECT 구문의 가장 마지막에 작성하며 실행 순서 역시 가장 마지막수행된다.

     

    [ 표현식 ]

    정렬 방식ASC오름차순이고 DESC내림차순이다.

    또는, 컬럼명이 아닌 컬럼의 순서를 숫자로 표기할 수 있다.

     

    [ ORDER BY 예시 ]

    - EMPLOYEE 테이블에서 부서별 코드, 부서별 급여합, 부서별 급여 평균, 부서별 인원 수를 부서코드 순으로 조회

    SELECT DEPT_CODE, SUM(SALARY) "급여 합",FLOOR(AVG(SALARY)) "급여 평균", COUNT(*) "인원 수"
    FROM EMPLOYEE
    GROUP BY DEPT_CODE
    ORDER BY DEPT_CODE;

     

     

     

    GROUP BY

    GROUP BY란 그룹 함수는 단 한 개의 결과 값만 산출하기 때문에그룹이 여러 개일 경우 오류 발생한다. 그래서

    여러 개의 결과 값을 산출하기 위해 그룹 함수가 적용될 그룹의 기준을 GROUP BY절에 기술하여 사용한다.

     

    즉, 코드를 이렇게 작성하면

    SELECT DEPT_CODE,
    SUM(SALARY)
    FROM EMPLOYEE; -- 에러가 난다. 
    -- ORA-00937: not a single-group group function

    DEPT_CODE는 여러개의 값을 불러오는데 SUM값이 1개만 나오기 때문에 에러가 나타난다.

    그래서 DEPT_CODE 그룹별로 합을 구하려면 GROUP BY절을 써야한다.

     

    코드를 이렇게 작성하면

    SELECT DEPT_CODE, SUM(SALARY) 
    FROM EMPLOYEE 
    GROUP BY DEPT_CODE;

    DEPT_CODE별로 그룹을 묶어서 결과가 이렇게 나온다.

     

    [ GROUB BY 예시 ]

    - EMPLOYEE테이블에서 부서코드, 그룹 별 급여의 합계, 그룹 별 급여의 평균(정수처리), 인원 수를 조회하고 부서 코드 순으로 정렬

    SELECT DEPT_CODE 부서코드, SUM(SALARY) 합계, FLOOR(AVG(SALARY)) 평균, COUNT(*) 인원수
    FROM EMPLOYEE
    GROUP BY DEPT_CODE
    ORDER BY DEPT_CODE ASC;

     

     

     

     

    - EMPLOYEE테이블에서 부서코드와 보너스 받는 사원 수 조회하고 부서코드 순으로 정렬

    SELECT DEPT_CODE 부서코드, COUNT(BONUS) 인원수 
    FROM EMPLOYEE 
    GROUP BY DEPT_CODE 
    ORDER BY DEPT_CODE ASC;

     

    GROUP BY에 함수를 입력하여 그룹으로 묶을 수 있다.

    - EMPLOYEE테이블에서 성별과 성별 별 급여 평균(정수처리), 급여 합계, 인원 수 조회하고 인원수로 내림차순 정렬

    SELECT DECODE(SUBSTR(EMP_NO, 8, 1), 1, '남', 2, '여') 성별,
    FLOOR(AVG(SALARY)) 평균,
    SUM(SALARY) 합계,
    COUNT(*) 인원수
    FROM EMPLOYEE
    GROUP BY DECODE(SUBSTR(EMP_NO, 8, 1), 1, '남', 2, '여')
    ORDER BY 인원수 DESC;

     

    여러 컬럼을 그룹으로 묶을 수 있다

    - EMPLOYEE테이블에서 부서 코드 별로 같은 직급인 사원의 급여 합계를 조회하고 부서 코드 순으로 정렬

    SELECT DEPT_CODE, JOB_CODE, SUM(SALARY) 
    FROM EMPLOYEE 
    GROUP BY DEPT_CODE, JOB_CODE 
    ORDER BY DEPT_CODE;

     

     

    HAVING

    HAVING이란 그룹 함수로 값을 구해올 그룹에 대해 조건을 설정할 때 HAVING절에 기술한다.

    WHERE절은 각 컬럼 값에 대한 조건을 설정할 수 있지만 HAVING절은 그룹에 대해 조건을 설정한다.

     

    [ HAVING 예시 ]

    그룹별 조회

    - 부서 코드와 급여 3000000 이상인 직원의 그룹별 평균 조회

    SELECT DEPT_CODE, FLOOR(AVG(SALARY)) 평균
    FROM EMPLOYEE
    WHERE SALARY >= 3000000
    GROUP BY DEPT_CODE
    ORDER BY 1;

     

    그룹을 조회

    - 부서 코드와 급여 평균이 3000000 이상인 그룹 조회

    SELECT DEPT_CODE, FLOOR(AVG(SALARY)) 평균 
    FROM EMPLOYEE 
    GROUP BY DEPT_CODE HAVING FLOOR(AVG(SALARY)) >= 3000000 
    ORDER BY DEPT_CODE

    728x90
    반응형
Designed by Tistory.