보통 데이터베이스는 하나의 테이블에 많은 데이터를 저장하지 않고 몇 개의 테이블로 나누어 저장한다.
이렇게 여러 개로 나뉜 데이터를 하나로 묶어 결과를 내는 방법이 테이블 결합이다.
여기서 결합을 이해하는 동시에 기본이 되는 개념이 집합론의 '곱집합'이다.
곱집합은 합집합이나 교집합처럼 집합의 연산 방법 중 하나이다.
두 개의 집합을 곱하는 연산 방법
으로 '적집합' 또는 '카티전곱(Cartesian product)'라고도 불린다.
데이터베이스의 테이블은 집합의 한 종류라고 할 수 있다.
SELECT 명령에서 FROM 구에 테이블을 두 개 지정하면 이들은 곱집합으로 계산된다.
실행결과, 야구의 대진표처럼 집합이 계산된 것을 알 수 있다.
FROM구에 복수의 테이블을 지정하면 교차결합(Cross Join)을 한다.
교차결합은 두 개의 테이블을 곱집합으로 계산한다.
CROSS JOIN은 UNION과 집합을 더해 새로 큰 집합을 만들어 낸다는 측면에서 비슷하지만 확대 방향이 다르다.
UNION으로 합집합을 구했을 경우 세로 방향으로 더해지는 반면,
CROSS JOIN으로 곱집합을 구할 경우 가로 방향으로 더해지게 된다.
만약 결합해야 할 테이블 수가 많아진다면 조합 수가 엄청나게 늘어나 집합이 거대해진다.
이렇게 많은 테이블을 교차 결합하는 경우는 드물다.
그래서 결합 방법으로는 교차결합보다 내부 결합이 자주 사용된다.
수학에서 집합은 유일한 요소로 구성되는데, 다시 말하자면 중복된 값이 존재하지 않는다는 뜻이다.
마찬가지로 관계형 데이터베이스에서도 테이블의 데이터가 유일한 값을 가지도록 권장한다.
간단히 말하면 기본키(primary key)를 가지도록 하는 게 좋다는 것이다.
위 테이블에서 상품명과 재고수만 출력하고 싶다 가정해보자.
위와 같이 두 개의 테이블이 존재할 때 FROM 구에서 테이블을 복수로 지정하면 곱집합으로 계산된다.
이렇게 만들어진 집합에서 원하는 데이터를 검색하기 위해 WHERE구로 조건을 지정한다.
그전에 먼저 상품코드가 같다는 조건이 필요하다.
이렇게 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것을 '내부 결합(Inner Join)'이라 한다.
결합 조건으로 보면 등결합이라고도 부를 수 있다.
다음으로, 상품분류가 식료품이라는 조건이 필요하다.
이 조건을 WHERE구에 추가할 경우 기존 조건식과 상품분류 조건식이 모두 참이어야 하므로 AND로 연결한다.
또한, 상품명과 재고수만 반환하도록 SELECT구에 열을 지정한다.
이렇게 원하는 결과를 얻게 되었다.
WHERE구에는 두 개의 조건식이 지정되어 있는데 첫 번째는 결합 조건, 두 번째는 검색 조건이다.
위에서 나열한 결합 방법은 구식으로, 최근 INNER JOIN 키워드를 사용한 결합 방법이 일반적으로 통용된다.
[SYNTAX]
SELECT 컬럼명
FROM 테이블명 1 INNER JOIN 테이블명
ON 결합조건
INNER JOIN은 내부 결합을 의미하고 결합 조건은 ON을 사용하여 지정한다.
그렇다면 또 다른 예제를 살펴보자.
이렇게 상품 2와 메이커라는 두 테이블이 있을 때 두 테이블을 결합하여 상품명과 메이커명을 같이 출력하고자 한다면
위처럼 출력할 수 있고, 테이블에 별명을 지정하여 코드를 더 짧게 작성할 수 있다.
여기에서 메이커 테이블의 메이커코드는 기본키이다. 그에 비해 상품 테이블의 메이커코드는 '외부 키'라 불리는 것으로, 다른 테이블의 기본키를 참조하는 열이 외부 키가 된다.
테이블에 별명을 붙이는 기능을 이용해 같은 테이블끼리 결합하는 자기 결합(Self Join)도 가능하다.
이렇게 자기 결합이 가능한데 평소 쓸 일은 거의 없다.
어떻게 보면 쓸모없는 쿼리일 수도 있으나, 자신의 기본키를 참조하는 열을 자기 자신이 가지는 데이터 구조로 되어 있을 경우 사용된다.
결합 방법에는 내부 결합 외에 외부 결합도 있는데, 외부 결합은 어느 한쪽에만 존재하는 데이터행을 어떻게 다룰지를 변경할 수 있는 결합 방법이다.
쉽게 설명하기 위해 예시로 설명해보자면
위의 두 개의 테이블이 존재할 때 상품 3 테이블은 상품코드가 0009인 추가 상품 행을 추가했지만 재고수 테이블에는 아직 이 상품에 대한 데이터가 없다.
이런 상태에서는 곱집합을 구해도 0009 = 0009가 되는 행은 존재하지 않으므로 내불 결합 결과에서는 상품코드가 0009인 상품이 제외된다.
이런 경우 외부 결합을 사용하면 된다.
외부 결합은 결합하는 테이블 중 어느 쪽을 기준으로 할지 결정할 수 있다.
내부 결합(Inner Join) 대신 상품 테이블(결합의 왼쪽)을 기준으로 LEFT JOIN을 사용해 쿼리를 작성해보면
상품번호가 0009인 추가 상품도 출력되는 것을 확인할 수 있다.
다만 재고수 테이블에 0009에 대한 데이터가 없어 값이 NULL로 표시된다.
기준이 되는 테이블을 JOIN의 왼쪽에 기술하면 LEFT JOIN이고, 오른쪽에 기술하면 RIGHT JOIN으로 사용하면 된다.
'Language > MySQL' 카테고리의 다른 글
[MySQL] 관계형 모델 (0) | 2022.12.21 |
---|---|
[MySQL] 집합 연산 - UNION (0) | 2022.12.19 |
[MySQL] 뷰 작성과 삭제 (0) | 2022.12.14 |
[MySQL] 인덱스 작성과 삭제 (0) | 2022.12.13 |
[MySQL] 인덱스 구조 (0) | 2022.11.24 |