-- 모든 거래처의 2020년도 거래처별 매입금액 합계를 조회
SELECT A.BUYER_ID AS "거래처코드"
, A.BUYER_NAME AS "거래처명"
, NVL(B.IN_AMT, 0) AS "매입금액합계" --NULL값이면 0으로 바꿈
FROM (SELECT DISTINCT BUYER_ID , BUYER_NAME FROM BUYER) A,
( SELECT BUYER_ID , BUYER_NAME, SUM( BUY_COST * BUY_QTY) IN_AMT
FROM BUYPROD, BUYER, PROD
WHERE BUY_DATE BETWEEN '2020-01-01' AND '2020-12-31'
AND BUY_PROD = PROD_ID
AND BUYER_ID = PROD_BUYER
GROUP BY BUYER_ID, BUYER_NAME
ORDER BY BUYER_ID ASC ) B
WHERE A.BUYER_ID = B.BUYER_ID(+)
ORDER BY A.BUYER_NAME;
1) From절의 A는 거래처테이블의 자료 중 거래처코드와 거래처명
2) B는 거래처별 매입 총액
3) 거래처코드로 JOIN 해당거래처의 매입 총액 READ
4) BUYER(거래처)테이블과 BUYPROD(입고상품)테이블은 참조관계가 아니므로 OUTER JOIN 안됨
ANY, ALL 은 비교 연산자와 조합된다.( =, <>, >, >=, <, <= )
ANY(SOME)는 OR의 개념, 만족하는 값 하나만 있으면 TRUE - IN과 동일
ALL은 AND의 개념, 모든 값 만족해야만 TRUE
비교 연산자 다음에 ANY(>-최소값/<-최대값) 또는 ALL(>-최대값/<-최소값)을 기술하고 서브쿼리 사용
EXISTS
: 서브쿼리에 데이터가 존재하는지 체크
: TRUE / FALSE 로 반환되기 때문에 CASE 표현식 조건으로 사용 가능
NOT EXISTS
=> EXISTS와 반대로 서브쿼리에 데이터가 존재하지 않을 경우 데이터가 조회됨
UPDATE BUYER
SET BUYER_CHARGER = '우수'
WHERE EXISTS (SELECT SUM(CART.CART_QTY * PROD.PROD_SALE)
FROM PROD, CART
WHERE CART.CART_PROD = PROD.PROD_ID
AND PROD.PROD_BUYER = BUYER.BUYER_ID
HAVING SUM(CART.CART_QTY * PROD.PROD_SALE) > 80000000);
IN => 비교값 직접 대입, 무조건 서브쿼리 모든 행 검색(해당 값-IN연산자에 대입)
EXISTS => 서브쿼리만 사용, 해당값 1건이라도 찾으면 검색 멈추고 TRUE 반환
UPDATE