728x90
반응형
Inner Join 복습 문제
문제
- 회원아이디 b001 회원의 마일리지 값보다 큰 회원정보 조회
- 조회칼럼 : 회원아이디, 이름
-- 1
SELECT mem_id, mem_name
FROM member
WHERE mem_mileage > (SELECT mem_mileage
FROM member
WHERE mem_id ='b001') ;
-- 2
SELECT A.mem_id, A.mem_name
FROM (SELECT mem_id, mem_name
FROM member
WHERE mem_mileage > (SELECT mem_mileage FROM member WHERE mem_id ='b001')) A ;
-- 3
SELECT mem_id, mem_name
FROM member,
(SELECT mem_mileage
FROM member
WHERE mem_id ='b001') MEM
WHERE member.mem_mileage > MEM.mem_mileage ;

결과는 모두 동일하다.
🎀 Self Join
- Self Join으로 처리하기
- 셀프조인 시 : 조건은 한쪽 m2 테이블에 적용
- 조회 시 : m1 테이블에서 조회
Self Join 문제
문제 1번
- Inner Join 문제 1번에 Self join을 사용해 보기
SELECT m1.mem_id, m1.mem_name
FROM member m1, member m2
WHERE m2.mem_id = 'b001'
AND m1.mem_mileage > m2.mem_mileage;
Inner Join 문제 1번과 결과가 동일하다.
🎀 Outer Join
- 특정 테이블 전체에 대한 집계를 하고자 할 때 사용
- OUTER JOIN 종류
1. LEFT OUTER JOIN : 테이블 순서 중 왼쪽에 위치한 테이블 전체
2. RIGHT OUTER JOIN : 테이블 순서 중 오른쪽에 위치한 테이블 전체
3. FULL OUTER JOIN : 왼쪽, 오른쪽 전체 테이블 (Oracle DB만 사용 가능) - OUTER JOIN 개념
1. Outer Join은 표준방식으로만 사용해야 하며 일반 조건은 무조건 On() 내부에 작성해야 한다
2. 일반 조건을 where 절을 사용하면 Outer 전체 계념이 적용이 안된다
3. Inner Join을 만족해야 한다(Inner Join 개념을 그대로 적용)
4. Left or Right 기준으로 같으면 같은 조건대로 조회하고 다르면 null로 조회된다
Outer join 문제
문제 1번
- 상품분류 전체에 대한 상품종류 집계
SELECT lprod_nm, COUNT(prod_lgu) AS cnt
FROM lprod
LEFT JOIN prod
ON (lprod_gu = prod_lgu)
GROUP BY lprod_gu
ORDER BY cnt;

문제 2 - 1번
- 회원별 구매금액의 총액 조회
- 2005년 5월에 구매한 내역
- 조회칼럼 : 회원이름, 구매금액 총액
-- 일반 방식 SELECT mem_name, SUM(cart_qty*prod_sale) AS total FROM member, prod, cart WHERE mem_id=cart_member AND cart_prod = prod_id AND substring(cart_no,1,6) = '200505' group BY mem_id, mem_name ORDER BY total desc; -- 표준 방식 SELECT mem_name, SUM(cart_qty*prod_sale) AS total FROM member INNER join cart ON (mem_id=cart_member AND substring(cart_no,1,6) = '200505') INNER JOIN prod ON (cart_prod = prod_id) group BY cart_member ORDER BY total desc;

