topic, author, profile 테이블로 실습




기준이 되는 표를 왼쪽에 두고, 이 표를 기준으로 오른쪽의 표를 합성해서 하나의 표를 만드는 방법이다.
topic 테이블의 author_id와 author 테이블의 aid가 같은 데이터 LEFT JOIN
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid;
❗ LEFT JOIN은 왼쪽의 모든 행을 조회한다. topic.author_id 필드 값이 null 이면 author 테이블은 해당 행이 존재하지 않으므로 해당 행의 필드 값들은 null로 채워진다.
위 데이터에 profile_id와 profile 테이블의 pid가 같은 데이터 LEFT JOIN
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid LEFT JOIN profile ON author.profile_id = profile.pid;

두 테이블의 교집합을 나타낸다. 겹치지 않는 행이 존재할 경우, 그 행은 결과에서 제외된다.
SELECT * FROM topic INNER JOIN author ON topic.author_id = author.aid;
LEFT JOIN과 비교했을 때 author_id 필드 값이 null인 행의 데이터가 사라졌다.
❗ SQL 쿼리문에서 JOIN만 입력할 경우 기본 값이 INNER JOIN이다.
SELECT * FROM topic JOIN author ON topic.author_id = author.aid JOIN profile ON author.profile_id = profile.pid;

두 테이블의 합집합을 나타낸다.
SELECT * FROM topic FULL OUTER JOIN author ON topic.author_id = author.aid;
많은 DB에서 FULL OUTER JOIN을 지원하지 않는다. 따라서, LEFT JOIN, RIGHT JOIN, UNION을 활용하여 FULL OUTER JOIN을 구현할 수 있다.
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid
UNION
SELECT * FROM topic RIGHT JOIN author ON topic.author_id = author.aid;
❗ UNION = UNION (DISTINCT)
UNION은 UNION DISTINCT에서 DISTINCT가 생략된 표기법이다. 따라서, UNION을 사용해 테이블을 합칠 때 중복을 제거한다.
topic 테이블에만 존재하는 tid = 4 row, author 테이블에만 존재하는 aid = 3 row가 모두 출력되는 것을 확인할 수 있다.