ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL - ORDER BY, GROUP BY, HAVING
    DataBase/Oracle 2022. 1. 19. 20:04
    728x90
    반응형

    SQL - ORDER BY, GROUP BY, HAVING

     

     

     

    쿼리 실행 순서
    FROM -> CONNECT BY -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

    FROM절에서 만든 별칭은 모든 곳에서 쓸 수 있다.
    SELECT 절에서 만든 별칭은 HAVING과 그 이전 절에서 쓸 수 없다.

     

     

     

    ORDER BY 절

    • SELECT한 컬럼에 대해 정렬을 할 때 작성하는 구문
    • SELECT 구문의 가장 마지막에 실행

     

    GROUP BY 절

    • 집계 함수를 이용하기 위해서는 집계함수가 적용될 그룹의 기준
      GROUP BY절에 기술하여 사용해야 한다

     

    실습 예제 - GROUP BY

     

     

    -- DEPT_CODE 기준으로 그루핑
    SELECT
           COUNT(*)
         , DEPT_CODE
      FROM EMPLOYEE
     GROUP BY DEPT_CODE;
     
    -- DEPT_CODE, JOB_CODE 기준으로 그루핑
    SELECT
           DEPT_CODE
         , JOB_CODE
         , SUM(SALARY)
         , COUNT(*)
      FROM EMPLOYEE
     GROUP BY DEPT_CODE
            , JOB_CODE
     ORDER BY 1;

     

     

    -- 직원 테이블에서 부서 코드별 그룹을 지정하여 
    -- 부서코드, 그룹별 급여의 합계, 그룹별 급여의 평균(정수처리), 인원수
    -- 조회하고 부서코드 순으로 오름차순 정렬하세요
    SELECT 
           DEPT_CODE
         , SUM(SALARY) 합계
         , FLOOR(AVG(SALARY)) 평균
         , COUNT(*) 인원수
      FROM EMPLOYEE
     GROUP BY DEPT_CODE
     ORDER BY DEPT_CODE;
    
    -- 직원 테이블에서 직급코드, 보너스를 받는 사원 수를 조회하여
    -- 직급코드 순으로 오름차순 정렬하세요.
    SELECT
           JOB_CODE
         , COUNT(BONUS)
      FROM EMPLOYEE
     GROUP BY JOB_CODE
     ORDER BY JOB_CODE;
    
    -- 직원 테이블에서 직급코드, 보너스를 받는 사원 수를 조회하여
    -- 직급코드 순으로 오름차순 정렬하세요.
    -- 단, 보너스를 받는 사람이 없는 직급코드의 경우 RESULT SET에서 제외한다.
    SELECT
           JOB_CODE
         , COUNT(*)
      FROM EMPLOYEE
     WHERE BONUS IS NOT NULL
     GROUP BY JOB_CODE
     ORDER BY JOB_CODE;
    
    -- 직원 테이블에서 주민번호의 8번째 자리를 조회하여
    -- 1이면 남, 2이면 여로 결과 조회하고
    -- 성별별 급여 평균(정수처리), 급여 합계, 인원수를 조회한 뒤
    -- 인원수로 내림차순 정렬하세요.
    SELECT
           DECODE(SUBSTR(EMP_NO, 8, 1), 1, '남', 2, '여') AS 성별
         , FLOOR(AVG(SALARY)) 평균
         , SUM(SALARY) 합계
         , COUNT(*) 인원수
      FROM EMPLOYEE
    -- GROUP BY 성별 (GROUP BY절에서는 SELECT절의 별칭 사용 불가)
     GROUP BY DECODE(SUBSTR(EMP_NO, 8, 1), 1, '남', 2, '여')
     ORDER BY 인원수 DESC;

    실습 예제 - HAVING

     

     둘의 차이 잘 이해할 것

     

    -- 300만원 이상의 월급을 받는 사원들을 대상으로
    -- 부서별 그룹 월급 평균 계산
    SELECT
           DEPT_CODE
         , FLOOR(AVG(SALARY)) 평균
      FROM EMPLOYEE
     WHERE SALARY > 3000000
     GROUP BY DEPT_CODE
     ORDER BY 1;
    
    -- 모든 직원을 대상으로 부서별 월급 평균을 구한 뒤
    -- 평균이 300만원 이상인 부서 조회
    SELECT
           DEPT_CODE
         , FLOOR(AVG(SALARY)) 평균
      FROM EMPLOYEE
     GROUP BY DEPT_CODE
    HAVING FLOOR(AVG(SALARY)) > 3000000
     ORDER BY 1;

     

     

     

    -- 급여 합계가 가장 많은 부서의 부서코드와 급여 합계를 구하세요
    SELECT 
           DEPT_CODE
         , SUM(SALARY)
      FROM EMPLOYEE
     GROUP BY DEPT_CODE
    HAVING SUM(SALARY) = (SELECT MAX(SUM(SALARY))
                            FROM EMPLOYEE
                           GROUP BY DEPT_CODE
                         );

     

     

     

     

    728x90
    반응형

    'DataBase > Oracle' 카테고리의 다른 글

    SQL - SET OPERATION  (0) 2022.01.20
    SQL - ROLLUP, CUBE, GROUPING, GROUPING SETS  (0) 2022.01.20
    SQL - 집계 함수  (0) 2022.01.19
    SQL - NULL 관련 함수, 선택 함수  (0) 2022.01.19
    SQL - 형식 변환 함수와 포맷 문자  (0) 2022.01.19

    댓글

Designed by Tistory.