테이블 결합(JOIN)
Data Analyst

빅데이터 관련 자료/[SQL] Basic

테이블 결합(JOIN)

carpe08 2021. 11. 18. 17:04
320x100
320x100

테이블 결합(JOIN)

관계는 1:1, 1:N, N:N 세가지 형태로, 테이블 간의 연결이 가능하다는 것을 의미합니다.

테이블 결합(JOIN)은 두 테이블 관계를 활용하여 테이블을 결합하는 명령어입니다.

테이블 결합을 통해 여러 테이블을 활용하여 분석이 가능합니다.

ERM은 개체 관계 모델링이며, 관계형 데ㅣ터 베이스에 텡블을 모델링할 때 사용됩니다.

개체: 하나 이상의 속성으로 구성된 객체

관계: 속서들 간의 관계

 

ERD은 개체 간의 관계를 도표로 표현할 때 사용됩니다.

INNER JOIN: 두 테이블의 공통 값이 매칭되는 데이터 결합

LEFT JOIN: 두 테이블의 공통 값이 매칭되는 데이터만 결합 + 왼쪽 테이블의 매칭되지 않는 데이터는 NULL

RIGHT JOIN: 두 테이블의 공통 값이 매칭되는 데이터만 결합 + 오른쪽 테이블의 매칭되지 않는 데이터는 NULL

 

실습 코드

/***************INNER JOIN***************/
/* INNER JOIN: 두 테이블의 공통 값이 매칭되는 데이터만 결합 */

/* Customer + Sales Inner JOIN */
SELECT  *
  FROM  CUSTOMER AS A
 INNER
  JOIN  SALES AS B
    ON  A.MEM_NO = B.MEM_NO;

/* Customer 및 Sales 테이블은 mem_no(회원번호) 기준으로 1:N 관계 */
SELECT  *
  FROM  CUSTOMER AS A
 INNER
  JOIN  SALES AS B
    ON  A.MEM_NO = B.MEM_NO
 WHERE  A.MEM_NO = '1000970';
 
 
/***************LEFT JOIN***************/
/* LEFT JOIN: 두 테이블의 공통 값이 매칭되는 데이터만 결합 + 왼쪽 테이블의 매칭되는 않는 데이터는 NULL */

/* Customer + Sales LEFT JOIN */
SELECT  *
  FROM  CUSTOMER AS A
  LEFT
  JOIN  SALES AS B
    ON  A.MEM_NO = B.MEM_NO;

/* NULL은 회원가입만하고 주문은 하지 않는 회원을 의미 */


/***************RIGHT JOIN***************/
/* RIGHT JOIN: 두 테이블의 공통 값이 매칭되는 데이터만 결합 + 오른쪽 테이블의 매칭되는 않는 데이터는 NULL */

/* Customer + Sales RIGHT JOIN */
SELECT  *
  FROM  CUSTOMER AS A
  RIGHT
  JOIN  SALES AS B
    ON  A.MEM_NO = B.MEM_NO
 WHERE  A.MEM_NO IS NULL;

/* 회원번호(9999999)는 비회원 */
/* IS NULL: 비교 연산자 / NULL인 값만 */


/***************테이블 결합(JOIN) + 데이터 조회(SELECT)***************/

/* 회원(Customer) 및 주문(Sales) 테이블 Inner JOIN 결합 */
SELECT  *
  FROM  CUSTOMER AS A
 INNER
  JOIN  SALES AS B
    ON  A.MEM_NO = B.MEM_NO;

/* 임시테이블 생성 */
CREATE TEMPORARY TABLE CUSTOMER_SALES_INNER_JOIN
SELECT  A.*
		,B.ORDER_NO
  FROM  CUSTOMER AS A
 INNER
  JOIN  SALES AS B
    ON  A.MEM_NO = B.MEM_NO;

/* 임시테이블 조회 */
SELECT * FROM CUSTOMER_SALES_INNER_JOIN;

/* 임시테이블(TEMPORARY TABLE)은 서버 연결 종료시 자동으로 삭제됩니다. */
   

/* 성별이 남성 조건으로 필터링하여 */
SELECT  *
  FROM  CUSTOMER_SALES_INNER_JOIN
 WHERE  GENDER = 'MAN';


/* 거주지역별로 구매횟수 집계 */
SELECT  ADDR
		,COUNT(ORDER_NO) AS 구매횟수
  FROM  CUSTOMER_SALES_INNER_JOIN
 WHERE  GENDER = 'MAN'
 GROUP
    BY  ADDR;


/* 구매횟수 100회 미만 조건으로 필터링 */
SELECT  ADDR
		,COUNT(ORDER_NO) AS 구매횟수
  FROM  CUSTOMER_SALES_INNER_JOIN
 WHERE  GENDER = 'MAN'
 GROUP
    BY  ADDR
HAVING  COUNT(ORDER_NO) < 100;


/* 모든 열 조회 */
/* 구매횟수가 낮은 순으로 */
SELECT  ADDR
		,COUNT(ORDER_NO) AS 구매횟수
  FROM  CUSTOMER_SALES_INNER_JOIN
 WHERE  GENDER = 'MAN'
 GROUP
    BY  ADDR
HAVING  COUNT(ORDER_NO) < 100
 ORDER
    BY  COUNT(ORDER_NO) ASC;
    
    
/***************3개 이상 테이블 결합***************/
/* 주문(Sales) 테이블 기준, 회원(Customer) 및 상품(Product) 테이블 LEFT JOIN 결합 */

SELECT  *
  FROM  SALES AS A
  LEFT
  JOIN  CUSTOMER AS B
    ON  A.MEM_NO = B.MEM_NO
  LEFT
  JOIN  PRODUCT AS C
    ON  A.PRODUCT_CODE = C.PRODUCT_CODE;
320x100
320x100