찾은 행 13개
5월에 구매한 내역이 있는 고객만 조회됨
문제 2 - 2번
- 문제 2 - 1에 이어서 회원 전체에 대해서 문제 2 - 1조건으로 조회하기
- 총회원은 28명
SELECT mem_name, SUM(nvl(cart_qty,0)*nvl(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, mem_name
ORDER BY total desc;

찾은 행 28개
구매이력이 없는 회원도 모두 조회되며
NULL값을 가지면 0으로 대체됨
문제 3 - 1번
- 2005년도 월별 판매 현황 검색하기
- 조회칼럼 : 판매월, 월별 총판매수량, 월별 총판매금액
SELECT substring(cart_no,1,6) AS cart_no, sum(cart_qty) AS cart_qty, sum(cart_qty*prod_sale) AS total
FROM cart
left join prod
ON (cart_prod = prod_id
AND SUBSTRING(cart_no,1,4) = '2005')
GROUP BY substring(cart_no,1,6);

문제 3 - 2번
- 문제 3 - 1번 조건에서 1월 ~ 12월까지 모두 표현하고자 한다면?
- 방법 1 - UNION 사용
SELECT
months.month,
NVL(SUM(A.cart_qty), 0) AS total_sales,
NVL(SUM(A.cart_qty*B.prod_sale),0) AS total
FROM (
SELECT '200501' AS month
UNION SELECT '200502'
UNION SELECT '200503'
UNION SELECT '200504'
UNION SELECT '200505'
UNION SELECT '200506'
UNION SELECT '200507'
UNION SELECT '200508'
UNION SELECT '200509'
UNION SELECT '200510'
UNION SELECT '200511'
UNION SELECT '200512'
) AS months
LEFT JOIN cart A ON (SUBSTRING(A.cart_no, 1, 6) = months.month)
LEFT join prod B ON (A.cart_prod = B.prod_id)
GROUP BY months.month
ORDER BY months.month;
- 방법 2 - 새로운 날짜 테이블 생성
-- 테이블 생성
CREATE TABLE date_mm (
mm CHAR(2) NOT NULL
);
-- 값 입력
INSERT INTO date_mm VALUES('01');
INSERT INTO date_mm VALUES('02');
INSERT INTO date_mm VALUES('03');
INSERT INTO date_mm VALUES('04');
INSERT INTO date_mm VALUES('05');
INSERT INTO date_mm VALUES('06');
INSERT INTO date_mm VALUES('07');
INSERT INTO date_mm VALUES('08');
INSERT INTO date_mm VALUES('09');
INSERT INTO date_mm VALUES('10');
INSERT INTO date_mm VALUES('11');
INSERT INTO date_mm VALUES('12');
-- 조회 코드 작성
SELECT date_mm.mm,
SUM(nvl(cart_qty,0)) AS total_qty,
SUM(nvl(cart_qty*prod_sale,0)) AS total
FROM date_mm
LEFT JOIN cart
ON(date_mm.mm = SUBSTRING(cart_no,5,2))
LEFT JOIN prod
ON(cart_prod = prod_id
AND substring(cart_no,1,4) = '2005')
GROUP BY date_mm.mm;

결과는 동일하다.
문제 4번
- 2005년도에 대한 전체 거래처별 총매출금액 조회하기
- 조회칼럼 : 거래처 코드, 거래처명, 총매출금액
- 정렬 : 총매출금액 - 내림차순
SELECT buyer_id, buyer_name, SUM(nvl(cart_qty*prod_sale,0)) AS total
FROM buyer
LEFT join prod
ON (buyer_id = prod_buyer)
LEFT join cart
ON(prod_id = cart_prod AND substring(cart_no,1,4) = '2005' )
GROUP BY buyer_id
ORDER BY total DESC;

찾은 행 13개
728x90
반응형
'Digital Boot > Database' 카테고리의 다른 글
| [Database][SQL] 사용자 정의 함수 / VIEW / Procedure / 저장 모듈 (1) | 2023.11.27 |
|---|---|
| [Database][SQL] UNION / UNION ALL / EXISTS / UPDATE (2) | 2023.11.24 |
| [Database][SQL] 데이터 조회 문제 만들어보기 (2) | 2023.11.23 |
| [Database][SQL] Join 조인 / Inline View 가상 테이블 (0) | 2023.11.23 |
| [Database][SQL] 집계 함수 / 그룹 함수 (0) | 2023.11.22 |