DBMS

[DBMS/Oracle] 집합 연산자

elog 2023. 3. 16. 12:00

[DBMS/Oracle] 집합 연산자
[DBMS/Oracle] 집합 연산자

집합 연산자

  - 여러 쿼리의 결과에 대한 집합연산을 수행
  - 합집합(UNION, UNION ALL), 교집합(INTERSECT), 차집합(MINUS) 결과 반환
  (주의사항)
  - 모든 SELECT절의 컬럼의 수와 타입은 동일해야 함
  - 컬럼의 별칭은 첫 번째 SELECT문의 SELECT절의 것이 사용됨
  - ORDER BY 절은 맨 마지막 SELECT문에서만 사용됨
  - CLOB,BLOB,BFILE타입은 사용 불가

 

1. 합집합

  - UNION ALL : 교집합 부분이 중복 반환되는 반환됨
  - UNION : 중복이 배제된 합집합

 

사용예) 2020년 4월과 5월에 판매된 모든 상품명을 출력하시오.

-- 2020년 4월에 판매된 모든 상품
  SELECT A.CART_PROD AS 상품코드,
         B.PROD_NAME AS 상품명,
         SUM(CART_QTY) AS 판매수량
    FROM CART A, PROD B
   WHERE A.CART_PROD=B.PROD_ID
     AND A.CART_NO LIKE '202004%'
   GROUP BY A.CART_PROD, B.PROD_NAME

-- 2020년 5월에 판매된 모든 상품
  SELECT A.CART_PROD,
         B.PROD_NAME,
         SUM(A.CART_QTY)
    FROM CART A, PROD B
   WHERE A.CART_PROD=B.PROD_ID
     AND A.CART_NO LIKE '202005%'
   GROUP BY A.CART_PROD, B.PROD_NAME
   ORDER BY 1;

-- 2020년 4월에 판매된 모든 상품
  SELECT A.CART_PROD AS 상품코드,
         B.PROD_NAME AS 상품명,
         SUM(CART_QTY) AS 판매수량
    FROM CART A, PROD B
   WHERE A.CART_PROD=B.PROD_ID
     AND A.CART_NO LIKE '202004%'
   GROUP BY A.CART_PROD, B.PROD_NAME
UNION 
-- 2020년 5월에 판매된 모든 상품
  SELECT A.CART_PROD,
         B.PROD_NAME,
         SUM(A.CART_QTY)
    FROM CART A, PROD B
   WHERE A.CART_PROD=B.PROD_ID
     AND A.CART_NO LIKE '202005%'
   GROUP BY A.CART_PROD, B.PROD_NAME
   ORDER BY 1;

 

사용예) 회원테이블에 대전에 거주하는 회원과 직업이 학생인 회원의 회원번호,회원명,직업,거주지,마일리지를 조회하시오.

(조인을 사용한 경우)  
  SELECT A.MEM_ID AS 회원번호,
         A.MEM_NAME AS 회원명,
         A.MEM_JOB AS 직업,
         A.MEM_ADD1 AS 거주지,
         A.MEM_MILEAGE AS 마일리지
    FROM (SELECT *
            FROM MEMBER
           WHERE MEM_ADD1 LIKE '대전%')A,
         (SELECT MEM_ID,MEM_JOB,MEM_ADD1
            FROM MEMBER
           WHERE MEM_JOB='학생')B
   WHERE A.MEM_ID=B.MEM_ID(+);

(UNION 사용)
  SELECT MEM_ID AS 회원번호,
         MEM_NAME AS 회원명,
         MEM_JOB AS 직업,
         MEM_ADD1 AS 거주지,
         MEM_MILEAGE AS 마일리지
    FROM MEMBER
   WHERE MEM_ADD1 LIKE '대전%'
UNION -- 18개, ALL 21개
   SELECT MEM_ID,MEM_NAME,MEM_JOB,MEM_ADD1,MEM_MILEAGE
     FROM MEMBER
    WHERE MEM_JOB='학생'
    ORDER BY 1;

 

2. 교집합

  - 공통으로 포함된 원소만 반환
  - INTERSECT 연산자 사용

 

사용예) 매입테이블에서 1월과 4월에 모두 매입된 상품정보를 조회하시오.
               Alias는 상품코드,상품명,매입단가,매입처

(조인)
  SELECT C.PROD_ID AS 상품코드,
         C.PROD_NAME AS 상품명,
         C.PROD_COST AS 매입단가,
         C.PROD_BUYER AS 매입처
    FROM (SELECT DISTINCT BUY_PROD
            FROM BUYPROD
           WHERE BUY_DATE BETWEEN TO_DATE('20200101') AND TO_DATE('20200131'))A,
        (SELECT DISTINCT BUY_PROD
           FROM BUYPROD
          WHERE BUY_DATE BETWEEN TO_DATE('20200401') AND LAST_DAY(TO_DATE('20200401')))B,
          PROD C
   WHERE C.PROD_ID=A.BUY_PROD
     AND C.PROD_ID=B.BUY_PROD
   ORDER BY 1;

