보통 데이터베이스는 하나의 테이블에 많은 데이터를 저장하지 않고 몇 개의 테이블로 나누어 저장한다. 이처럼 여러 개로 나뉜 데이터를 하나로 묶어 결과를 내는 방법이 테이블 결합
이다.
먼저 곱집합
은 합집합과 교집합처럼 집합의 연산 방법 중 하나로 두 개의 집합을 곱하는 연산 방법이다. 특히 야구팀들의 대진표를 짜는 것과 비슷하다고 생각하면 쉽다.
집합 X = {a,b,c} Y ={1,2,3} 이라면 두 집합의 곱집합은 (a,1),(a,2),,,,,,(c,2),(c,3)이런 결과가 나온다.
데이터 베이스의 테이블은 집합의 한 종류라고 할 수 있다. 따라서 테이블을 두개 지정하면 이들은 곱집합으로 계산된다.
select * from 테이블명1, 테이블명2
즉, from 구에 복수의 테이블을 지정하면 교차결합
을 한다.
두 개의 테이블을 결합하는 것 뿐만 아니라 세개,네개의 테이블을 결합하는 것이 가능하다. 하지만 이 때 집합이 거대해지므로 교차결합보다 내부결합
이 더 많이 사용된다.
먼저 내부 결합을 설명하기 전에 데이터 베이스의 테이블에는 기본기(Primary key)
를 가지도록 하는 게 좋다. 또한 동일한 데이터를 중복해서 저장하지 않도록 해야한다. 만약 데이터가 변경되는 경우 여기 저기 동일 값으로 변경하기 어렵기 때문이다. 이 때 기본키는 하나의 데이터 행을 대표할 수 있는 속성을 가진다.
예를들어 상품의 가격이나 이름과 같은 데이터를 저장하는 '상품 테이블'이 있을 경우 상품명을 기본키로 한다면 값이 중복될 수 있으므로 상품코드를 기본키로 정할 수 있다.
만약 이렇게 '상품
'테이블과 '재고수
'테이블이 존재할 때 상품코드를 통해 두 테이블을 연결할 수 있다.
먼저 저 두 테이블을 이용해 상품명과 상품분류를 한 번에 가져오고자 할때 먼저 테이블을 결합해야한다.
select * from 상품, 재고수;
두 테이블을 먼저 복수로 지정하면 곱집합으로 계싼이 되는데 행은 총 3 x 3 = 9 행이된다. 이 때 만들어진 집합에서 원하는 조건을 검색하기 위해 where구를 사용하면 된다. 중요한 건 먼저 상품코드가 같다는 조건이 필요하다.
select * from 상품, 재고수 where 상품.상품코드 = 재고수.상품코드;
이렇게 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것을 내부결합(INNER JOIN)
이라고 한다. 이제는 상품분류가 '식료품'이라는 조건이 필요하다. 이 조건을 where 문에 추가해야한다.
select * from 상품, 재고수 where 상품.상품코드 = 재고수.상품코드 and 상품.상품분류 = '식료품';
여기서 더 나아가 상품명과 재고수만 반환할 수 있다.
select 상품.상품명, 재고수.재고수 from 상품, 재고수 where 상품.상품코드 = 재고수.상품코드 and 상품.상품분류 = '식료품';
이렇게 원하는 결과를 만들 수 있다. where구에는 두 개의 조건식이 지정되어 있는데 첫번째는 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것이고, 두번째는 결합 조건이 아닌 검색 조건이다. 그리고 첫 번째 조건식의 조건을 결합조건이라고 부른다.
위의 결합방법을 정리하자면
하지만 위의 방법은 모두 구식이다.;;;;;;;;;;;;;;;;
최근에는 INNER JOIN키워드를 사용한 결합방법이 일반적으로 통용된다. 위의 사례를 INNER JOIN로 같은 결과 값을 얻을 수 있다.
select 상품.상품명, 재고수.재고수
from 상품 inner join 재고수 on 상품.상품코드 = 재고수.상품코드
where 상품.상품분류 = '식료품';
구식으로는 .
로 구분해 테이블을 from 구에 지정한 반면에 테이블과 테이블 사이에 inner
join
이라는 키워드를 넣으면 된다. 또한 구식방법으로는 where에 결합조건을 지정했지만 inner join에서는 on
을 사용해서 결합 조건을 지정한다.