본문 바로가기
CS/DataBase

데이터베이스 첫걸음 정리 - 32장. 테이블 결합

by yongckim 2022. 10. 3.
728x90
반응형

테이블 결합

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

여러개로 나뉘어진 테이블을 하나로 묶어 결과를 낼 수 있는 방법이 테이블 결합입니다.

테이블 결합의 경우 집합론의 “곱집합”과 유사합니다.

곱집합

곱집합은 합집합이나 교집합 처럼 집합의 연산 방법 중 하나로 두 개의 집합을 곱하는 연산입니다.

예를 들어 다음과 같은 집합이 있다고 가정해봅시다.

집합 A는 {A, B, C}를 가지고 있고 집합 B는 {1, 2, 3}이라는 세 개의 요소를 가집니다.

여기서 A와 B를 곱집합으로 계산하면 다음과 같이 계산됩니다.

곱집합 결과를 보면 A와 B를 조합한 모든 결과가 나오는 것을 알 수 있습니다.

교차결합(Cross Join)

테이블을 곱집합으로 연산하고 싶을 경우 **교차결합(Cross Join)**을 사용할 수 있습니다.

SELECT * FROM 테이블명1, 테이블명2, ...

여태까지 FROM 구에는 하나의 테이블만 지정했지만 두개 이상을 지정할 경우 이들은 곱집합으로 계산됩니다.

먼저 다음과 같은 테이블이 존재한다고 가정해봅시다.

이 두 테이블을 교차 결합으로 묶어봅시다.

SELECT * FROM table_x, table_y;

UNION 연결과 결합 연결의 차이

UNION을 사용하는 경우 세로 방향으로 값이 더해지고 FROM로 테이블을 결합할 때는 가로 방향으로 더해지게 됩니다.

내부 결합

FROM 구에 테이블을 복수로 지정하면 곱집합으로 계산됩니다.

하지만 테이블에 여러개의 테이블을 지정하게 될 경우 조합 수가 엄청나게 늘어나며 집합이 거대해질 수 있습니다.

이렇게 여러개의 테이블을 교차결합하는 경우는 드물고 대신 내부결합이 자주 사용됩니다.

 

관계형 데이터베이스에서 테이블의 데이터는 유일한 값을 가지도록 권장합니다. (간단히 말하면 기본키를 가지는 상태)

서로 다른 테이블에서 유일한 값을 이용하여 서로 다른 테이블을 연결할 수 있습니다.

예를 들어 다음과 같은 테이블이 있다고 가정해봅시다.

여기서 product(상품)의 id로 stock(재고 수)의 현황을 알고 싶다고 가정해봅시다.

여기서 stock의 id가 product의 id를 가르키는 상황이라고 가정하면 product의 id와 stock의 id를 이용하여 데이터를 참조할 수 있습니다.

참조할 데이터는 참조하는 테이블의 기본키와 동일한 이름과 자료형으로 열을 만들어서 연결하는 경우가 많습니다.

이제 product 테이블의 id와 stock 테이블의 id를 WHERE로 연결하여 교차 결합을 진행해봅시다.

SELECT * FROM product, stock
WHERE product.id=stock.id;

product와 stock 테이블이 잘 연결된 것을 확인할 수 있습니다.

이런식으로 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것을 “내부결합(Inner Join)”이라고 합니다.

여기서 **내부결합을 위해 사용하는 조건식을 “결합조건”**이라고 부릅니다.

INNER JOIN으로 내부결합하기

사실 내부결합을 하기 위해 교차 결합 후 WHERE을 이용하여 원하는 조합을 검색하는 방법은 옛날에 사용하던 방법입니다.

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

SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건

방금 작성한 내부결합 구문을 INNER JOIN으로 변경하면 다음과 같습니다.

SELECT *
FROM product INNER JOIN stock
ON product.id = stock.id;

외부키

다른 테이블의 기본키를 참조하는 열을 외부키라고 부릅니다.

이전에 테이블을 내부결합했을때 product의 id와 stock의 id를 이용하여 결합했습니다.

여기서 product 테이블의 id를 stock의 id가 참조하여 결합했기 때문에 product 테이블의 id는 기본키, stock테이블의 id가 외부키가 됩니다.

여기서 기본키와 외부키의 관계에 따라 일대일, 일대다, 다대일 등의 테이블간의 관계가 정해집니다.

자기결합

자기 결합은 테이블에 별명을 붙일 수 있는 기능을 이용해 같은 테이블끼리 결합하는 것을 말합니다.

SELECT p1.name, p2.name
from product p1 INNER JOIN product p2
ON p1.id=p2.id;

자기 결합을 하기 위해서는 구별을 위해 테이블명에 별명을 붙여 구분을 해주어야 합니다.

사실 평소에는 자기결합을 할 경우가 없지만 자기 자신의 기본키를 참조하는 열을 자기 자신이 가지는 데이터 구조로 되어있을 경우 자주 사용됩니다.

외부결합

결합 방법은 크게 내부결합과 외부결합으로 나뉩니다.

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

외부결합은 “어느 한 쪽에만 존재하는 데이터행을 어떻게 다룰지”에 대한 결합 방법입니다.

먼저 다음과 같은 테이블이 존재한다고 가정해봅시다.

d라는 상품은 stock 테이블에 존재하지 않기 때문에 내부결합으로는 해당 상품을 확인할 수 없습니다.

SELECT product.name, stock.count 
FROM product 
INNER JOIN stock 
ON product.id=stock.id 
WHERE product.category="A";

이런 경우에 외부 결합을 사용하면 데이터를 확인할 수 있습니다.

product 테이블을 기준으로 INNER JOIN 대신 LEFT JOIN을 사용해보겠습니다.

SELECT product.name, stock.count 
FROM product 
LEFT JOIN stock 
ON product.id=stock.id 
WHERE product.category="A";

여기서 stock 테이블에는 d에 대한 데이터가 없으므로 NULL이 표시되게 되지만 d라는 상품에 대해 확인할 수 있습니다.

만약 상품 테이블을 오른쪽에 지정하고 싶은 경우에는 RIGHT JOIN을 사용해서 외부결합을 하면 됩니다.

정리

  • FROM 구에 테이블을 복수 지정가로 방향으로 테이블을 결합할 수 있다.
  • 조건을 지정하지 않고 FROM구에 테이블을 복수 지정하면 교차결합(CROSS JOIN)을 할 수 있습니다.
  • UNION과 테이블결합의 차이UNION을 사용하는 경우 세로 방향으로 값이 더해지고 FROM로 테이블을 결합할 때는 가로 방향으로 더해지게 됩니다.
  • WHERE 조건을 지정해 곱집합에서 필요한 조합만 검색하여 내부결합(INNER JOIN)을 할 수 있습니다. (단, INNER JOIN 키워드를 사용하는 것을 권장합니다.)
  • 다른 테이블의 기본키를 참조하는 열외부키라고 부릅니다.
  • 기본키와 외부키의 관계에 따라 일대일, 일대다, 다대일 등의 테이블간의 관계가 정해집니다.
  • 자기 결합은 테이블에 별명을 붙일 수 있는 기능을 이용해 같은 테이블끼리 결합하는 것입니다.
  • 외부결합(OUTER JOIN)은 어느 한 쪽에만 존재하는 데이터행을 어떻게 다룰지에 대한 결합 방법입니다.
  • 외부결합은 왼쪽(FROM에 작성한 테이블이 왼쪽)으로 결합할지(LEFT JOIN) 오른쪽(JOIN 키워드 이후에 나오는 테이블)으로 결합할지(RIGHT JOIN) 정할 수 있습니다.
반응형