테이블 간의 관계 : Foreign key 제약조건
▪ Foreign key(외래키) – 한 테이블이 다른 테이블의 컬럼 값을 참조하는 것
▪ 부모테이블 – 참조 되는 테이블
▪ 자식테이블 – 참조 하는 테이블

– 직원테이블의 데이터(ROW)는 부서테이블의 데이터를 참조한다.
– 부서테이블의 ROW는 직원테이블의 데이터 0개~N개가 참조할 수 있다.
– 직원테이블의 데이터 하나는 직원테이블의 데이터 하나를 상사_ID로 참조한다.
▪ 기본 구문
CONSTRAINT 제약조건이름 FOREIGN KEY(컬럼) REFERECES 부모테이블(PK컬럼) [ON 설정]
– 참조컬럼은 PK거나 Index 설정된 컬럼이어야 한다.
▪ 자식 테이블로부터 참조 당하는 부모 테이블의 row는 삭제 할 수 없다.
▪ CASCADE DELETE
– FOREIGN KEY 설정 시 ON DELETE CASCADE 설정
▪ 부모 테이블의 참조 ROW 삭제 시 자식 테이블의 참조 ROW 삭제
CONSTRAINT 제약조건이름 FOREIGN KEY(컬럼) REFERECES 부모테이블(PK컬럼) ON DELETE CASCADE
– FOREIGN KEY 설정 시 ON DELETE SET NULL설정
▪ 부모 테이블의 참조 ROW 삭제 시 참조 하는 자식 테이블의 컬럼 값을 NULL로 설정
CONSTRAINT 제약조건이름 FOREIGN KEY(컬럼) REFERECES 부모테이블(PK컬럼) ON DELETE SET NULL
▪ ON 설정
– 기본적으로 자식테이블에서 참조하고 있으면 부모 테이블의 데이터를 삭제/수정하지 못한다.
▪ Foreign key 컬럼 설정할 때 이것을 변경할 수 있는데 이때 on 설정을 사용한다.
– ON DELETE|UPDATE 처리방식
– ON DELETE: 참조하는 부모테이블의 행이 삭제 되었을 때 어떻게 처리할 것인지 설정
– ON UPDATE: 참조하는 부모테이블의 참조 컬럼값이 변경되면 어떻게 처리할 것인지 설정
– 처리방식
▪ CASCADE : 부모 테이블에서 데이터를 삭제/수정하면, 그 행을 참조하는 자식테이블의 행들도 같이 삭제/수정된다.
▪ SET NULL : 부모 테이블에서 데이터를 삭제/수정하면, 그 행을 참조하는 자식테이블의 foreign key 컬럼의 값을 NULL로 변경한다.
▪ Table drop시 foreign key 제약조건 제거
▪ 부모 테이블 DROP전에 MySQL의 foreign key 적용이 안되도록 설정해야 한다.
set foreign_key_ckecks = 0; -- foreign key 해제 설정
DROP table 삭제할테이블;
set foreign_key_ckecks = 1; -- foreign key 적용 설정
조인 개념
▪ 관계 있는 두개의 테이블을 합쳐서(JOIN) 조회(SELECT) 하는 것을 말한다.
▪ 조인할 두 테이블의 특정 컬럼의 값들이 같은 행끼리 합친다.
▪ 조인연산
– 어떤 행들의 값이 같은 것끼리 합칠 것인지 설정하는 구문.
– 일반적으로 부모테이블과 자식테이블을 연결해서 조회하는 경우가 많으며 이 경우 부모 테이블의 PK와 자식 테이블의 FK 컬럼의 값이 같은 행들을 JOIN 한다.

