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
반응형
'Digital Boot > Database' 카테고리의 다른 글
[Data Wrangling] Pandas판다스, 데이터 분석 / 조회 / 추가 / 필터링 (3) | 2023.11.28 |
---|---|
[Database][SQL] 사용자 정의 함수 / VIEW / Procedure / 저장 모듈 (1) | 2023.11.27 |
[Database][SQL] Self Join / Outer Join (0) | 2023.11.24 |
[Database][SQL] 데이터 조회 문제 만들어보기 (2) | 2023.11.23 |
[Database][SQL] Join 조인 / Inline View 가상 테이블 (0) | 2023.11.23 |