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