사실 DataCamp를 통해 SQL Fundamentals 과정을 따라가면서 추가적인 결제가 필요한 상황에 마주하게 됐다. 고민 끝에 이전에 결제해두었던 패스트캠퍼스의 SQL/DB 올인원 패키지 강좌를 수강하는 것으로 대체하여 진행하기로 하였다. 그 과정에서 해당 강의가 SQL 실습을 위해 사용하는 PostgreSQL을 설치하게 되었다.
강의는 SELECT문의 기초부터 시작하지만 이의 내용들은 기존에 작성했던 글에 내용을 추가하는 방식으로 진행하고, JOIN에 대한 부분부터 새로 글을 작성하려 한다.
OUTER JOIN
특정 컬럼을 기준으로 매칭된 집합을 출력하지만 한 쪽의 집합은 모두 출력하고 다른 한쪽의 집합은 매칭되는 컬럼의 값만을 출력한다. OUTER JOIN은 대표적으로 LEFT/RIGHT/FULL OUTER JOIN으로 나뉘어진다.
쿼리를 작성할 시, INNER JOIN과 달리 OUTER JOIN에서는 OUTER를 생략하고 LEFT/RIGHT/FULL JOIN으로 표기 가능하다.
LEFT OUTER JOIN
LEFT JOIN은 왼쪽의 테이블의 데이터가 모두 출력되고 오른쪽 테이블은 왼쪽 테이블 데이터와 매칭되는 데이터만 출력된다.
각각 id, fruit 컬럼을 가지는 basket_a, basket_b 테이블을 LEFT JOIN한 결과이다.
SELECT
a.id id_a, a.fruit fruit_a,
b.id id_b, b.fruit fruit_b
FROM basket_a a
LEFT JOIN basket_b b
ON a.fruit = b.fruit;
LEFT OUTER JOIN (LEFT ONLY)
현재 두 개의 컬럼을 가지고 있는 basket_a와 basket_b에서, 둘을 LEFT JOIN할 때, basket_a 테이블에만 있는 데이터를 조회하기 위해서는 basket_b 테이블의 정보가 null인 데이터를 찾으면 된다. (과일명으로 조인하고 있기 때문에 basket_a 테이블에만 있는 과일명들이 조회된다.)
SELECT
a.id id_a, a.fruit fruit_a,
b.id id_b, b.fruit fruit_b
FROM basket_a a
LEFT JOIN basket_b b
ON a.fruit = b.fruit
WHERE b.id IS NULL;
RIGHT OUTER JOIN
RIGHT JOIN은 반대로 오른쪽의 데이터가 모두 출력되고 왼쪽 테이블은 오른쪽 테이블 데이터와 매칭되는 데이터만 출력된다.
SELECT
a.id id_a, a.fruit fruit_a,
b.id id_b, b.fruit fruit_b
FROM basket_a a
RIGHT JOIN basket_b b
ON a.fruit = b.fruit;
RIGHT OUTER JOIN (RIGHT ONLY)
위의 LEFT JOIN과 마찬가지로, 두 테이블을 RIGHT JOIN할 때, 오른쪽 테이블에만 있는 데이터를 조회하기 위해서는 왼쪽 테이블의 정보가 null인 데이터를 찾으면 된다.
SELECT
a.id id_a, a.fruit fruit_a,
b.id id_b, b.fruit fruit_b
FROM basket_a a
RIGHT JOIN basket_b b
ON a.fruit = b.fruit
WHERE a.id IS NULL;
FULL OUTER JOIN
FULL JOIN은 양 쪽 테이블의 데이터 모두를 출력한다. 즉, INNER/LEFT/RIGHT가 모두 합쳐진 형태라고 할 수 있다.
CROSS JOIN
Cartesian Product 라고도 하며, 조인되는 두 테이블에서의 곱집합을 반환한다. 예를 들어 A 테이블의 레코드가 2개, B 테이블의 레코드가 2개 있다면 모든 데이터들이 매칭될 수 있는 경우의 수는 4개다. 따라서 각 데이터가 매칭되는 모든 경우인 네 가지 데이터를 출력하게 된다.
NATURAL JOIN
특정 테이블의 같은 이름을 가진 컬럼 간의 조인집합을 출력한다. 즉, 컬럼명이 같을 때 자연스럽게 조인되는 형태이다.
'Database > PostgreSQL' 카테고리의 다른 글
SQL) IN 연산자 (0) | 2021.05.18 |
---|---|
SQL) LIMIT, FETCH를 통해 행의 수 한정하기, OFFSET 키워드로 인덱스 지정하기 (0) | 2021.05.15 |
SQL) INNER JOIN, CASE문, INTO (0) | 2021.05.01 |
SQL) GROUP BY절, HAVING절 - 그룹화하기 (0) | 2021.04.30 |
SQL) DISTINCT를 통한 중복 제거, ORDER BY 절을 통한 레코드 정렬 (0) | 2021.04.30 |