16강 SQL이 뭐지? PostgreSQL LEFT JOIN
PostgreSQL
SQL이 뭐지? 16강 시작합니다.
이번 강의에서는
▶ PostgreSQL LEFT JOIN clause
에 대해서 알아보겠습니다.
지난 강의 14강에서 살펴본 JOIN에 대해서 하나씩 심화 학습하는 시간입니다.
Introduction to PostgreSQL LEFT JOIN clause
ERD에서 테이블 간의 관계를 나타내는 방법에 대해서는 별도 강의를 준비해보겠습니다. |
A와 B 두 개의 테이블이 있다고 가정합니다.
A에서 B는 1 대 N 관계이고 optional입니다. (있거나, 없을 수도 있다)
B에서 A는 N 대 1 관계이고 mandatory입니다. (필수로 있다.)
A의 각 행은 B에 0개 또는 다수의 대응하는 행을 가질 수 있지만, B의 각 행은 A에 하나의 대응하는 행을 가질 수 있다.
테이블 B에 해당하는 행이 있거나 없는 데이터를 테이블 A에서 선택하려면 LEFT JOIN 절을 사용합니다.
다음 문은 테이블 A와 테이블 B를 결합하는 LEFT JOIN 구문을 보여줍니다.
SELECT
pka,
c1,
pkb,
c2
FROM
A
LEFT JOIN B ON pka = fka
;
LEFT JOIN을 사용하여 테이블 A를 테이블 B와 결합하려면 다음 단계를 수행
먼저 SELECT 절에서 데이터를 선택할 두 테이블의 열을 지정합니다.
둘째, FROM 절에서 왼쪽 테이블(테이블 A)을 지정합니다.
셋째, LEFT JOIN 절에 오른쪽 테이블(테이블 B)을 지정하고 ON 키워드 뒤에 조인 조건을 지정합니다.
LEFT JOIN 절이 왼쪽 테이블에서 데이터 선택을 시작합니다. 왼쪽 테이블의 각 행에 대해 pka 열의 값과 오른쪽 테이블의 fka 열의 각 행 값을 비교합니다.
이러한 값이 같으면 왼쪽 조인 절은 SELECT 절에 나타나는 열이 포함된 새 행을 생성하고 이 행을 결과 집합에 추가합니다.
이러한 값이 동일하지 않은 경우 왼쪽 조인 절은 SELECT 절에 나타나는 열이 포함된 새 행도 만듭니다. 또한 오른쪽 테이블의 열을 NULL로 채웁니다.
다음 Venn 다이어그램은 LEFT JOIN 절의 작동 방식을 보여줍니다.
LEFT JOIN과 LEFT OUTER JOIN 같은 것입니다.
PostgreSQL LEFT JOIN examples
샘플 데이터베이스에서 다음 필름 및 인벤토리 테이블을 보면,
film : inventory는 1 : N이고 optional
inventory : film은 n : 1이고 mandatory
필름 테이블의 각 행은 인벤토리 테이블에서 0개 또는 다수의 행을 가질 수 있다.
인벤토리 테이블의 각 행에는 필름 테이블의 행이 하나만 있습니다.
film_id 열은 필름과 인벤토리 테이블 간의 링크를 설정합니다.
LEFT JOIN 절을 사용하여 film 테이블을 inventory 테이블과 결합
SELECT
film.film_id,
title,
inventory_id
FROM
film
LEFT JOIN inventory
ON inventory.film_id = film.film_id
ORDER BY title
;
71번째 행을 보면, 필름 테이블의 행에 인벤토리 테이블에 일치하는 행이 없는 경우 이 행의 inventory_id 열의 값은 NULL입니다.
인벤토리에 없는 필름을 찾기 위한 WHERE 절
SELECT
film.film_id,
film.title,
inventory_id
FROM
film
LEFT JOIN inventory
ON inventory.film_id = film.film_id
WHERE inventory.film_id IS NULL
ORDER BY title
;
테이블 별칭을 사용하여 쿼리를 변경해 보면,
SELECT
f.film_id,
title,
inventory_id
FROM
film f
LEFT JOIN inventory i
ON i.film_id = f.film_id
WHERE i.film_id IS NULL
ORDER BY title
;
여러분도 테이블 별칭을 사용하는 습관을 들이세요.
또한, 두 테이블 모두 ON 절에 사용된 열 이름이 동일한 경우 다음과 같이 USING 구문을 사용할 수 있습니다.
SELECT
f.film_id,
title,
inventory_id
FROM
film f
LEFT JOIN inventory i USING (film_id)
WHERE i.film_id IS NULL
ORDER BY title
;
위 세 가지 쿼리는 모두 동일한 결과를 보여줍니다.
이 방법은 한 테이블에서 다른 테이블에 일치하는 행이 없는 행을 선택하려는 경우 유용합니다.
이 강의에서는 한 테이블에서 다른 테이블에 해당하는 행이 있거나 없을 수 있는 행을 선택하는
PostgreSQL LEFT JOIN 절을 사용하는 방법에 대해 배웠습니다.
감사합니다.
본 강의는 PostgreSQL Tutorial을 참조합니다.
실습용 테이블에 대해서는 3강을 참조하세요.
Do it! SQL을 찾아 주셔서 감사합니다. 여러분의 댓글이 큰 힘이 됩니다. |
'IT > SQL 기초강좌 (PostgreSQL)' 카테고리의 다른 글
18강 SQL이 뭐지? PostgreSQL Self-Join (1) | 2022.12.18 |
---|---|
17강 SQL이 뭐지? PostgreSQL RIGHT JOIN (2) | 2022.12.17 |
15강 SQL이 뭐지? PostgreSQL INNER Join (2) | 2022.12.17 |
14강 SQL이 뭐지? PostgreSQL Join (4) | 2022.12.16 |
13강 SQL이 뭐지? PostgreSQL Table Aliases (2) | 2022.12.16 |
댓글