▪ 카티션 곱(Cartesian-Product)
– 두 테이블의 전체 행들을 합칠 수 있는 모든 경우의 조합이 만들어지는 경우.
▪ N행, M행 의 두 테이블 조인시 N x M 개의 행이 생성된다.
– 이유
▪ 조인 연산을 생략한 경우(CROSS JOIN)
▪ 조인 연산이 잘못된 경우 ▪ 조인 종류
– INNER JOIN
▪ 조인 연산 조건을 만족하는 행들을 합친다.
– OUTER JOIN
▪ 조인 연산 조건을 만족하지 않는 행들도 포함해서 합친다.
▪ LEFT OUTER JOIN
▪ RIGHT OUTER JOIN
▪ FULL OUTER JOIN
INNER JOIN(내부조인)
▪ 조인 연산 조건을 만족하는 행끼리 만 합치는 JOIN
▪ 구문
SELECT 컬럼선택
FROM 테이블_1 INNER JOIN 테이블_2 ON 조인연산 -- INNER 생략가능
[INNER JOIN 테이블_3 ON 조인연산 …]

SELECT b.부서_ID, b.부서이름,
e.직원이름
FROM 부서 b INNER JOIN 직원 e ON b.소속부서=e.부서_ID
조인 – 외부조인(Outer Join)
▪ 조인 연산 조건을 만족하지 않는 행도 포함해서 합친다.
▪ Source Table
– 조인시 조회 기준이 되는 테이블로 조회하려는 주(main) 정보를 가지고 있는 테이블
▪ Target Table
– 조인시 Source table 데이터의 추가 정보를 가지고 있는 테이블로 보조(sub) 정보를 가지고 있는 테이블
▪ 조인시 Source 테이블의 데이터(행)은 모두 사용하고 Target table의 데이터(행)은 조인 조건 을 만족하는 행만 나오도록 한다.
▪ Outer Join 종류
– LEFT OUTER JOIN
▪ Source 테이블이 왼쪽에 선언한 테이블인 경우의 outer join.
– RIGHT OUTER JOIN
▪ Source 테이블이 오른쪽에 선언한 테이블인 경우의 outer join.
– FULL OUTER JOIN
▪ 양쪽에 선언한 테이블이 모두 Source table인 경우의 outer join ▪ MySQL은 지원하지 않는다.
▪ LEFT OUTER JOIN
SELECT 컬럼선택
FROM 테이블_1 LEFT [OUTER] JOIN 테이블_2 ON 조인연산 -- OUTER 생략가능
-- Source table: 테이블_1, Target table: 테이블_2

SELECT b.부서_ID, b.부서이름,
e.직원이름
FROM 부서 b LEFT OUTER JOIN 직원 e ON b.소속부서=e.부서_ID
▪ RIGHT OUTER JOIN
SELECT 컬럼선택
FROM 테이블_1 RIGHT [OUTER] JOIN 테이블_2 ON 조인연산 -- OUTER 생략가능
-- Source table: 테이블_2, Target table: 테이블_1

SELECT b.부서_ID, b.부서이름,
e.직원이름
FROM 부서 b RIGHT OUTER JOIN 직원 e ON b.소속부서=e.부서_ID
▪ FULL OUTER JOIN
– MySQL은 지원하지 않는다.
– left join, right join select 문을 union 하여 구현한다.

SELECT b.부서_ID, b.부서이름, e.직원이름
FROM 부서 b LEFT OUTER JOIN 직원 e ON b.소속부서=e.부서_ID
UNION
SELECT b.부서_ID, b.부서이름, e.직원이름
FROM 부서 b RIGHT OUTER JOIN 직원 e ON b.소속부서=e.부서_ID;
'Data_Analysis_Track_33 > SQL' 카테고리의 다른 글
| SQL_06(Self , Outer JOIN) (0) | 2023.09.06 |
|---|---|
| SQL_05(JOIN) (0) | 2023.09.05 |
| SQL_04(집계함수, group by, having, with rollup, grouping) (0) | 2023.09.04 |
| SQL_03(함수) (0) | 2023.09.01 |
| SQL_02(SELECT, WHERE) (0) | 2023.08.31 |