SQL

SQL3 GROUP BY & HAVING

#풀닢 2023. 1. 16. 13:59
ORDER BY절 SELECT한 컬럼에 대해 정렬을 할 때 작성하는 구문
SELECT 구문의 가장 마지막에 작성하며, 실행순서도 가장 마지막에 수행 됨
표현식 ORDER BY 컬럼명 | 별칭 | 컬럼순번 정렬방식
[NULLS FIRST | LAST ]

GROUP BY절 그룹함수는 단 한 개의 결과값만 산출하기 때문에,
그룹함수를 이용하여 여러 개의 결과값을 산출하기 위해서는
그룹함수가 적용될 그룹의 기준을 GROUP BY절에 기술하여 사용
SELECT
            DEPT_CODE
            , SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;
 
[ EMPLOYEE 테이블에서 부서코드, 그룹별 급여의 합계, 그룹별 급여의 평균(정수처리), 인원수를 조회하고, 부서코드 순으로 정렬하세요. ] SELECT
            DEPT_CODE
            , SUM(SALARY) AS 합계
            , AVG(SALARY) AS 평균
            , COUNT(*) AS 인원수
FROM EMPLOYEE
GROUP BY DEPT_CODE
ORDER BY DEPT_CODE ASC;
[ EMPLOYEE 테이블에서 부서코드, 보너스를 지급받는 사원 수를 조회하고 부서코드 순으로 정렬하세요. ] SELECT
            DEPT_CODE
            , COUNT(*) AS 인원수
FROM EMPLOYEE
WHERE BONUS IS NOT NULL
GROUP BY DEPT_CODE
ORDER BY DEPT_CODE ASC;
[ EMPLOYEE 테이블에서 EMP_NO의 8번째 자리가 1이면 '남’, 2이면 ‘여’로 결과를 조회하고, 성별별 급여의 평균(정수처리), 급여의 합계, 인원수를 조회한 뒤, 인원수로 내림차순 정렬하세요. SELECT
             DECODE(SUBSTR(EMP_NO,8,1)
            , 1,’남’ , 2,'여’) AS 성별
             , FLOOR(AVG(SALARY)) AS 평균
            , SUM(SALARY) AS 합계
            , COUNT(*) AS 인원수
FROM EMPLOYEE
GROUP BY DECODE(SUBSTR(EMP_NO,8,1), 1,’남’ , 2,'여’)             
ORDER BY COUNT(*) DESC;

HAVING절 그룹함수로 값을 구해올 그룹에 대해 조건을 설정할 때는
HAVING절에 기술한다. (WHERE절은 SELECT에 대한 조건)
[ 급여 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 1;

그룹별 산출한 결과값의 집계를 계산하는 함수 ROLLUP  그룹별 산출한 결과값의 집계를 계산하는 함수   CUBE
SELECT
            JOB_CODE
            , SUM(SALARY)
FROM EMPLOYEE
GROUP BY ROLLUP(JOB_CODE) ORDER BY 1;
SELECT
            JOB_CODE
            , SUM(SALARY)
FROM EMPLOYEE
GROUP BY CUBE(JOB_CODE)
            ORDER BY 1;
인자로 전달받은 그룹 중에 가장 먼저 지정한 그룹별 합계와 총 합계를 구한다. 그룹으로 지정된 모든 그룹에 대한 합계와 총 합계를 구한다.
SELECT
            DEPT_CODE
            , JOB_CODE
            , SUM(SALARY)
FROM EMPLOYEE
GROUP BY ROLLUP(DEPT_CODE,JOB_CODE)
            ORDER BY 1;
SELECT
            DEPT_CODE
            , JOB_CODE
            , SUM(SALARY)
FROM EMPLOYEE
GROUP BY CUBE(DEPT_CODE,JOB_CODE)
            ORDER BY 1;

GROUPING ROLLUP이나 CUBE에 의한 집계 산출물이 인자로 전달받은 컬럼 집합의 산출물이면 0을 반환하고, 아니면 1을 반환하는 함수
  SELECT
            DEPT_CODE
            , JOB_CODE
            , SUM(SALARY)
            , CASE
WHEN GROUPING(DEPT_CODE) = 0
            AND
            GROUPING(JOB_CODE) = 1
            THEN ‘부서별합계’
WHEN GROUPING(DEPT_CODE) = 1
            AND
            GROUPING(JOB_CODE) = 0
            THEN ‘직급별합계’
WHEN GROUPING(DEPT_CODE) = 1
            AND GROUPING(JOB_CODE) = 1
            THEN ‘총합계’
            ELSE ‘그룹별합계’
END AS 구분
FROM EMPLOYEE
GROUP BY CUBE(DEPT_CODE, JOB_CODE)
            ORDER BY 1;

SET OPERATION

여러 개의 SELECT 결과물을 하나의 쿼리로 만드는 연산자

UNION
중복 된 영역을 제외 후 하나로 합치기

UNION ALL
중복된 영역을 모두 합치기

INTERSECT
공통된 결과만 추출

MINUS
겹치는 부분을 제외한 나머지


UNION UNION과 UNION ALL은 여러 개의 쿼리 결과를 하나로
합치는 연산자이다.
그 중 UNION은 중복된 영역을 제외하여 하나로 합치는 연산자
  SELECT
            EMP_ID
            , EMP_NAME
             , DEPT_CODE
            , SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5’

UNION
SELECT
            EMP_ID
            , EMP_NAME
            , DEPT_CODE
            , SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;

UNION ALL UNION ALL은 UNION과 같은 여러 쿼리 결과물에
대한 합집합을 의미하며,
UNION과의 차이점은 중복된 영역을 모두 포함시키는 연산자
  SELECT
            EMP_ID
            , EMP_NAME
            , DEPT_CODE
            , SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5’

UNION ALL
SELECT
            EMP_ID
            , EMP_NAME
            , DEPT_CODE
            , SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;

INTERSECT 여러 개의 SELECT 결과에서 공통된 부분만 결과로 추출한다. 즉, 수행결과에 대한 교집합
  SELECT
            EMP_ID ,
            EMP_NAME
            ,DEPT_CODE
            , SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5’

INTERSECT

SELECT
            EMP_ID
            , EMP_NAME
            , DEPT_CODE
            , SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;

MINUS 선행 SELECT 결과에서 다음 SELECT 결과와 겹치는 부분을 제외한 나머지 부분만 추출한다.
즉, 두 쿼리 결과물의 차집합
  SELECT
            EMP_ID
            , EMP_NAME
            , DEPT_CODE
            , SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5’

MINUS
SELECT
            EMP_ID
            , EMP_NAME
            , DEPT_CODE
            , SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;

GROUPING SETS 그룹별로 처리된 여러 개의 SELECT문을
하나로 합친 결과를 원할 때 사용한다.
SET OPERATOR(집합연산자) 사용한 결과와
동일한 결과를 얻을 수 있다
  SELECT
            DEPT_CODE
            , JOB_CODE
            , MANAGER_ID
            , FLOOR(AVG(SALARY))
FROM EMPLOYEE
GROUP BY GROUPING
SETS( (DEPT_CODE, JOB_CODE, MANAGER_ID)
            , (DEPT_CODE, MANAGER_ID)
            , (JOB_CODE, MANAGER_ID) );
SMALL