테이블 결합

유석현(SeokHyun Yu)·2022년 8월 19일
0

SQL

목록 보기
32/45
post-thumbnail

서론

테이블의 집합 연산에서는 세로(행) 방향으로 데이터가 늘어나거나 줄어드는 계산을 했었다.

이제부터 설명하는 결합에서는 가로(열) 방향으로 데이터가 늘어나는 계산이 된다.

보통 데이터베이스는 하나의 테이블에 많은 데이터를 저장하지 않고 몇 개의 테이블로 나누어 저장한다.

이처럼 여러 개로 나뉜 데이터를 하나로 묶어 결과를 내는 방법이 테이블 결합이다.

여기서 결합을 이해하는 동시에 기본이 되는 개념이 집합론의 '곱집합'이다.


1. 곱집합과 교차결합

지금까지의 SELECT 명령에서는 FROM 구에 하나의 테이블만 지정했다.

만약 테이블을 두 개 지정하면 이들은 곱집합으로 계산된다.

구체적인 예제를 살펴보기 전에 필요한 예제 테이블들의 데이터부터 확인해 두겠다.

지금부터 사용할 테이블은 sample_xsample_y 이다.

SELECT * FROM sample_x;

SELECT * FROM sample_y;

그럼 두 테이블의 곱집합을 구해보자.

SELECT * FROM sample_x, sample_y;

실행 결과, 집합이 곱집합처럼 계산된 것을 알 수 있다.

이처럼 FROM 구에 복수의 테이블을 지정하면 '교차결합'을 한다.

교차결합은 두 개의 테이블을 곱집합으로 계산한다.


2. 내부결합

FROM 구에 테이블을 복수로 지정하면 곱집합으로 계산되는 것을 알았다.

하지만 테이블 수가 많아지면 조합 수가 엄청나게 늘어나 집합이 거대해지는데, 이렇게 많은 테이블을 교차결합하는 경우는 드물다.

실제로 교차결합보다 '내부결합'이라는 결합 방법이 자주 사용된다.

그럼 내부결합이란 어떤 것인지 알아보자.

그전에, 내부결합에 적합한 테이블로 데이터를 업데이트 했으니 SELECT 명령으로 확인해보자.

SELECT * FROM sample_x;

SELECT * FROM sample_y;

두 테이블이 교차결합된 결과도 한 번 살펴보자.

SELECT * FROM sample_x, sample_y;

이렇게 만들어진 집합에서 원하는 데이터를 검색하기 위해 WHERE 구로 조건을 지정할 수 있다.

먼저 id가 같다는 조건이 필요하다.

그런데 두 테이블 모두 열의 이름이 id로 같기 때문에 테이블마다 별명을 지정해주도록 하겠다.

SELECT * FROM sample_x AS x, sample_y AS y WHERE x.id = y.id;

이렇게 교차결합된 집합에서 원하는 조합을 WHERE 구를 통해 검색하는 것을 '내부결합(Inner Join)'이라 부른다.


3. INNER JOIN으로 내부결합하기

사실 지금까지 설명한 내부결합의 방법은 옛날 방식이다.

최근에는 INNER JOIN 키워드를 사용한 결합방법이 일반적으로 통용된다.

그럼, 지금부터 위의 두 테이블을 이용한 사례를 INNER JOIN을 활용해 바꾸어보겠다.

SELECT * FROM sample_x AS x INNER JOIN sample_y AS y ON x.id = y.id;

옛날 방식에서는 쉼표(,)로 테이블을 구분하여 FROM 구에 지정했다.

새로운 형식에서는 테이블과 테이블 사이에 'INNER JOIN'이라는 키워드를 넣는다.

여기서 INNER는 '안쪽'이라는 의미이며 JOIN은 '연결시킨다'라는 의미이다.

즉, 'INNER JOIN'은 '내부결합'이라는 의미가 된다.

구식 방법에서는 WHERE 구에 결합조건을 지정했지만 INNER JOIN에서는 ON을 사용하여 결합조건을 지정한다.


4. 외부결합

결합 방법은 크게 내부결합외부결합의 두 가지로 구분된다.

지금까지 설명했던 내용이 내부결합이다.

여기서부터는 외부결합에 대해 설명하겠다.

외부결합이라고 해도 교차결합된 집합을 결합 조건을 지정하여 검색한다는 기본적인 사고 방식은 같다.

외부결합은 '어느 한 쪽에만 존재하는 데이터행을 어떻게 다룰지'를 변경할 수 있는 결합 방법이다.

위에서 살펴보았던 sample_x 테이블과 sample_y 테이블 중에 sample_x 테이블에만 행이 존재하는 상황을 가정해보자.

SELECT * FROM sample_x;

sample_x 테이블에 id가 4인 행을 새롭게 추가했다.

하지만 sample_y 테이블에는 아직 id가 4인 행이 없다.

이런 상태에서 곱집합을 구해도 '4 = 4'가 되는 행은 존재하지 않으므로 내부결합 결과에서는 id가 4인 행이 제외된다.

SELECT * FROM sample_x AS x INNER JOIN sample_y AS y ON x.id = y.id;

이럴 경우에 외부결합을 사용하면 된다.

외부결합은 결합하는 테이블 중에 어느 쪽을 기준으로 할지 결정할 수 있다.

여기서는 sample_x 테이블(결합의 왼쪽)을 기준으로 INNER JOIN 대신 LEFT JOIN을 사용해보겠다.

sample_y 테이블에는 id가 4인 데이터가 없으므로 값이 NULL로 표시된다.

기준이 되는 테이블을 JOIN의 왼쪽에 기술했으므로 LEFT JOIN을 사용했다.

기준이 되는 테이블을 오른쪽에 지정하는 경우에는 RIGHT JOIN을 사용해 외부결합을 시행하면 된다.

RIGHT JOIN을 사용한 결과도 한 번 살펴보자.

sample_y 테이블을 기준으로 했기 때문에 LEFT JOIN 때처럼 id가 4인 행이 출력되지는 않는다.

이처럼 LEFT JOIN과 RIGHT JOIN의 출력 결과가 다를 수도 있다는 점을 주의하자.

profile
Backend Engineer

0개의 댓글