///////
Search
2️⃣

데이터 그룹화 · JOIN

JOIN(조인) 에 대해서 알아보자

JOIN 문법

2개 또는 그 이상의 테이블(릴레이션)을 결합하여 의미있는 데이터를 만들 수 있도록 돕는 메커니즘이다.
위와 같이, M_ID 를 외래키로서 공유하여 연관되어 있는 두 테이블이 있다고 할 때,
Board 테이블 만으로는, 게시글 작성자의 회원아이디·이름·성별·생일 에 대한 데이터를 알 수 없다.
하지만, JOIN 을 사용하면 알아낼 수 있다.
JOIN 을 사용하면 두 테이블이 합쳐진 형태가 된다고 생각하면 된다.

JOIN의 여러가지 방법

1. INNER JOIN

SELECT * FROM A INNER JOIN B ON A_B_ID = B_ID; 를 입력하면 INNER JOIN 이 된다.
INNER JOIN 은 두 릴레이션의 교집합을 추출한다고 생각하면 쉽다.
릴레이션 A의 A_B_ID 속성과 B의 B_ID 속성이 외래키로서 연결되어 있을 때, 두 테이블에서 데이터 값이 존재하는 튜플만 연결하여 추출해준다.

2. LEFT JOIN

SELECT * FROM A LEFT JOIN B ON A_B_ID = B_ID; 를 입력하면 LEFT JOIN 이 된다.
LEFT JOIN 은 A의 외래키 속성은 NULL 값까지 다 표현하고, NULL 값이 아닌 값들은 B 테이블의 데이터를 연관지어 표현한다.
당연히, A 테이블에서 NULL 값이었던 튜플들의 다른 속성 값도 NULL 값으로 표현된다.

3. RIGHT JOIN

SELECT * FROM A RIGHT JOIN B ON A_B_ID = B_ID; 를 입력하면,
LEFT와는 반대로 B 테이블의 외래키 속성을 먼저 다 표현하고, A 테이블과 연관된 데이터들을 표현한다.
사실상 위 구문은 SELECT * FROM B LEFT JOIN A ON A_B_ID = B_ID 와 같은 표현이다.
TIP?? : 모든 데이터를 표현하고 싶은 테이블을 LEFT 의 경우 왼쪽에 RIGHT의 경우 오른쪽에 배치함
SELECT * FROM [모든 튜플 표현하고 싶은 테이블1] LEFT JOIN ON [테이블1 외래키] = [테이블2 외래키];
SELECT * FROM [연관된 테이블1] RIGHT JOIN [모든 튜플 표현하고 싶은 테이블2] ON [테이블1 외래키] = [테이블2 외래키];
LEFTRIGHT 중 직관적으로 이해가 잘되는 구문 하나를 정확히 이해하자.

4. FULL OUTER JOIN

FULL OUTER JOIN 의 경우 모든 데이터를 합쳐서 표현해준다.
LEFT JOINRIGHT JOIN 이 중복 제거된 상태로 합쳐진 모습과 같다.

5. A-B

A-B 는 쉽게 생각하면, 먼저 A의 데이터를 전부 표현한 다음에, B와 겹치는 데이터를 삭제한 결과라고 생각하면 된다.
따라서 SELECT * FROM A LEFT JOIN B ON A_B_ID = B_ID 를 사용하면 위와 같이 A의 데이터는 전부 표현될 것이다.
여기서 B_ID IS NULL 값인 조건을 추가해주면, 원하는 A-B 를 얻을 수 있다. (A_B_ID IS NULL 조건으로 추가해도 됨)

6. (A-B) U (B-A)

직관적으로 이해해보자면, 각 테이블을 FULL OUTER JOIN 해준후, 데이터가 NULL 값이 없는 온전한 튜플들을 제외시킨 테이블이다.
뒤에 WHERE A_ID IS NULL OR B_ID IS NULL; 조건을 WHERE A_B_ID IS NULL OR B_ID IS NULL 로 해도 동일한 결과 일 것이다.
두 테이블의 외래키가 NULL 인 조건으로 생각하는게 쉬울 것 같다.

테이블 별칭 지정

위와 같이 두개의 테이블이 외래키 ID로 연관되어 있을 때, 조인한 후 A의 ID 가 NULL 인 데이터를 얻고 싶을 때,
위에서 배웠던대로 적용해보려고 하면,
SELECT * FROM A LEFT JOIN B ON ID = ID WHERE ID = NULL;
Plain Text
복사
두 속성의 이름이 같아서, 쿼리문이 제대로 실행되지 않는다.
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID WHERE A.ID = NULL;
Plain Text
복사
위와 같이 . 을 사용해서 구분해주거나
SELECT * FROM A T1 LEFT JOIN B T2 ON T1.ID = T2.ID WHERE T1.ID = NULL;
Plain Text
복사
테이블 명이 길어서 입력하기 귀찮(?)거나 가독성이 떨어지는 경우 테이블 명을 지정해서 사용할 수도 있다.