DataBase/Oracle

SQL - ORDER BY, GROUP BY, HAVING

jddng 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
반응형