728x90
반응형

🎀 Union / Union All

Union

  • 조회결과와 조회결과를 행단위로 합치는 기능
  • 조회결과들 간의 칼럼의 개수는 동일해야 함
  • 조회결과들 간의 데이터 타입을 동일해야 함
  • 예시
    - 'member' 'cart'는 구분자로 쓰임
SELECT 'member', mem_id, mem_name
FROM member
UNION
SELECT 'cart', cart_member, cart_prod
FROM cart;

 

찾은 행  28개

 

 

 

 

 

 

 

 

 

UNION ALL

  • 회원 28명, 주문정보 135건 일 때 아래 코드 실행 시 결과
    UNION : 155건
    UNION ALL : 163건
SELECT 'member', mem_id, mem_name
FROM member
UNION all
SELECT 'cart', cart_member, cart_prod
FROM cart;
  • UNION : 중복제거
  • UNION ALL : 중복포함
  • MINUS : 차집합
  • INTERSECT : 교집합

Union 문제

문제 1 - 1번

SELECT mem_id, mem_name, SUM(nvl(cart_qty*prod_sale,0)) AS total
FROM member 
			left join cart
				ON (mem_id = cart_member)
			left JOIN prod
				ON (cart_prod = prod_id)
GROUP BY mem_id
UNION
SELECT '', '', SUM(nvl(cart_qty*prod_sale,0)) AS total
FROM member 
			left join cart
				ON (mem_id = cart_member)
			left JOIN prod
				ON (cart_prod = prod_id)
GROUP BY '', '';

 

찾은 행 29개

- 그룹화 하지 않은 SUM은 전체 행의 합이 구해진다.

- Group by ' ', ' ' 는 아무 의미가 없지만 빈 문자열로 컬럼을 지정하면 오류가 나기 때문에 문법상 적어준 것이다.

 

 

 

 

 

 

 

 


문제 1 - 2번

  • Union 문제 1 - 1번 에서 총 구매금액 순을 내림차순으로 정렬
  • 단, 총 구매금액의 총합은 마지막 행에 위치
SELECT A.mem_id, A.mem_name, A.total
FROM 
(SELECT mem_id, mem_name, SUM(nvl(cart_qty*prod_sale,0)) AS total
FROM member 
			left join cart
				ON (mem_id = cart_member)
			left JOIN prod
				ON (cart_prod = prod_id)
GROUP BY mem_id
ORDER BY total DESC) A
UNION
SELECT '', '', SUM(nvl(cart_qty*prod_sale,0)) AS total
FROM member 
			left join cart
				ON (mem_id = cart_member)
			left JOIN prod
				ON (cart_prod = prod_id)
GROUP BY '', '';

 

 

 

 

 

 

 

 

 

 

 

 

 

🎀 Exists / Not Exists

Exists

  • 조회결과가 1건이라도 있으면 true, 0건이면 false
  • 서브쿼리를 적용(다중컬럼의 다중행 모두 가능)
  • 예시
    - 구매내역이 있는 회원만 조회
    - 아래 쿼리 실행시 회원 28명 중 19명이 조회 된다.

    SELECT mem_id, mem_name
    FROM member
    WHERE EXISTS(SELECT *
    FROM cart
    WHERE cart_member = mem_id);​

Not Exists

  • 예시
    -
    구매 (주문) 내역이 없는 회원만 조회
    - 아래 쿼리 실행시 회원 28명 중 9명이 조회 된다.
SELECT mem_id, mem_name
FROM member
WHERE NOT EXISTS (SELECT * FROM cart WHERE mem_id = cart_member);

 

Exists / Not Exists 문제

문제 1번

  • 2005년도 구매내역이 있는 회원 조회하기
  • 단, 구매내역이 있는 회원의 총구매금액이 3천만원 이상인 데이터에 대해서만 조회
  • 조회컬럼 : 회원아이디, 회원이름, 마일리지
  • 방법 1 - Exists 사용
SELECT mem_id, mem_name, mem_mileage
FROM member
WHERE EXISTS (
		SELECT SUM(cart_qty*prod_sale)
			FROM cart, prod
			WHERE cart_member = mem_id
				AND cart_prod = prod_id
				AND left(cart_no,4) = '2005'
		HAVING SUM(cart_qty*prod_sale) >= 30000000);
  • 방법 2 - Inline View 사용
SELECT A.mem_id, A.mem_name, A.mem_mileage
FROM(
	SELECT mem_id, mem_name, mem_mileage, SUM(nvl(cart_qty*prod_sale,0)) AS total
		FROM member 
        	LEFT JOIN cart
				ON ( mem_id = cart_member AND left(cart_no,4) = '2005')
			LEFT JOIN prod
				ON(cart_prod = prod_id)
		GROUP BY mem_id) A
WHERE A.total >= 30000000;

 

결과는 동일하다.

 

 

 

🎀 UPDATE

  • 데이터 수정하기
  • UPDATE 할 땐 수정하려는 값이 문제에서 제시한 수정 대상이 맞는지  SELECT ~ WHERE 절로 확인하기
  • 수정 및 삭제 시 기준 컬럼은 PK값을 기준으로 행을 조건 처리 해야 함
  • 예시 1
    - 회원아이디 a001, b001인 회원의 마일리지 값을 2로 수정
UPDATE member set mem_mileage = 2
WHERE mem_id IN ('a001','b001') ;
  • 예시 2
    - 구매내역이 있는 회원의 마일리지 값을 3으로 일괄 수정처리하기
UPDATE member SET mem_mileage =3
WHERE EXISTS(SELECT *
FROM cart
WHERE cart_member = mem_id);

 

UPDATE 문제

문제 1

  • Exists 문제 1번 조건에 만족하는 회원에 대해서 마일리지 값을 1000점 부여하기
  • 방법 1 - Exists 사용
UPDATE member SET mem_mileage = 1000
WHERE EXISTS (
			SELECT SUM(cart_qty*prod_sale)
				FROM cart, prod
					WHERE cart_member = mem_id
						AND cart_prod = prod_id
						AND left(cart_no,4) = '2005'
					HAVING SUM(cart_qty*prod_sale) >= 30000000);
  • 방법 2 - Inline View 사용
UPDATE member SET mem_mileage = (mem_mileage + 1000)
	WHERE mem_id IN(
		SELECT A.mem_id
		FROM (
			SELECT mem_id, mem_name, mem_mileage, SUM(nvl(cart_qty*prod_sale,0)) AS total
			FROM member 
				LEFT JOIN cart
					ON ( mem_id = cart_member AND left(cart_no,4) = '2005')
				LEFT JOIN prod
					ON(cart_prod = prod_id)
			GROUP BY mem_id) A
	WHERE A.total >= 30000000);
728x90
반응형

+ Recent posts