ORACLE

OracleStudy / 20220302_01_scott.sql / UNION, UNION ALL 컬럼들을 통합해서 조회, 정규화, 중복제거 DISTINCT()

universedevelope 2022. 7. 3. 10:00
SELECT USER
FROM DUAL;
--==>>SCOTT

-- ■■■ UNION / UNION ALL ■■■ --

-- ○ 실습 테이블 생성(TBL_JUMUN)
CREATE TABLE TBL_JUMUN
( JUNO      NUMBER                  -- 주문번호
, JECODE    VARCHAR2(30)            -- 주문된 제품 코드
, JUSU      NUMBER                  -- 주문수량
, JUDAY     DATE DEFAULT SYSDATE    -- 주문일자
);
--==>> Table TBL_JUMUN이(가) 생성되었습니다.
-->   고객의 주문이 발생(접수)되었을 경우
--    주문 내용에 대한 데이터가 입력될 수 있는 테이블


-- ○ 데이터 입력 → 고객의 주문 발생(접수)
INSERT INTO TBL_JUMUN VALUES
(1, '빼빼로', 20, TO_DATE('2001-11-01 09:10:12', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(2, '거언빵', 10, TO_DATE('2001-11-01 10:20:30', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(3, '모옹쉘', 30, TO_DATE('2001-11-01 11:10:05', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(4, '눈감자', 10, TO_DATE('2001-11-02 13:20:11', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(5, '나아쵸', 20, TO_DATE('2001-11-05 07:30:22', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(6, '홈런볼', 70, TO_DATE('2001-11-06 15:20:34', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(7, '고래밥', 50, TO_DATE('2001-11-07 11:10:13', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(8, '포카칩', 20, TO_DATE('2001-11-07 19:42:53', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(9, '포카칩', 20, TO_DATE('2001-11-08 19:42:53', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(10, '포카칩', 20, TO_DATE('2001-11-09 11:12:23', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(11, '고래밥', 50, TO_DATE('2001-11-10 12:12:23', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(12, '고래밥', 40, TO_DATE('2001-11-11 08:09:10', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(13, '홈런볼', 60, TO_DATE('2001-11-12 09:10:11', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(14, '나아쵸', 20, TO_DATE('2001-11-13 10:11:12', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(15, '홈런볼', 70, TO_DATE('2001-11-14 11:12:13', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(16, '홈런볼', 80, TO_DATE('2001-11-15 12:13:14', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(17, '홈런볼', 90, TO_DATE('2001-11-16 13:14:15', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(18, '빼빼로', 10, TO_DATE('2001-11-17 14:15:16', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(19, '빼빼로', 20, TO_DATE('2001-11-19 15:16:17', 'YYYY-MM-DD HH24:MI:SS'));
INSERT INTO TBL_JUMUN VALUES
(20, '빼빼로', 30, TO_DATE('2001-11-20 16:17:18', 'YYYY-MM-DD HH24:MI:SS'));
--==>> 1 행 이(가) 삽입되었습니다. * 20

-- 날짜에 대한 세션 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==>>1 행 이(가) 삽입되었습니다.

SELECT *
FROM TBL_JUMUN;
/*
1	빼빼로	20	2001-11-01 09:10:12
2	거언빵	10	2001-11-01 10:20:30
3	모옹쉘	30	2001-11-01 11:10:05
4	눈감자	10	2001-11-02 13:20:11
5	나아쵸	20	2001-11-05 07:30:22
6	홈런볼	70	2001-11-06 15:20:34
7	고래밥	50	2001-11-07 11:10:13
8	포카칩	20	2001-11-07 19:42:53
9	포카칩	20	2001-11-08 19:42:53
10	포카칩	20	2001-11-09 11:12:23
11	고래밥	50	2001-11-10 12:12:23
12	고래밥	40	2001-11-11 08:09:10
13	홈런볼	60	2001-11-12 09:10:11
14	나아쵸	20	2001-11-13 10:11:12
15	홈런볼	70	2001-11-14 11:12:13
16	홈런볼	80	2001-11-15 12:13:14
17	홈런볼	90	2001-11-16 13:14:15
18	빼빼로	10	2001-11-17 14:15:16
19	빼빼로	20	2001-11-19 15:16:17
20	빼빼로	30	2001-11-20 16:17:18
*/

--○ 커밋
COMMIT;
--==>> 커밋 완료.

-- ○ 추가 데이터 입력 → 2001년 부터 시작된 주문이 현재(2022년)까지 계속 발생~!
INSERT INTO TBL_JUMUN VALUES(98764, '고래밥', 10, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98765, '빼빼로', 20, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98766, '맛동산', 30, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98767, '홈런볼', 40, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98768, '오감자', 50, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98769, '웨하스', 30, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98770, '고래밥', 20, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98771, '맛동산', 20, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98772, '웨하스', 20, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98773, '빼빼로', 90, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98774, '에이스', 20, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98775, '꼬북칩', 30, SYSDATE);
--==>>1 행 이(가) 삽입되었습니다.

-- ○ 확인
SELECT *
FROM TBL_JUMUN;
/*
    1	빼빼로	20	2001-11-01 09:10:12
    2	거언빵	10	2001-11-01 10:20:30
    3	모옹쉘	30	2001-11-01 11:10:05
    4	눈감자	10	2001-11-02 13:20:11
    5	나아쵸	20	2001-11-05 07:30:22
    6	홈런볼	70	2001-11-06 15:20:34
    7	고래밥	50	2001-11-07 11:10:13
    8	포카칩	20	2001-11-07 19:42:53
    9	포카칩	20	2001-11-08 19:42:53
   10	포카칩	20	2001-11-09 11:12:23
   11	고래밥	50	2001-11-10 12:12:23
   12	고래밥	40	2001-11-11 08:09:10
   13	홈런볼	60	2001-11-12 09:10:11
   14	나아쵸	20	2001-11-13 10:11:12
   15	홈런볼	70	2001-11-14 11:12:13
   16	홈런볼	80	2001-11-15 12:13:14
   17	홈런볼	90	2001-11-16 13:14:15
   18	빼빼로	10	2001-11-17 14:15:16
   19	빼빼로	20	2001-11-19 15:16:17
   20	빼빼로	30	2001-11-20 16:17:18
98764	고래밥	10	2022-03-02 09:30:02
98765	빼빼로	20	2022-03-02 09:30:31
98766	맛동산	30	2022-03-02 09:31:12
98767	홈런볼	40	2022-03-02 09:31:32
98768	오감자	50	2022-03-02 09:32:21
98769	웨하스	30	2022-03-02 09:32:35
98770	고래밥	20	2022-03-02 09:33:09
98771	맛동산	20	2022-03-02 09:33:54
98772	웨하스	20	2022-03-02 09:34:08
98773	빼빼로	90	2022-03-02 09:34:20
98774	에이스	20	2022-03-02 09:34:43
98775	꼬북칩	30	2022-03-02 09:34:58
*/

-- ○ 커밋
COMMIT;
--==>> 커밋 완료.

-- ※ 상기가 과자 쇼핑몰 운영 중....
-- TBL_JUMUN 테이블이 너무 무거워진 상황
-- 어플리케이션과의 연동으로 인해 주문 내역을 다른 테이블에
-- 저장될 수 있도록 만드는 것은 불가능한 상황
-- 기존의 모든 데이터를 덮어놓고 지우는 것도 불가능한 상황
-- → 결과적으로...
--    현재까지 누적된 주문 데이터들 중
--    금일 발생한 주문 내역을 제외하고
--    나머지 데이터를 다른 테이블(TBL_JUMUNBACKUP)로 데이터 이관을 수행할 계획
CREATE TABLE TBL_JUMUNBACKUP
AS
SELECT *
FROM TBL_JUMUN
WHERE TO_CHAR(JUDAY, 'YYYY-MM-DD') != TO_CHAR(SYSDATE, 'YYYY-MM-DD');
--                                          ---------------------
--                                            2022-03-02
--==>> Table TBL_JUMUNBACKUP이(가) 생성되었습니다.
SELECT *
FROM TBL_JUMUNBACKUP;
/*
1	빼빼로	20	2001-11-01 09:10:12
2	거언빵	10	2001-11-01 10:20:30
3	모옹쉘	30	2001-11-01 11:10:05
4	눈감자	10	2001-11-02 13:20:11
5	나아쵸	20	2001-11-05 07:30:22
6	홈런볼	70	2001-11-06 15:20:34
7	고래밥	50	2001-11-07 11:10:13
8	포카칩	20	2001-11-07 19:42:53
9	포카칩	20	2001-11-08 19:42:53
10	포카칩	20	2001-11-09 11:12:23
11	고래밥	50	2001-11-10 12:12:23
12	고래밥	40	2001-11-11 08:09:10
13	홈런볼	60	2001-11-12 09:10:11
14	나아쵸	20	2001-11-13 10:11:12
15	홈런볼	70	2001-11-14 11:12:13
16	홈런볼	80	2001-11-15 12:13:14
17	홈런볼	90	2001-11-16 13:14:15
18	빼빼로	10	2001-11-17 14:15:16
19	빼빼로	20	2001-11-19 15:16:17
20	빼빼로	30	2001-11-20 16:17:18
*/

--> TBL_JUMUN 테이블의 데이터들 중
--  금일 주문 내역 이외의 데이터는 모두 TBL_JUMUNBACKUP 테이블에
--  백업을 마친 상태

-- TBL_JUMUN 테이블의 데이터들 중
-- 백업을 마친 데이터들 삭제 → 즉, 금일 발생한 주문 내역이 아닌 데이터들 제거


DELETE
FROM TBL_JUMUN
WHERE TO_CHAR(JUDAY, 'YYYY-MM-DD') != TO_CHAR(SYSDATE, 'YYYY-MM-DD');
--==>> 20개 행 이(가) 삭제되었습니다.

SELECT *
FROM TBL_JUMUN;
/*
98764	고래밥	10	2022-03-02 09:30:02
98765	빼빼로	20	2022-03-02 09:30:31
98766	맛동산	30	2022-03-02 09:31:12
98767	홈런볼	40	2022-03-02 09:31:32
98768	오감자	50	2022-03-02 09:32:21
98769	웨하스	30	2022-03-02 09:32:35
98770	고래밥	20	2022-03-02 09:33:09
98771	맛동산	20	2022-03-02 09:33:54
98772	웨하스	20	2022-03-02 09:34:08
98773	빼빼로	90	2022-03-02 09:34:20
98774	에이스	20	2022-03-02 09:34:43
98775	꼬북칩	30	2022-03-02 09:34:58
*/

-- ○ 커밋
COMMIT;
--==>> 커밋 완료.

-- ※ 아직 제품 발송이 이루어지지않은 금일 주문 데이터를 제외하고
--    이전의 모든 주문 데이터들이 삭제된 상황이므로
--    테이블은 행(레코드)의 갯수가 줄어들어 매우 가벼워진 상황이다.

-- ○ UNION 사용.. 나눠진 테이블을 한번에조회하기
SELECT *
FROM TBL_JUMUNBACKUP
UNION
SELECT *
FROM TBL_JUMUN;

-- 그런데, 지금까지 주문받은 내역에 대한 정보를
-- 제품별 총 주문량으로 나타내어야 할 상황이 발생하게 되었다.
-- 그렇다면,TBL_JUMUNBACKUP 테이블의 레코드(행)와
-- TBL_JUMUN 테이블의 레코드(행)을 합쳐서
-- 하나의 테이블을 조회하는 것과 같은 결과를 확인할 수 있도록
-- 조회가 이루어져야 한다.

-- ※ 컬럼과 컬럼의 관계를 고려하여 테이블을 결합하고자 하는 경우
--    JOIN 을 사용하지만
--    레코드와 레코드를 결합하고자 하는 경우
--    UNION / UNION ALL 을 사용할 수 있다.
SELECT *
FROM TBL_JUMUN
UNION
SELECT *
FROM TBL_JUMUNBACKUP;

SELECT *
FROM TBL_JUMUN
UNION ALL
SELECT *
FROM TBL_JUMUNBACKUP;

SELECT *
FROM TBL_JUMUNBACKUP
UNION ALL
SELECT *
FROM TBL_JUMUN;

SELECT *
FROM TBL_JUMUNBACKUP
UNION
SELECT *
FROM TBL_JUMUN;

-- ※ UNION 은 항상 결과물의 첫 번째 컬럼을 기준으로
--    오름차순 정렬을 수행한다.
--    UNION ALL은 결합된 순서대로(테이블을 쿼리문에서 명시한 순서대로)
--    조회한 결과를 반환한다.(즉, 정렬 기능 없음)
--    이로 인해 UNION이 부하가 더 크다.(리소스 소모가 더 크다.)
--    또한, UNION은 결과물에 중복된 행이 존재할 경우
--    중복을 제거하고 1개 행만 조회된 결과를 반환하게 한다.

-- ○ 지금까지 주문받은 데이터를 통해
--    제품별 총 주문량을 조회할 수 있는 쿼리문을 구성한다.
SELECT T.제품명, SUM(T.주문량) "주문량합계"
FROM
(
SELECT JECODE "제품명", SUM(JUSU) "주문량"
FROM TBL_JUMUN
GROUP BY JECODE
UNION ALL
SELECT JECODE "제품명", SUM(JUSU) "주문량"
FROM TBL_JUMUNBACKUP
GROUP BY JECODE
)T
GROUP BY T.제품명
ORDER BY 1,2;
/*
거언빵	10
고래밥	170
꼬북칩	30
나아쵸	40
눈감자	10
맛동산	50
모옹쉘	30
빼빼로	190
에이스	20
오감자	50
웨하스	50
포카칩	60
홈런볼	410
*/

-- ○ 데이터 추가 입력
INSERT INTO TBL_JUMUN VALUES (98776, '모옹쉘', 30, SYSDATE);
--==>> 1 행 이(가) 삽입되었습니다.

-- ○ 확인
SELECT *
FROM TBL_JUMUN;
--==>>
/*
98764	고래밥	10	2022-03-02 09:30:02
98765	빼빼로	20	2022-03-02 09:30:31
98766	맛동산	30	2022-03-02 09:31:12
98767	홈런볼	40	2022-03-02 09:31:32
98768	오감자	50	2022-03-02 09:32:21
98769	웨하스	30	2022-03-02 09:32:35
98770	고래밥	20	2022-03-02 09:33:09
98771	맛동산	20	2022-03-02 09:33:54
98772	웨하스	20	2022-03-02 09:34:08
98773	빼빼로	90	2022-03-02 09:34:20
98774	에이스	20	2022-03-02 09:34:43
98775	꼬북칩	30	2022-03-02 09:34:58
98776	모옹쉘	30	2022-03-02 11:28:15
*/

-- ○ 커밋
COMMIT;
--==>> 커밋 완료.

-- ○ INTERSECT / MINUS (→ 교집합과 차집합)

-- TBL_JUMUNBACKUP 테이블과 TBL_JUMUN 테이블에서
-- 제품코드와 주문수량의 값이 똑같은 행만 추출하고자 한다.

SELECT JECODE, JUSU
FROM TBL_JUMUNBACKUP
INTERSECT
SELECT JECODE, JUSU
FROM TBL_JUMUN;
--==>>
/*
모옹쉘	30
빼빼로	20
*/
SELECT *
FROM TBL_JUMUN;

-- ○ TBL_JUMUNBACKUP 테이블과 TBL_JUMUN 테이블을 대상으로
--    제품코드와 주문량의 값이 똑같은 행의 정보를
--    주문번호, 제품코드, 주문량, 주문일자 항목으로 조회한다.

-- ① 인터넷 검색
--    엄청게 난해한 서브상관커리
SELECT S.JUNO, S.JECODE, S.JUSU, S.JUDAY
FROM
(
    SELECT  T.JUNO
          , T.JECODE
          , T.JUSU
          , T.JUDAY
          , (SELECT COUNT(*)
             FROM (SELECT JECODE, JUSU
                   FROM TBL_JUMUNBACKUP
                   INTERSECT
                   SELECT JECODE, JUSU
                   FROM TBL_JUMUN)A
             WHERE T.JECODE = A.JECODE AND T.JUSU = A.JUSU) "SAME_JECODE_JUSU" 
     FROM (SELECT *
           FROM TBL_JUMUNBACKUP
           UNION ALL
           SELECT *
           FROM TBL_JUMUN
          )T
)S
WHERE S.SAME_JECODE_JUSU=1;
/*
    1	빼빼로	20	2001-11-01 09:10:12
    3	모옹쉘	30	2001-11-01 11:10:05
   19	빼빼로	20	2001-11-19 15:16:17
   20	빼빼로	30	2001-11-20 16:17:18
98781	빼빼로	30	2022-03-02 14:13:46
98765	빼빼로	20	2022-03-02 09:30:31
98776	모옹쉘	30	2022-03-02 11:28:15
*/
-- ② 간단한 EQUI JOIN 
--    인터섹트와 유니온을 조인시키기
SELECT T1.JUNO "제품번호", T1.JECODE "제품코드", T1.JUSU "주문수량", T1.JUDAY "주문일자"
FROM 
(SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUNBACKUP
 UNION ALL
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUN
) T1 
 JOIN
(SELECT JECODE, JUSU
 FROM TBL_JUMUNBACKUP
 INTERSECT
 SELECT JECODE, JUSU
 FROM TBL_JUMUN
) T2
ON T1.JECODE = T2.JECODE AND T1.JUSU = T2.JUSU;
/*
    1	빼빼로	20	2001-11-01 09:10:12
    3	모옹쉘	30	2001-11-01 11:10:05
   19	빼빼로	20	2001-11-19 15:16:17
   20	빼빼로	30	2001-11-20 16:17:18
98781	빼빼로	30	2022-03-02 14:13:46
98765	빼빼로	20	2022-03-02 09:30:31
98776	모옹쉘	30	2022-03-02 11:28:15
*/
-- ③ WHERE 절을 이용한 조건식 조회
--    2개의 컬럼을 묶어 CONCAT으로 확인하면
--    가능.. 여러개는 아마 CONCAT(CONCAT 해야할듯)
SELECT *
FROM 
(
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUNBACKUP
 UNION ALL
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUN
)T
WHERE CONCAT(JECODE, JUSU) = ANY 
                             (
                              SELECT CONCAT(JECODE, JUSU)
                              FROM TBL_JUMUNBACKUP
                              INTERSECT
                              SELECT CONCAT(JECODE, JUSU)
                              FROM TBL_JUMUN
                             );
/*
    1	빼빼로	20	2001-11-01 09:10:12
    3	모옹쉘	30	2001-11-01 11:10:05
   19	빼빼로	20	2001-11-19 15:16:17
   20	빼빼로	30	2001-11-20 16:17:18
98781	빼빼로	30	2022-03-02 14:13:46
98765	빼빼로	20	2022-03-02 09:30:31
98776	모옹쉘	30	2022-03-02 11:28:15
*/                             


-- ○ 데이터 추가 입력
INSERT INTO TBL_JUMUN VALUES(98777, '모옹쉘', 10, SYSDATE);
--==>> 1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98778, '빼배로', 40, SYSDATE);
--==>> 1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98779, '맛동산', 20, SYSDATE);
--==>> 1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98780, '모옹쉘', 20, SYSDATE);
--==>> 1 행 이(가) 삽입되었습니다.
INSERT INTO TBL_JUMUN VALUES(98781, '빼빼로', 30, SYSDATE);

-- ○ 확인
SELECT *
FROM TBL_JUMUN;
/*
98777	모옹쉘	10	2022-03-02 14:08:11
98778	빼배로	40	2022-03-02 14:08:48
98779	맛동산	20	2022-03-02 14:09:15
98780	모옹쉘	20	2022-03-02 14:13:46
98781	빼빼로	30	2022-03-02 14:13:46
98764	고래밥	10	2022-03-02 09:30:02
98765	빼빼로	20	2022-03-02 09:30:31
98766	맛동산	30	2022-03-02 09:31:12
98767	홈런볼	40	2022-03-02 09:31:32
98768	오감자	50	2022-03-02 09:32:21
98769	웨하스	30	2022-03-02 09:32:35
98770	고래밥	20	2022-03-02 09:33:09
98771	맛동산	20	2022-03-02 09:33:54
98772	웨하스	20	2022-03-02 09:34:08
98773	빼빼로	90	2022-03-02 09:34:20
98774	에이스	20	2022-03-02 09:34:43
98775	꼬북칩	30	2022-03-02 09:34:58
98776	모옹쉘	30	2022-03-02 11:28:15
*/

-- ○ 커밋
COMMIT;
--==>> 커밋 완료.

SELECT *
FROM 
(
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUNBACKUP
 UNION ALL
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUN
)T
WHERE JECODE IN('모옹쉘', '빼빼로')
      AND JUSU IN(20, 30);

--------------------------------------------------------------------------------
-- ♧ TBL_JUMUN_scott 파일을 통해 데이터 갱신 ♣ --
--------------------------------------------------------------------------------

-- ○ INTERSECT 확인
SELECT JECODE, JUSU
FROM TBL_JUMUN
INTERSECT
SELECT JECODE, JUSU
FROM TBL_JUMUNBACKUP;
/*
모옹쉘	30
빼빼로	20
빼빼로	30
*/

-- 방법 1. JOIN하기

SELECT T1.JUNO "제품번호", T1.JECODE "제품코드", T1.JUSU "주문수량", T1.JUDAY "주문일자"
FROM 
(SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUNBACKUP
 UNION ALL
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUN
) T1 
 JOIN
(SELECT JECODE, JUSU
 FROM TBL_JUMUNBACKUP
 INTERSECT
 SELECT JECODE, JUSU
 FROM TBL_JUMUN
) T2
ON T1.JECODE = T2.JECODE AND T1.JUSU = T2.JUSU;
/*
    1	빼빼로	20	2001-11-01 09:10:12
    3	모옹쉘	30	2001-11-01 11:10:05
   19	빼빼로	20	2001-11-19 15:16:17
   20	빼빼로	30	2001-11-20 16:17:18
98781	빼빼로	30	2022-03-02 14:13:47
98765	빼빼로	20	2022-03-02 09:30:30
98776	모옹쉘	30	2022-03-02 11:28:12
*/

-- 방법 2. WHERE 절 이용
SELECT *
FROM 
(
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUNBACKUP
 UNION ALL
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUN
)T
WHERE CONCAT (T.JECODE, T.JUSU) IN ('모옹쉘30', '빼빼로20', '빼빼로30');
/*
    1	빼빼로	20	2001-11-01 09:10:12
    3	모옹쉘	30	2001-11-01 11:10:05
   19	빼빼로	20	2001-11-19 15:16:17
   20	빼빼로	30	2001-11-20 16:17:18
98780	모옹쉘	20	2022-03-02 14:13:43 ◀ CHECK ~!! 왜 나왔을까? 교집합이아닌데
98781	빼빼로	30	2022-03-02 14:13:47
98765	빼빼로	20	2022-03-02 09:30:30
98776	모옹쉘	30	2022-03-02 11:28:12
*/

-- ↓↓↓↓
/*
    1	빼빼로	20	2001-11-01 09:10:12
    3	모옹쉘	30	2001-11-01 11:10:05
   19	빼빼로	20	2001-11-19 15:16:17
   20	빼빼로	30	2001-11-20 16:17:18
98781	빼빼로	30	2022-03-02 14:13:47
98765	빼빼로	20	2022-03-02 09:30:30
98776	모옹쉘	30	2022-03-02 11:28:12
*/
-- ↓↓↓↓↓
SELECT *
FROM 
(
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUNBACKUP
 UNION ALL
 SELECT JUNO, JECODE, JUSU, JUDAY
 FROM TBL_JUMUN
)T
WHERE CONCAT (T.JECODE, T.JUSU) 
      IN ( 
            SELECT CONCAT(JECODE, JUSU) 
            FROM TBL_JUMUN
            INTERSECT
            SELECT CONCAT(JECODE, JUSU)
            FROM TBL_JUMUNBACKUP          
         );
/*
    1	빼빼로	20	2001-11-01 09:10:12
    3	모옹쉘	30	2001-11-01 11:10:05
   19	빼빼로	20	2001-11-19 15:16:17
   20	빼빼로	30	2001-11-20 16:17:18
98781	빼빼로	30	2022-03-02 14:13:47
98765	빼빼로	20	2022-03-02 09:30:30
98776	모옹쉘	30	2022-03-02 11:28:12
*/

--------------------------------------------------------------------------------


--- ○ TBL_EMP 테이블에서 급여가 가장 많은 사원의
---   사원번호, 사원명, 직종명, 급여 항목을 조회하는 쿼리문을 작성한다.
SELECT *
FROM
(
SELECT EMPNO, ENAME, JOB, SAL + NVL(COMM, 0) "급여"
FROM TBL_EMP
)T
WHERE T.급여 = ( SELECT MAX(SAL+NVL(COMM, 0))
                 FROM TBL_EMP
               );
--==>> 7839	KING	PRESIDENT	5000

SELECT *
FROM
(
SELECT EMPNO, ENAME, JOB, SAL + NVL(COMM, 0) "급여"
FROM TBL_EMP
)T
WHERE T.급여 >= ALL(800, 1600, 1250, 2975, 1250, 2850, 2450, 3000, 5000
                    , 950, 3000, 1300, 1500, 2000, 1700, 2500, 1000);
--==>> 7839	KING	PRESIDENT	5000

SELECT *
FROM
(
SELECT EMPNO, ENAME, JOB, SAL + NVL(COMM, 0) "급여"
FROM TBL_EMP
)T
WHERE T.급여 >= ALL(SELECT  SAL+(NVL(COMM, 0))
                    FROM TBL_EMP);
--==>>  7839	KING	PRESIDENT	5000          


-- ○ TBL_EMP 테이블에서 20번 부서에근무하는 사원 중
--    급여가 가장 많은 사원의
--    사원번호, 사원명, 직종명, 급여 항목을 조회하는 쿼리문을 구성한다.

SELECT EMPNO 사원번호, ENAME 사원명, JOB 직종명, SAL 급여
FROM TBL_EMP
WHERE DEPTNO = 20 AND SAL >= ALL( SELECT SAL
                                  FROM TBL_EMP
                                  WHERE DEPTNO = 20);
/*
7902	FORD	ANALYST	3000
7788	SCOTT	ANALYST	3000
*/

-- ○  TBL_EMP 테이블에서 수당(커미션:COMM) 이 가장 많은 사원의
--     사원번호, 사원명, 부서번호, 직종명, 커미션 항목을 조회한다.

SELECT EMPNO "사원번호"
     , ENAME "사원명", DEPTNO "부서번호"
     , JOB "직종명", NVL(COMM, 0) "커미션"
FROM TBL_EMP
WHERE NVL(COMM, 0) > = ( SELECT MAX(NVL(COMM, 0))
                         FROM TBL_EMP);
--==>> 7654	MARTIN	30	SALESMAN	1400                         

SELECT EMPNO "사원번호"
     , ENAME "사원명", DEPTNO "부서번호"
     , JOB "직종명", NVL(COMM, 0) "커미션"
FROM TBL_EMP
WHERE NVL(COMM, 0) > = ALL( SELECT (NVL(COMM, 0))
                            FROM TBL_EMP);
--==>> 7654	MARTIN	30	SALESMAN	1400   
-- ※ 참고 : NULL 이 연산에 포함되면 비교 데이터 안뜬다.
                            
SELECT EMPNO "사원번호"
     , ENAME "사원명", DEPTNO "부서번호"
     , JOB "직종명", NVL(COMM, 0) "커미션"
FROM TBL_EMP
WHERE COMM >= ALL(SELECT COMM
                  FROM TBL_EMP
                  WHERE COMM IS NOT NULL)
--==>> 7654	MARTIN	30	SALESMAN	1400                

-- ○ DISTINCT() 중복 행(레코드)을 제거하는 함수
SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE EMPNO = (관리자로 등록된 번호);

SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE EMPNO IN (SELECT MGR
               FROM EMP);
               
SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE EMPNO IN (7902, 7698, 7698, 7839, 7698, 7839, 
                7839, 7566, null, 7698, 7788, 7698, 7566, 7782);               
               
SELECT EMPNO, ENAME, JOB
FROM EMP
WHERE EMPNO IN (SELECT DISTINCT(MGR)
                FROM EMP);      
/*
7566	JONES	MANAGER
7698	BLAKE	MANAGER
7782	CLARK	MANAGER
7788	SCOTT	ANALYST
7839	KING	PRESIDENT
7902	FORD	ANALYST
*/          

SELECT DISTINCT(JOB)
FROM EMP;
/*
CLERK
SALESMAN
PRESIDENT
MANAGER
ANALYST
*/    
--------------------------------------------------------------------------------
-- ※ JOIN 추가 → NATURAL JOIN
SELECT D.DEPTNO, D.DNAME, E.ENAME, E.SAL
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
/*
10	ACCOUNTING	CLARK	2450
10	ACCOUNTING	KING	5000
10	ACCOUNTING	MILLER	1300
20	RESEARCH	JONES	2975
20	RESEARCH	FORD	3000
20	RESEARCH	ADAMS	1100
20	RESEARCH	SMITH	800
20	RESEARCH	SCOTT	3000
30	SALES	    WARD	1250
30	SALES	    TURNER	1500
30	SALES   	ALLEN	1600
30	SALES	    JAMES	950
30	SALES	    BLAKE	2850
30	SALES	    MARTIN	1250
*/

SELECT DEPTNO, DNAME, ENAME, SAL
FROM EMP JOIN DEPT;
--==>> 에러 발생
--     ORA-00905: missing keyword  

SELECT DEPTNO, DNAME, ENAME, SAL
FROM EMP NATURAL JOIN DEPT;
/*
10	ACCOUNTING	CLARK	2450
10	ACCOUNTING	KING	5000
10	ACCOUNTING	MILLER	1300
20	RESEARCH	JONES	2975
20	RESEARCH	FORD	3000
20	RESEARCH	ADAMS	1100
20	RESEARCH	SMITH	800
20	RESEARCH	SCOTT	3000
30	SALES	    WARD	1250
30	SALES	    TURNER	1500
30	SALES	    ALLEN	1600
30	SALES	    JAMES	950
30	SALES	    BLAKE	2850
30	SALES	    MARTIN	1250
*/

SELECT DEPTNO, DNAME, ENAME, SAL
FROM EMP JOIN DEPT
USING(DEPTNO);
/*
10	ACCOUNTING	CLARK	2450
10	ACCOUNTING	KING	5000
10	ACCOUNTING	MILLER	1300
20	RESEARCH	JONES	2975
20	RESEARCH	FORD	3000
20	RESEARCH	ADAMS	1100
20	RESEARCH	SMITH	800
20	RESEARCH	SCOTT	3000
30	SALES	    WARD	1250
30	SALES	    TURNER	1500
30	SALES	    ALLEN	1600
30	SALES	    JAMES	950
30	SALES	    BLAKE	2850
30	SALES	    MARTIN	1250
*/

-- ○ 날짜에 대한 세션 설정 변경
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--==>> Session이(가) 변경되었습니다.

-- ○ TBL_SAWON 테이블 백업(데이터 위주) → 각 테이블 간의 관계나 제약조건 등은 제외
CREATE TABLE TBL_SAWONBACKUP
AS
SELECT SANO, SANAME, JUBUN, HIREDATE, SAL
FROM TBL_SAWON;
--==>> Table TBL_SAWONBACKUP이(가) 생성되었습니다.
/*
1017	이호석	9611121234567	2022-02-23	5000
1018	신시은	9910312234567	2022-02-23	6000
1001	김민성	9707251234567	2005-01-03	3000
1002	서민지	9505152234567	1999-11-23	4000
1003	이지연	9905192234567	2006-08-10	3000
1004	이연주	9508162234567	2007-10-10	4000
1005	오이삭	9805161234567	2007-10-10	4000
1006	이현이	8005132234567	1999-10-10	1000
1007	박한이	0204053234567	2010-10-10	1000
1008	선동렬	6803171234567	1998-10-10	1500
1009	선우용녀6912232234567	1998-10-10	1300
1010	선우선	0303044234567	2010-10-10	1600
1011	남주혁	0506073234567	2012-10-10	2600
1012	남궁민	0208073234567	2012-10-10	2600
1013	남진	6712121234567	1998-10-10	2200
1014	홍수민	0005044234567	2015-10-10	5200
1015	임소민	9711232234567	2007-10-10	5500
1016	이이경	0603194234567	2015-01-20	1500
*/

-- ○  데이터 활용.. 관리.. 여러 형태로 운용..
-- ○  데이터 수정

-- 데이터 복원 (UPDATE) → 불완전 복구
728x90