참조를 하는 테이블은 '자식 테이블'
참조를 당하는 테아블은 '부모 테이블'
외래키는 다른 테이블의 특정row를 식별할 수 있어야 하기 때 때문에 주로 다른 테이블의 primary key를 참조할 때가 많습니다
CREATE TABLE 테이블이름
(
필드이름 필드타입,
...,
[CONSTRAINT 제약조건이름]
FOREIGN KEY(필드이름)
REFERENCES 테이블이름(필드이름)
[ON DELETE 동작 ON UPDATE 동작]
);
ALTER TABLE 테이블이름
ADD [CONSTRAINT 제약조건이름]
FOREIGN KEY(필드이름)
REFERENCES 테이블이름(필드이름);
CASECADE 자식 테이블에서 데이터를 삭제하거나 수정하면 부모 테이블에서도 삭제와 수정이 같이 이루어짐
SET NULL 자식 테이블에서 데이터를 삭제하거나 수정하면 부모 테이블에서 NULL로 변경됨
NO ACTION 자식 테이블에서 데이터를 삭제하거나 수정해도 부모 테이블의 데이터는 변경되지 않음
SET DEFAULT 자식 테이블에서 데이터를 삭제하거나 수정하면 부모 테이블의 데이터는 필드의 기본값으로 설정됨
RESTRICT 자식 테이블에서 데이터를 남아있으면, 부모 테이블의 데이터를 삭제하거나 수정할 수 없음
ALTER TABLE 테이블 이름
DROP FOREIGN KEY 필드이름;
SELECT *
FROM 테이블A JOIN 테이블B
ON 테이블A.컬럼 = 테이블B.컬럼 //컬럼명이 같다면 USING(컬럼)으로 사용가능
왼쪽 테이블의 전체와, 오른쪽 테이블과 일치하는 값을 반환
SELECT
c.first_name,
c.last_name,
ad.address_id,
ad.address
FROM address ad LEFT OUTER JOIN customer c
ON c.address_id = ad.address_id;
부모테이블인 address테이블로 조인을 헀기 때문에 customer쪽의 데이터가 NULL이 존재
오른쪽 테이블의 전체와, 왼쪽 테이블과 일치하는 값을 반환
SELECT
c.first_name,
c.last_name,
ad.address_id,
ad.address
FROM address AS ad RIGHT OUTER JOIN customer AS c
ON c.address_id = ad.address_id;
자식테이블인 customer 테이블로 조인을 했기 때문에 null이 존재하지 않음
각 테이블에서 조인 기준으로 일치하는 row들만 반환
SELECT
c.first_name,
c.last_name,
ad.address_id,
ad.address
FROM address AS ad INNER JOIN customer AS c
ON c.address_id = ad.address_id;
FORIEIGN KEY를 기준으로 조인시 RIGHT OUTER JOIN과 결과가 같음
테이블을 가로 방향으로 합치는 것 ex)JOIN
같은 종류의 테이블을 세로 방향으로 합치는 것
단, 공통적으로 갖고잇는 컬럼들의 총 컬럼의 수와, 각 컬럼의 데이터 타입만 일치하면 집합연산이 가능하다
SELECT * FROM member_A
INTERSECT
SELECT * FROM member_B
SELECT * FROM member_A
MINUS
SELECT * FROM member_B
SELECT * FROM member_A
UNION
SELECT * FROM member_B
Mysql에서는 UNION연산자만 지원, INTERSECT, MINUS연산은 JOIN을 통해 구현한다!
INTERSECT는 'INNER JOIN'
MINUS연산은 'A LEFT/RIGHT OUTER JOIN B + WHERE B/A.컬럼 IS NULL'UNION과 UNION ALL
UNION은 겹치는 것을 중복제거하지만
UNION ALL은 중복제거하지 않고, 겹치는 것을 그대로 둘다 보여준다
SELECT
f.film_id,
fc.category_id,
c.name
FROM
film AS f LEFT OUTER JOIN film_category AS fc
ON f.film_id = fc.film_id
LEFT OUTER JOIN category AS c
ON fc.category_id = c.category_id;
영화테이블, 카테고리테이블, 영화 - 카테고리를 연결해주는 조인테이블을 동시에 조인하여 조회
두 테이블에서 같은 이름의 컬럼을 찾아서 자동으로 그것들을 조인 조건을 설정하고, INNER JOIN을 해주는 조인
CROSS JOIN은 한 테이블의 하나의 row에 다른 테이블의 모든 row들을 매칭하고, 그 다음 row에서도 또, 다른 테이블의 모든 row들을 매칭하는 것을 반복함으로써 두 테이블의 row들의 모든 조합을 보여주는 조인