ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 008. UNION / UNION ALL, INTERSECT / MINUS, NATURAL JOIN, USING
    SsY/Class 2023. 3. 31. 17:48
    728x90

    2023.3.31 (금)

    SCOTT 계정 실습
    • .UNION / UNION ALL 
    • 예제 풀이
    --○ 지금까지 주문받은 모든 데이터를 활용하여
    --   제품별 총 주문량을 조회하는 쿼리문을 구성한다.
    /*
    ----------------------------
        제품코드    주문량
    ----------------------------
        ....            XX
        ...            XXX
                :
    ----------------------------
    */
    
    SELECT JECODE "제품코드",SUM(JUSU) "총주문량"
    FROM 
    (
        SELECT JECODE, JUSU
        FROM TBL_JUMUNBACKUP
        UNION ALL
        SELECT JECODE, JUSU
        FROM TBL_JUMUN
    ) T
    GROUP BY T.JECODE;
    --==>>
    /*
    초코파이	20
    도리토스	30
    꼬북칩	    10
    새우깡	    20
    쿠크다스	50
    포테토칩	20
    오감자	    26
    포카칩	    50
    홈런볼	   140
    빼빼로	    30
    칸쵸	    50
    */
    
    SELECT JECODE "제품코드",SUM(JUSU) "총주문량"
    FROM 
    (
        SELECT JECODE, JUSU
        FROM TBL_JUMUNBACKUP
        UNION
        SELECT JECODE, JUSU
        FROM TBL_JUMUN
    ) T
    GROUP BY T.JECODE;
    
    --> 이 문제를 해결하는 과정에서는 UNION 을 사용해서는 안된다.
    --  →JECODE 와 JESU 를 조회하는 과정에서 중복된 행을 제거하는 상황이 발생.

    • INTERSECT / MINUS (→ 교집합 / 차집합)
    • INTERSECT (교집합)
    SELECT JECODE, JUSU
    FROM TBL_JUMUNBACKUP
    INTERSECT
    SELECT JECODE, JUSU
    FROM TBL_JUMUN;
    --==>> // 주문백업 테이블에도 10개짜리 새우깡이 있고 주문 테이블에도 10개짜리 새우깡이 있다...
    /*
    새우깡	10
    칸쵸	20
    포카칩	20
    홈런볼	40
    */

    • MINUS (차집합)
    SELECT JECODE, JUSU
    FROM TBL_JUMUNBACKUP
    MINUS
    SELECT JECODE, JUSU
    FROM TBL_JUMUN;
    --==>> // INTERSECT 를 제외한 나머지 부분 ...
    /*
    도리토스	30
    빼빼로	    30
    오감자	    12
    초코파이	20
    쿠크다스	30
    포테토칩	20
    */

    --○ TBL_JUMUNBACKUP 테이블과 TBL_JUMUN 테이블에서
    --   제품코드와 주문량의 값이 똑같은 행의 정보를
    --   주문번호, 제품코드, 주문수량, 주문일자 항목으로 조회한다.
    더보기
    SELECT JUNO "주문번호", JECODE "제품코드", JUSU"주문수량", JUDAY "주문일자"
    FROM TBL_JUMUN;
    
    SELECT B.JUNO "주문번호", T.JECODE "제품코드", T.JUSU"주문량", B.JUDAY "주문일자"
    FROM 
    (
        SELECT JECODE, JUSU
        FROM TBL_JUMUNBACKUP
        INTERSECT
        SELECT JECODE, JUSU
        FROM TBL_JUMUN
    ) T , TBL_JUMUNBACKUP B
    WHERE T.JECODE = B.JECODE(+)
      AND T.JUSU = B.JUSU(+)
    UNION ALL
    SELECT J.JUNO "주문번호",  T.JECODE "제품코드", T.JUSU"주문량", J.JUDAY "주문일자"
    FROM 
    (
        SELECT JECODE, JUSU
        FROM TBL_JUMUNBACKUP
        INTERSECT
        SELECT JECODE, JUSU
        FROM TBL_JUMUN
    ) T , TBL_JUMUN J
    WHERE T.JECODE = J.JECODE(+)
      AND T.JUSU = J.JUSU(+);
    
    -- 희정언니 코드
    SELECT  U.JUNO "주문번호", I.JECODE "제품코드", I.JUSU "주문량", U.JUDAY "주문일자"
    FROM
    (
        SELECT JUNO, JECODE, JUSU, JUDAY
        FROM TBL_JUMUNBACKUP
        UNION ALL
        SELECT JUNO, JECODE, JUSU, JUDAY
        FROM TBL_JUMUN 
    ) U ,
    (
        SELECT JECODE, JUSU
        FROM TBL_JUMUNBACKUP
        INTERSECT
        SELECT JECODE, JUSU
        FROM TBL_JUMUN
    ) I
    WHERE I.JECODE = U.JECODE
      AND I.JUSU = U.JUSU
    ORDER BY 2,4;
    --방법1
    SELECT JECODE, JUSU
    FROM TBL_JUMUNBACKUP
    INTERSECT
    SELECT JECODE, JUSU
    FROM TBL_JUMUN;
    --==>> 
    /*
    새우깡	10
    칸쵸	20
    포카칩	20
    홈런볼	40
    */
    --------------------------------------------------------------------------------------
    SELECT JUNO,JECODE,JUSU,JUDAY
    FROM TBL_JUMUNBACKUP
    INTERSECT
    SELECT JUNO,JECODE,JUSU,JUDAY
    FROM TBL_JUMUN;
    --==>> 조회결과 없음
    --// 네개의 항목이 모두 일치하는 코드를 찾아서 조회하겠다 라는 의미로 변질됨
    --------------------------------------------------------------------------------------
    SELECT T2.JUNO "주문번호",T1.JECODE "제품코드", T1.JUSU "주문수량", T2.JUDAY "주문일자"
    FROM
    (
        SELECT JECODE, JUSU
        FROM TBL_JUMUNBACKUP
        INTERSECT
        SELECT JECODE, JUSU
        FROM TBL_JUMUN
    ) T1
    JOIN
    (
        SELECT JUNO,JECODE,JUSU,JUDAY
        FROM TBL_JUMUNBACKUP
        UNION ALL
        SELECT JUNO,JECODE,JUSU,JUDAY
        FROM TBL_JUMUN
    ) T2
    ON T1.JECODE = T2.JECODE
    AND T1.JUSU = T2.JUSU;
    --==>>
    /*
    2	새우깡	10	2001-10-01 10:05:10
    6	홈런볼	40	2001-10-03 10:05:10
    8	칸쵸	20	2001-10-05 11:05:10
    9	포카칩	20	2001-10-06 15:05:10
    938767	칸쵸	20	2023-03-30 16:32:59
    938771	홈런볼	40	2023-03-30 16:34:15
    938772	새우깡	10	2023-03-30 16:34:38
    938776	포카칩	20	2023-03-30 16:36:23
    */
    --방법2
    
    SELECT *
    FROM
    (
        SELECT JUNO,JECODE,JUSU,JUDAY
        FROM TBL_JUMUNBACKUP
        UNION ALL
        SELECT JUNO,JECODE,JUSU,JUDAY
        FROM TBL_JUMUN
    ) T
    WHERE T.JECODE IN ('새우깡','홈런볼','칸쵸','포카칩')
      AND T.JUSU IN (10,20,40);
    --> // 조건절에 논리적인 허점이 있기때문에 안 됨
    
    
    SELECT *
    FROM
    (
        SELECT JUNO,JECODE,JUSU,JUDAY
        FROM TBL_JUMUNBACKUP
        UNION ALL
        SELECT JUNO,JECODE,JUSU,JUDAY
        FROM TBL_JUMUN
    ) T
    --WHERE JECODE||JUSU IN ('새우깡10','홈런볼40','칸쵸20','포카칩20', '새우깡10','홈런볼40','칸쵸20','포카칩20');
    --WHERE CONCAT (JECODE, JUSU) IN DISTINCT('새우깡10','홈런볼40','칸쵸20','포카칩20', '새우깡10','홈런볼40','칸쵸20','포카칩20');
    --WHERE CONCAT (JECODE, JUSU) IN ('새우깡10','홈런볼40','칸쵸20','포카칩20');
    WHERE CONCAT (JECODE, JUSU) =ANY ('새우깡10','홈런볼40','칸쵸20','포카칩20');
    --// 위의 네 줄은 동일한 구문임 // 그러나 찾는 걸 너무 직접 찾아서 넣었다...
    
    
    SELECT CONCAT (JECODE, JUSU)
    FROM TBL_JUMUNBACKUP
    INTERSECT
    SELECT CONCAT (JECODE, JUSU)
    FROM TBL_JUMUN;
    --==>>
    /*
    새우깡10
    칸쵸20
    포카칩20
    홈런볼40
    */
    
    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);
    --// 서브쿼리 형태로 집어넣어서 조회 가능
    --==>>
    /*
         2	새우깡	10	2001-10-01 10:05:10
         6	홈런볼	40	2001-10-03 10:05:10
         8	칸쵸	20	2001-10-05 11:05:10
         9	포카칩	20	2001-10-06 15:05:10
    938767	칸쵸	20	2023-03-30 16:32:59
    938771	홈런볼	40	2023-03-30 16:34:15
    938772	새우깡	10	2023-03-30 16:34:38
    938776	포카칩	20	2023-03-30 16:36:23
    */

    동일환경 만들기
    더보기
    --환경체크 통일
    
    DESC TBL_JUMUN;
    --==>>
    /*
    이름     널? 유형           
    ------ -- ------------ 
    JUNO      NUMBER       
    JECODE    VARCHAR2(30) 
    JUSU      NUMBER       
    JUDAY     DATE 
    */
    SELECT COUNT(*)
    FROM TBL_JUMUN;
    --==>> 12
    
    SELECT COUNT(*)
    FROM TBL_JUMUNBACKUP;
    --==>> 10

    • 참조용
    • NATURAL JOIN
    SELECT D.DEPTNO, D.DNAME, E.ENAME, E.SAL
    FROM EMP E JOIN DEPT D
    ON E.DEPTNO = D.DEPTNO;
    --// -------------------- 연결고리 컬럼
    
    SELECT DEPTNO, DNAME, ENAME, SAL
    FROM EMP NATURAL JOIN DEPT;
    --==>> // 두개의 테이블에서 관계를 맺는 컬럼이 "하.나"일 때, 오라클에게 찾아달라고 하는 JOIN + ON 조건을 붙이지 않아도 됨. // 하지만 성능이 너무 떨어지게 됨
    --     // 바람직하지는 않지만, 잠깐 확인하나 해보는 용도로 사용하는 것 정도는 괜찮음 
    /*
    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
    */
    • USING 문
    SELECT DEPTNO, DNAME, ENAME, SAL
    FROM EMP JOIN DEPT
    USING(DEPTNO);
    --==>> // USING 문 // 많이 활용하기보다는 참조용으로 생각
    --                 // USING() 안에 들어있는 컬럼을 사용해서 JOIN 을 해달라는 의미
    /*
    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
    */

    (과제 : 95 + α 제 풀기)

    728x90
Designed by planet-si