개발일기/Oracle
오라클 JOIN ,UNION ,UNION ALL (집합연산자), 연습문제
민장미
2023. 5. 13. 16:42
연습문제. 참고로 SCOTT계정이 아닌 다른 계정에서 학원에서 생성한 연습용 테이블로 했다.

위처럼 출력 되도록 UNION (집합연산자) 사용 , 테이블을 조인해보기
특별히 어려운 문제는 아니지만 2번이 의아하다...
UNION ALL을 써야만 딱 저런 순서로 출력이 된다. 데이터가 중복이 없으니 UNION ALL을 써도 되긴한데,
UNION을 사용하고 ORDER BY로 정렬해버리면 저 화면하고 좀 순서가 달라짐;
테이블 순서를 바꿔서 해봐도 TOTAL이 무조건 맨 위에 출력되서 ㅠ
그리고 3번 ! 두 테이블 중 하나는 무조건 테이블 2개를 조인해야하지만
다른 한 테이블은 조인을 해도 되고, 안 해도 된다.
두 가지 코드 다 올렸다.
테이블 1개 조인 안한거에서, SUM(SAPAY)가 다른 테이블의 SUM(SAPAY)랑 다른거란 거에 주의 ~~
--문제 1번 화면
--1. 부서위치, 부서위치별 토탈월급을 출력하시오 (세로 출력)
--조인을 안하니 토탈: 값이 다 같다. / 조인을 왜 해야하는지 보여주기 위한 코드
SELECT LOC, SUM(SAPAY) AS TOTAL_SPAY
FROM (SELECT LOC FROM DEPT) , SAWON
GROUP BY LOC;
--1번 답
SELECT LOC,SUM(SAPAY) AS TOTAL_SPAY
FROM DEPT D NATURAL JOIN SAWON S
GROUP BY LOC;
--2번 2. 맨 아래에 전체 토탈월급도 출력되게하시오 !
SELECT LOC , SUM(SAPAY) AS TOTAL_SAPAY
FROM DEPT D JOIN SAWON S ON (D.DEPTNO = S.DEPTNO)
GROUP BY LOC
UNION ALL
SELECT 'total' AS LOC, SUM(SUM(SAPAY)) AS TOTAL_SAPAY
FROM DEPT NATURAL JOIN SAWON
GROUP BY LOC;
--3번 3. 위의 결과를 다시 출력하는데 직업을 가나다라 순서데로 정렬해서 출력되게하시오
SELECT LOC, SUM(SAPAY) AS TOTAL_SPAY
FROM DEPT D NATURAL JOIN SAWON S
GROUP BY LOC
UNION
SELECT '전체' AS LOC, SUM(SUM(SAPAY)) AS TOTAL_SPAY
FROM DEPT D NATURAL JOIN SAWON S
GROUP BY LOC
ORDER BY LOC;
-----조금 다르게( 테이블 1개는 조인 사용하지 않고)
SELECT D.LOC, SUM(S.SAPAY) AS TOTAL_SPAY
FROM DEPT D, SAWON S
WHERE D.DEPTNO = S.DEPTNO
GROUP BY D.LOC
UNION
--위의 SUM(S.SAPAY)는 두 테이블이 합쳐진 상태에서 데이터를 뽑아와서 연산하는 거라,
-- 각 LOC별 SUM(S.SAPAY)로 계산이 되고
--아래에서의 SUM(S.SAPAY)는 순수 SAWON테이블의 모든 SAPAY를 합한 것을 뜻함
SELECT '전체' AS LOC, SUM(SAPAY) AS TOTAL_SPAY
FROM SAWON
ORDER BY LOC;