14주차 목 1123(데이터 분석, 조인(Join) :: newb

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14주차 목 1123(데이터 분석, 조인(Join)
    광주인력개발원 일일포스팅(메모장) 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
    반응형
Designed by Tistory.