광주인력개발원 일일포스팅(메모장)
14주차 목 1123(데이터 분석, 조인(Join)
Jumbo96
2023. 11. 23. 18:13
728x90
반응형
조인이다!
-- join
/*
<조인(join) 구문 작성하는 방법>
- Inner Join 방식은 : 인반방식 or 표준방식 모두 표준처럼 사용됨
(Inner Join - 일반방식)
Select 테이블1. 컬럼1...테이블n.컬럼1
From 테이블1, 테이블2... 테이블n
Where 관계조건(PK = FK)
And 일반조건
(Inner Join - 표준방식)
Select 테이블1. 컬럼1...테이블n.컬럼1
From 테이블1 Inner Join 테이블2
On(관계조건(PK = FK)
And 일반조건)
Inner Join 테이블n
On(관계조건(PK = FK)
And 일반조건)
Group by ....그룹이 있는경우
Having ....그룹 조건이 있는경우
Order by ....정렬이 있는 경우
*/
*/
-- 크로스 조인
-- : 아래 같이 두 테이블간의 관계 조건 없이 사용한 경우
-- : 행의 갯수 = 테이블행 전체갯수 * 테이블행 전체갯수
SELECT mem_id, cart_member
FROM MEMBER, cart;
-- 28
SELECT COUNT(*)
FROM MEMBER;
-- 135
SELECT COUNT(*)
FROM cart;
SELECT 28 * 135;
-- Inner Join
-- : 두 테이블간에 PK = FK 인 조건을 제시
-- (일반방식)
-- : From 절 뒤에 테이블을 콤마(,)로 구분하여 사용
-- : Where절에 관계조건식 (PK = FK)을 추가함
-- : 관계조건식은 최소한 (사용된 테이블의 갯수 -1) 만큼 제시 해야함
-- : 제일 많은 값을 기준으로 체크한다.
SELECT mem_id, mem_name, cart_prod, cart_qty, prod_name
FROM MEMBER, cart, prod
-- 관계조건식 추가(PK = FK)
WHERE mem_id = cart_member
AND prod_id = cart_prod
-- 일반조건 추가
AND mem_add1 LIKE '서울%';
-- (Inner Join Ansi 표준방식)
SELECT mem_id, mem_name, cart_prod, cart_qty, prod_name
FROM MEMBER
INNER JOIN cart
ON(mem_id = cart_member)
-- 일반조건 추가
AND mem_add1 LIKE '서울%'
INNER Join prod
ON(prod_id = cart_prod);
-- 일반조건을 where절에 추가
SELECT mem_id, mem_name, cart_prod, cart_qty, prod_name
FROM MEMBER
INNER JOIN cart
ON(mem_id = cart_member)
INNER Join prod
ON(prod_id = cart_prod)
-- 일반조건 추가
where mem_add1 LIKE '서울%';
-- [문제]
-- 조회컬럼 : 회원아이디, 회원이름, 주문번호, 주문수량, 상품명 조회
-- 조건 : 주문내역이 있는 회원이어야 함
-- : 주문한 회원 거주지가 서울에 거주하는 회원이어야 함
-- : 상품명에 컴퓨터라는 단어가 포함
-- 정렬 : 주문수량을 기준으로 내림차순
-- (일반방식)
SELECT mem_id, mem_name, cart_no, cart_qty, prod_name
FROM MEMBER, cart, prod
-- 관계조건
WHERE mem_id = cart_member
AND cart_prod = prod_id
-- 일반조건
AND mem_add1 LIKE '서울%'
AND prod_name LIKE '%컴퓨터%';
ORDER BY cart_qty ASC;
-- 컴파일 순서 select > from > where > select 조회 > order by
-- (표준방식)
SELECT mem_id, mem_name, cart_no, cart_qty, prod_name
FROM MEMBER
INNER JOIN cart
ON(mem_id = cart_member)
AND mem_add1 LIKE '서울%'
INNER JOIN prod
ON(cart_prod = prod_id)
AND prod_name LIKE '%컴퓨터%'
ORDER BY cart_qty asc;
-- 컴파일 순서 select > from > select 조회 > order by
-- [문제]
-- 상품분류별 상품의 갯수를 조회
-- 조회컬럼 : 상품분류코드, 상품분류명, 분류별갯수
-- 정렬 : 분류별갯수 내림차순
-- (일반방식)
SELECT prod_lgu, lprod_nm, COUNT(lprod_nm) AS lprod_cnt
FROM prod, lprod
where prod_lgu = lprod_gu
GROUP BY prod_lgu, lprod_nm
ORDER BY lprod_cnt DESC;
-- (표준방식)
SELECT prod_lgu, lprod_nm, COUNT(lprod_nm) AS lprod_cnt
FROM prod
INNER JOIN lprod
ON(prod_lgu = lprod_gu)
GROUP BY prod_lgu, lprod_nm
ORDER BY lprod_cnt DESC;
-- [문제]
/*
- 회원아이디, 회원이름, 주문수량, 상품명 조회
- 단, 구매상품의 거래처 주소가 서울, 대전, 광주인 경우
- 상품분류명에 "전자"가 포함된 경우
- 주문수량이 5이상인 경우
- 정렬은 아이디 오름차순, 주문수량 내림차순
*/
-- (일반방식)
SELECT mem_id, mem_name, cart_qty, prod_name
FROM MEMBER, cart, prod, buyer, lprod
WHERE mem_id = cart_member
AND cart_prod = prod_id
AND prod_buyer = buyer_id
AND prod_lgu = lprod_gu
AND SUBSTR(buyer_add1,1,2) IN ('서울','대전','광주')
AND lprod_nm LIKE '%전자%'
AND cart_qty >= 5
ORDER BY mem_id ASC, cart_qty DESC;
-- (표준방식)
SELECT mem_id, mem_name, cart_qty, prod_name
FROM MEMBER
INNER Join cart
ON(mem_id = cart_member
AND cart_qty >= 5 )
INNER Join prod
ON(cart_prod = prod_id)
INNER Join buyer
ON(prod_buyer = buyer_id
AND SUBSTR(buyer_add1,1,2) IN ('서울','대전','광주') )
INNER Join lprod
ON(prod_lgu = lprod_gu
AND lprod_nm LIKE '%전자%' )
ORDER BY mem_id ASC, cart_qty DESC;
-- [문제]
-- 주문내역이 있는 회원별로 지금까지 총 지출한 총액 조회하기
-- 조회컬럼 : 회원아이디, 회원이름, 총 지출액
SELECT mem_id, mem_name, (SUM(prod_Sale * cart_qty)) AS total
FROM MEMBER, cart, prod
WHERE mem_id = cart_member
AND cart_prod = Prod_id
GROUP BY mem_id
ORDER BY total DESC;
SELECT mem_id, mem_name, (SUM(prod_Sale * cart_qty)) AS total
FROM MEMBER
INNER Join cart
ON(mem_id = cart_member)
INNER Join prod
ON(cart_prod = Prod_id)
GROUP BY mem_id
ORDER BY total DESC;
-- 위 문제에 이어서...
-- 위 결과에서 가장 지출이 큰 값과, 가장 작은 값을 조회
-- 조회 값 : 최대값, 최소값 2개만..
-- 가상테이블 개념이 적용됨(Inline View)
-- : From절 뒤에 테이블 대신 Sub Query를 사용함
-- : Sub Query의 Select한 행렬 결과를 메모리에 적재시켜서 사용
-- : 행렬의 데이터를 테이블과 동일한 개념으로 사용하기 때문에
-- 가상테이블이라고 칭합니다.
-- : 가상테이블은 별칭을 이용해서 테이블 이름처럼 사용합니다.
SELECT MAX(total) AS max_total,
MIN(total) AS min_total
FROM (SELECT mem_id, mem_name, (SUM(prod_Sale * cart_qty)) AS total
FROM MEMBER, cart, prod
WHERE mem_id = cart_member
AND cart_prod = Prod_id
GROUP BY mem_id) Subquery;
-- [문제]
-- 위에 결과에서 최대값을 가지는 회원아이디와 이름을 조회
SELECT B.mem_id, B.mem_name, B.total
FROM (select MAX(total) AS max_total,
MIN(total) AS min_total
FROM (SELECT mem_id, mem_name, (SUM(prod_Sale * cart_qty)) AS total
FROM MEMBER, cart, prod
WHERE mem_id = cart_member
AND cart_prod = Prod_id
GROUP BY mem_id) Subquery) A,
(SELECT mem_id, mem_name, (SUM(prod_Sale * cart_qty)) AS total
FROM MEMBER, cart, prod
WHERE mem_id = cart_member
AND cart_prod = Prod_id
GROUP BY mem_id
) B
WHERE A.max_total = B.total;
728x90
반응형