Oracle DBA/SQL
067 집합 연산자로 데이터를 위아래로 연결하기 1(UNION ALL)
Nuez
2023. 7. 3. 18:15
반응형
JOIN : 두 테이블의 결과를 양옆으로 연결해서 보여주는 문법
집합 연산자 : 두 테이블의 결과를 위 아래로 연결해서 보여주는 문법
* 집합 연산자의 종류 4가지
1. UNION ALL
2. UNION
3. INTERSECT
4. MINUS
문제 336. 부서번호, 부서번호 별 토탈월급을 출력하시오.
SELECT deptno, sum(sal)
FROM emp
GROUP BY deptno;
문제 337. 사원테이블의 전체 토탈 월급을 출력하시오.
SELECT sum(sal)
FROM emp;
문제 338. ROLLUP을 이용해서, 부서번호, 부서번호별 토탈월급을 출력하는데, 맨 밑에 전체 토탈 월급을 출력되게 하시오.
SELECT deptno, sum(sal)
FROM emp
GROUP BY ROLLUP(deptno);
문제 339. 위의 결과를 rollup을 이용하지 않고 union all로 구현해보시오.
SELECT deptno, sum(sal)
FROM emp
GROUP BY deptno
UNION ALL
SELECT to_number(NULL) as deptno, sum(sal)
FROM emp
ORDER BY 1;
UNION ALL 밑의 SQL문에 단순히 NULL as deptno가 아니라 to_number(NULL)로 적어주는게 좋음
(부하를 줄여주는 방법)
합집합 연산자 사용할 때 주의 사항
1) 위의 SQL과 아래의 SQL의 컬럼 갯수가 동일해야 한다.
2) 위의 SQL과 아래의 SQL의 컬럼의 데이터 유형이 동일해야 한다.
3) 컬럼 별칭은 맨위에 있는 쿼리에만 지정해줄 수 있다.
컬럼 별칭은 union all 전 맨 위에 select절에서만 지정할 수 있다.
4) 가급적 컬럼명도 동일하게 해줘야 ORDER BY할 때 깔끔하게 정렬된다.
ORDER BY도 중간에 사용 못하고 맨 마지막 쿼리에 써야 함.
ORDER BY할 때 첫 쿼리에서 별칭을 썼다면, 정렬하는 컬럼명에도 그 별칭을 써줘야 함.
문제 340. 아래의 SQL의 결과를 UNION ALL로 구현하시오.
SELECT deptno, job, sum(sal)
FROM emp
GROUP BY grouping sets((deptno),(job));
SELECT deptno, TO_CHAR(null) AS job, SUM(sal)
FROM emp
GROUP BY deptno
UNION ALL
SELECT TO_NUMBER(NULL) AS deptno, job, SUM(sal)
FROM emp
GROUP BY job
ORDER BY 1,2;
문제 341. 아래의 SQL의 결과를 UNION ALL로 수행하시오.
SELECT TO_CHAR(hiredate,'RRRR'), job, SUM(sal)
FROM emp
GROUP BY GROUPING SETS((TO_CHAR(hiredate,'RRRR')), (job));
SELECT TO_CHAR(hiredate,'RRRR'), TO_CHAR(null) AS job, SUM(sal)
FROM emp
GROUP BY TO_CHAR(hiredate,'RRRR')
UNION ALL
SELECT TO_CHAR(null) AS hiredate, job, SUM(sal)
FROM emp
GROUP BY job
ORDER BY 1, 2;
문제 342. 위의 결과를 아래와 같이 정렬해서 출력하시오.
SELECT TO_CHAR(hiredate,'RRRR') as 년도 , TO_CHAR(null) AS job, SUM(sal)
FROM emp
GROUP BY TO_CHAR(hiredate,'RRRR')
UNION ALL
SELECT TO_CHAR(null) AS 년도, job, SUM(sal)
FROM emp
GROUP BY job
ORDER BY 년도;
문제 343. 아래와 같이 결과를 출력하시오.
SELECT TO_CHAR(hiredate,'RRRR') as 년도 , TO_CHAR(null) AS job , SUM(sal)
FROM emp
GROUP BY TO_CHAR(hiredate,'RRRR')
UNION ALL
SELECT TO_CHAR(null) AS 년도, job, SUM(sal)
FROM emp
GROUP BY job
ORDER BY 년도, 2;