*관계
1:1, 1:N, N:N형태로 테이블 간의 연결이 가능
ERM은 개체-관계 모델링이며, 관계형 데이터베이스에 테이블을 모델링할 때 사용
*개체: 하나 이상의 속성으로 구성된 개체
*관계: 속성들간의 관계
개체간의 관계를 도표로 표현할 때 사용
FK(FORGEIGN KEY): 다른 테이블에서 PK
*INNER Join: 두 테이블의 공통 값이 매칭되는 데이터만 결합
*Right Join: 두 테이블의 공통 값이 매치되는 데이타만 결합+ 오른쪽 테이블의 매칭되지 않는 데이터는 NULL
USE PRACTICE;
/***************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)
테이블 결합 및 데이터 조회를 활용하여 여러 테이블 결합 후 조회 및 분석
/***************테이블 결합(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;