조인을 이용한 데이터 분석

POOHYA·2022년 3월 16일
0

SQL

목록 보기
3/7

FOREIGN KEY

참조를 하는 테이블은 '자식 테이블'
참조를 당하는 테아블은 '부모 테이블'
외래키는 다른 테이블의 특정row를 식별할 수 있어야 하기 때 때문에 주로 다른 테이블의 primary key를 참조할 때가 많습니다

설정 방법

CREATE문으로 설정

CREATE TABLE 테이블이름
(
    필드이름 필드타입,
    ...,
    [CONSTRAINT 제약조건이름]
    FOREIGN KEY(필드이름)
    REFERENCES 테이블이름(필드이름)
    [ON DELETE 동작 ON UPDATE 동작]
);

ALTER문으로 설정

ALTER TABLE 테이블이름
ADD [CONSTRAINT 제약조건이름]
FOREIGN KEY(필드이름)
REFERENCES 테이블이름(필드이름);

ON DELETE / ON UPDATE + 동작

CASECADE 자식 테이블에서 데이터를 삭제하거나 수정하면 부모 테이블에서도 삭제와 수정이 같이 이루어짐

SET NULL 자식 테이블에서 데이터를 삭제하거나 수정하면 부모 테이블에서 NULL로 변경됨

NO ACTION 자식 테이블에서 데이터를 삭제하거나 수정해도 부모 테이블의 데이터는 변경되지 않음

SET DEFAULT 자식 테이블에서 데이터를 삭제하거나 수정하면 부모 테이블의 데이터는 필드의 기본값으로 설정됨

RESTRICT 자식 테이블에서 데이터를 남아있으면, 부모 테이블의 데이터를 삭제하거나 수정할 수 없음

외래키삭제

ALTER TABLE 테이블 이름
DROP FOREIGN KEY 필드이름;

JOIN

SELECT * 
FROM 테이블A JOIN 테이블B
ON 테이블A.컬럼 = 테이블B.컬럼 //컬럼명이 같다면 USING(컬럼)으로 사용가능

LEFT (OUTER) JOIN


왼쪽 테이블의 전체와, 오른쪽 테이블과 일치하는 값을 반환

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이 존재

RIGHT (OUTER) JOIN


오른쪽 테이블의 전체와, 왼쪽 테이블과 일치하는 값을 반환

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이 존재하지 않음

INNER JOIN


각 테이블에서 조인 기준으로 일치하는 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

집합연산

같은 종류의 테이블을 세로 방향으로 합치는 것

단, 공통적으로 갖고잇는 컬럼들의 총 컬럼의 수와, 각 컬럼의 데이터 타입만 일치하면 집합연산이 가능하다

A ∩ B (INTERSECT)

SELECT * FROM member_A 
INTERSECT 
SELECT * FROM member_B

A - B (MINUS or EXCEPT)

SELECT * FROM member_A 
MINUS
SELECT * FROM member_B

A U B (UNION)

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은 중복제거하지 않고, 겹치는 것을 그대로 둘다 보여준다

3가지 테이블을 JOIN

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;

영화테이블, 카테고리테이블, 영화 - 카테고리를 연결해주는 조인테이블을 동시에 조인하여 조회

NATURAL JOIN

두 테이블에서 같은 이름의 컬럼을 찾아서 자동으로 그것들을 조인 조건을 설정하고, INNER JOIN을 해주는 조인

CROSS JOIN

CROSS JOIN은 한 테이블의 하나의 row에 다른 테이블의 모든 row들을 매칭하고, 그 다음 row에서도 또, 다른 테이블의 모든 row들을 매칭하는 것을 반복함으로써 두 테이블의 row들의 모든 조합을 보여주는 조인

SELF JOIN

FULL OUTER JOIN

Non-Equi 조인

profile
김효주

0개의 댓글