PostgreSQL - 조인

안녕하세요, 데이터베이스 열정가 여러분! 오늘 우리는 PostgreSQL 조인의 세계에서 흥미로운 여정을 시작할 것입니다. 여러분의 친절한 이웃 컴퓨터 교사로서, 저는 이 모험을 단계별로 안내해 드리겠습니다. 걱정하지 마세요. 코드를 한 줄도 작성해 본 적이 없더라도, 우리는 기본부터 차근차근 진행하겠습니다. 그럼 가상의 안전帽을 쓰고, 함께 들어보겠습니다!

PostgreSQL - Joins

조인이란?

다양한 조인 유형에 뛰어들기 전에, 조인이 정확히 무엇인지 이해해 보겠습니다. 큰 파티를 계획하는 상상을 해보세요 (누가 데이터베이스 파티를 좋아하지 않을까요?). 여러분의 친구들의 이름과 그들의 좋아하는 음료 목록이 두 개 있습니다. 조인은 마법의 파티 기획자처럼 이 두 목록을 다양한 방법으로 결합하여 완벽한 손님 명단을 만들어주는 것입니다.

데이터베이스 용어로, 조인은 두 개 이상의 테이블에서 관련된 열을 기준으로 행을 결합할 수 있게 해줍니다. 이제 PostgreSQL이 제공하는 다양한 조인 유형을 탐구해 보겠습니다.

크로스 조인

크로스 조인이란?

크로스 조인은 두 목록에 있는 모든 사람을 파티에 초대하는 것입니다. 음료 선호도를 알지 않아도 상관없습니다. 첫 번째 테이블의 모든 행을 두 번째 테이블의 모든 행과 결합합니다.

크로스 조인 예제

다음과 같은 두 개의 간단한 테이블을 만들어 보겠습니다:

CREATE TABLE friends (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);

CREATE TABLE drinks (
id SERIAL PRIMARY KEY,
drink VARCHAR(50)
);

INSERT INTO friends (name) VALUES ('Alice'), ('Bob'), ('Charlie');
INSERT INTO drinks (drink) VALUES ('Cola'), ('Juice'), ('Water');

이제 크로스 조인을 수행해 보겠습니다:

SELECT f.name, d.drink
FROM friends f
CROSS JOIN drinks d;

결과:

name drink
Alice Cola
Alice Juice
Alice Water
Bob Cola
Bob Juice
Bob Water
Charlie Cola
Charlie Juice
Charlie Water

과 같이 보입니다. 모든 친구가 모든 음료와 짝을 이루고 있습니다. 이는 실제로는 항상 실용적이지 않을 수 있지만, 모든 가능한 조합을 생성하는 좋은 방법입니다.

내부 조인

내부 조인이란?

내부 조인은 더 선택적입니다. 친구들이 좋아하는 음료를 매칭시키지만, 좋아하는 음료가 알려진 친구들만 포함됩니다.

내부 조인 예제

테이블을 약간 수정해 보겠습니다:

CREATE TABLE friends (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);

CREATE TABLE favorite_drinks (
id SERIAL PRIMARY KEY,
friend_id INTEGER,
drink VARCHAR(50)
);

INSERT INTO friends (name) VALUES ('Alice'), ('Bob'), ('Charlie'), ('David');
INSERT INTO favorite_drinks (friend_id, drink) VALUES (1, 'Cola'), (2, 'Juice'), (3, 'Water');

이제 내부 조인을 수행해 보겠습니다:

SELECT f.name, fd.drink
FROM friends f
INNER JOIN favorite_drinks fd ON f.id = fd.friend_id;

결과:

name drink
Alice Cola
Bob Juice
Charlie Water

David는 좋아하는 음료가 등록되어 있지 않으므로 결과에 나타나지 않습니다.

왼쪽 외부 조인

왼쪽 외부 조인이란?

왼쪽 외부 조인은 모든 친구들이 손님 명단에 포함되도록 하는 것입니다. 음료 선호도가 알려지지 않은 사람들은 기본 음료나 음료가 없을 수 있습니다.

왼쪽 외부 조인 예제

INNER 조인 예제와 같은 테이블을 사용합니다:

SELECT f.name, fd.drink
FROM friends f
LEFT OUTER JOIN favorite_drinks fd ON f.id = fd.friend_id;

결과:

name drink
Alice Cola
Bob Juice
Charlie Water
David NULL

David는 포함되었지만, 음료는 NULL입니다. 이는 왼쪽 외부 조인의 마법입니다!

오른쪽 외부 조인

오른쪽 외부 조인이란?

오른쪽 외부 조인은 왼쪽 외부 조인의 반대입니다. 모든 음료가 메뉴에 포함되도록 하지만, 아무도 선택하지 않은 음료도 포함됩니다.

오른쪽 외부 조인 예제

새로운 음료를 추가해 보겠습니다:

INSERT INTO favorite_drinks (drink) VALUES ('Lemonade');

SELECT f.name, fd.drink
FROM friends f
RIGHT OUTER JOIN favorite_drinks fd ON f.id = fd.friend_id;

결과:

name drink
Alice Cola
Bob Juice
Charlie Water
NULL Lemonade

Lemonade는 친구 중 누구도 선택하지 않은 음료이지만, 목록에 나타납니다.

전체 외부 조인

전체 외부 조인이란?

전체 외부 조인은 파티 기획자의 꿈입니다. 모든 친구와 모든 음료를 포함하며, 가능한 경우 매칭시킵니다. 매칭되지 않은 경우 NULL을 사용합니다.

전체 외부 조인 예제

SELECT f.name, fd.drink
FROM friends f
FULL OUTER JOIN favorite_drinks fd ON f.id = fd.friend_id;

결과:

name drink
Alice Cola
Bob Juice
Charlie Water
David NULL
NULL Lemonade

이렇게 하면 모든 친구와 모든 음료의 완전한 그림을 얻습니다.

결론

이제 여러분은 PostgreSQL 조인의 세계를 여행한 것입니다. 모든 것이 포함된 크로스 조인에서 포괄적인 전체 외부 조인까지. 올바른 조인을 선택하는 것은 파티에 적절한 혼합물을 선택하는 것과 같습니다. 필요한 정보와 데이터를 어떻게 결합하고 싶은지에 따라 다릅니다.

이 조인들을 연습하고, 다양한 시나리오를 실험해 보세요. 곧 데이터베이스 파티의 별이 되실 것입니다! 데이터 관리가 이렇게 재미있을 줄이谁知道呢? 다음 시간까지, 즐거운 쿼리 작성을 기원합니다!

Credits: Image by storyset