(집합연산자 INTERSECT 사용)    
  SELECT B.PROD_ID,B.PROD_NAME,B.PROD_COST,B.PROD_BUYER
    FROM BUYPROD A, PROD B
   WHERE A.BUY_DATE BETWEEN TO_DATE('20200101') AND TO_DATE('20200131')   
     AND A.BUY_PROD=B.PROD_ID
INTERSECT
  SELECT B.PROD_ID,B.PROD_NAME,B.PROD_COST,B.PROD_BUYER
    FROM BUYPROD A, PROD B
   WHERE A.BUY_DATE BETWEEN TO_DATE('20200401') AND TO_DATE('20200430')   
     AND A.BUY_PROD=B.PROD_ID   
   ORDER BY 1;

 

사용예) 2020년 4월과 5월 매출수량 합계가 10개 이상인 상품정보를 조회하시오.
               Alias는 상품코드,상품명,매출단가

--(2020년 4월 매출수량 합계가 10개 이상인 상품정보-7건)
  SELECT A.CART_PROD AS 상품코드,
         B.PROD_NAME AS 상품명,
         B.PROD_PRICE AS 매출단가
    FROM (SELECT CART_PROD,
                 SUM(CART_QTY)
            FROM CART
           WHERE CART_NO LIKE '202004%'
           GROUP BY CART_PROD
          HAVING SUM(CART_QTY)>=10)A, PROD B
   WHERE A.CART_PROD=B.PROD_ID
INTERSECT
--(2020년 5월 매출수량 합계가 10개 이상인 상품정보-13건)
  SELECT A.CART_PROD AS 상품코드,
         B.PROD_NAME AS 상품명,
         B.PROD_PRICE AS 매출단가
    FROM (SELECT CART_PROD,
                 SUM(CART_QTY)
            FROM CART
           WHERE CART_NO LIKE '202005%'
           GROUP BY CART_PROD
          HAVING SUM(CART_QTY)>=10)A, PROD B
   WHERE A.CART_PROD=B.PROD_ID
   ORDER BY 1;

(ANOTHER SOLUTION)-- 오류
SELECT A.CART_PROD AS 상품코드,
       B.PROD_NAME AS 상품명,
       B.PROD_PRICE AS 매출단가
  FROM (SELECT CART_PROD
          FROM (SELECT CART_PROD,
                       SUM(CART_QTY)
                  FROM CART
                 WHERE CART_NO LIKE '202004%'
                 GROUP BY CART_PROD
                HAVING SUM(CART_QTY)>=10)
        INTERSECT
        SELECT CART_PROD
          FROM (SELECT CART_PROD,
                       SUM(CART_QTY)
                  FROM CART
                 WHERE CART_NO LIKE '202005%'
                 GROUP BY CART_PROD
                HAVING SUM(CART_QTY)>=10))A, PROD B
WHERE A.CART_PROD=B.PROD_ID;

 

3. 차집합

  - MINUS 연산자를 사용하여 특정 결과 집합에만 존재하는 결과 반환

 

사용예) 매입테이블에서 2020년 1월과 4월 중 1월에만 매입된 상품의 상품코드,상품명,매입단가를 구하시오.

--(2020년 1월 매입-39건)
  SELECT A.BUY_PROD AS 상품코드,
         B.PROD_NAME AS 상품명,
         B.PROD_COST AS 매입단가
    FROM BUYPROD A, PROD B
   WHERE A.BUY_PROD=B.PROD_ID
     AND A.BUY_DATE BETWEEN TO_DATE('20200101') AND TO_DATE('20200131')
MINUS
--(2020년 4월 매입-26건)
  SELECT A.BUY_PROD AS 상품코드,
         B.PROD_NAME AS 상품명,
         B.PROD_COST AS 매입단가
    FROM BUYPROD A, PROD B
   WHERE A.BUY_PROD=B.PROD_ID
     AND A.BUY_DATE BETWEEN TO_DATE('20200401') AND TO_DATE('20200430')

 

사용예) 2020년 6월 매입매출 중 매입만 발생된 상품의 상품코드와 상품명을 조회하시오.

-- (2020년 6월 매입-12건)
  SELECT A.BUY_PROD AS 상품코드,
         B.PROD_NAME AS 상품명
    FROM BUYPROD A, PROD B
   WHERE A.BUY_PROD=B.PROD_ID
     AND A.BUY_DATE BETWEEN TO_DATE('20200601') AND TO_DATE('20200630')
MINUS
-- (2020년 6월 매출-18건)
  SELECT A.CART_PROD AS 상품코드,
         B.PROD_NAME AS 상품명
    FROM CART A, PROD B
   WHERE A.CART_PROD=B.PROD_ID
     AND A.CART_NO LIKE '202006%'

'DBMS' 카테고리의 다른 글

[DBMS/Oracle] VIEW 객체  (0) 2023.03.17
[DBMS/Oracle] Window 분석함수  (0) 2023.03.16
[DBMS/Oracle] 서브쿼리(SUBQUERY)  (1) 2023.03.16
[DBMS/Oracle] 조인(JOIN)  (0) 2023.03.16
[DBMS/Oracle] ROLLUP과 CUBE함수  (0) 2023.03.15