< 집계함수 >

  그룹별 산출된 결과 값에 중간집계를 계산해주는 함수

- ROLLUP(컬럼1, 컬럼2) : 컬럼1을 가지고 중간집계 내주는 함수 
 -> GROUP BY 절에 기술하는 함수 

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

>> DEPT_CODE 기준으로  SALARY의 중간 소계를 내줌 

- CUBE (컬럼1, 컬럼2) : 컬럼1을 가지고 중간집계 내고 추가로 컬럼2를 가지고도 중간집계를 냄 
 -> GROUP BY 절에 기술하는 함수 

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

>>DEPT_CODE 기준으로  SALARY의 중간 소계를 내고, JOB_CODE 기준으로 SALARY 소계를 냄

 


< 집합연산자 >

 여러개의 쿼리문을 하나의 쿼리문으로 만드는 연산자 

      -UNION     : 합집합 (두 쿼리문 수행한 결과값 더한 후 중복되는 값은 한번만 더해지도록) |  OR   
     -INTERSECT : 교집합 (두 쿼리문 수행한 결과값에 중복된 결과값) |  AND
     -UNION ALL : 합집합+교집합 (두 쿼리문의 결과값을 무조건 더한 결과값 => 중복된 값이 두번 표현될 수 있음 
     -MINUS     : 차집합 (선행쿼리의 결과값에서 후행쿼리의 결과값을 뺀 나머지) 
     

1. 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;

>>  OR 문  (WHERE DEPT_CODE = 'D5' OR SALARY>3000000;) 과 같음 

2. INTERSECT(교집합)

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;

>>AND문  (WHERE DEPT_CODE = 'D5' AND SALARY > 3000000;) 와 같음 

3. UNION ALL : 여러개의 쿼리 결과를 무조건 다 더하는 연산자 (합집합 + 교집합)

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; -- 중복값 2개 존재

4. MINUS : 선행쿼리의 결과값에 후행쿼리 결과값을 뺀 나머지 (차집합)

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;

>> 후행쿼리의 조건 반대로 제시 (WHERE DEPT_CODE = 'D5' AND SALARY <= 3000000;) 하면 같은 결과 

 

*****집합 연산자 사용시 유의사항 

1. 각 쿼리의 SELECT절에 작성된 컬럼의 갯수 동일해야함 

SELECT EMP_ID,EMP_NAME,DEPT_CODE,SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' 
UNION
SELECT EMP_ID,EMP_NAME,DEPT_CODE,
FROM EMPLOYEE
WHERE SALARY > 3000000;      -- 오류

2. 컬럼의 갯수 뿐만아니라 각 컬럼자리마다 동일한 타입으로 기술 

SELECT EMP_ID,EMP_NAME,DEPT_CODE,SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' 
UNION
SELECT EMP_ID,EMP_NAME,DEPT_CODE,HIRE_DATE
FROM EMPLOYEE
WHERE SALARY > 3000000;   -- 오류

 

'ORACLE' 카테고리의 다른 글

ORACLE 04. SELECT_ JOIN _외부조인  (0) 2022.11.17
ORACLE 04. SELECT_ JOIN _ 내부조인  (0) 2022.11.17
ORACLE 03. SELECT _ HAVING절  (0) 2022.11.16
ORACLE 03. SELECT _ GROUP BY절  (0) 2022.11.16
ORACLE 02. SELECT(함수) _ 그룹함수  (0) 2022.11.16
복사했습니다!