32강 테이블 결합(JOIN)
테이블 결합은 RDBMS에서 매우 중요한 개념이다.
데이터베이스에서 여러 테이블로 나뉜 데이터를 하나로 묶어내는 방법이 테이블 결합이다. 여기서 결합을 이해하는 동시에 기본이 되는 개념이 집합론의 ‘곱집합’이다.
곱집합과 교차결합
곱집합
곱집합은 두 개의 집합을 곱하는 연산 방법으로 적집합
또는 카티전곱(Cartesian product)
라고도 불린다.
교차결합 (Cross Join)
데이터베이스의 테이블은 집합의 한 종류이다. 만약 SELECT
명령에서 FROM
구에 테이블을 두 개 지정한다면 이들은 곱집합으로 계산된다.
SELECT * FROM table1, table2;
위처럼 FROM
구에 복수의 테이블을 지정하면 교차결합을 한다. 교차결합을 두 개의 테이블을 곱집합으로 계산한다.
FROM 구에 복수의 테이블을 지정하면 교차결합을 한다!
UNION 연결과 결합 연결의 차이
앞서 UNION
에서도 집합을 더해 새로 큰 집합을 만들어 계산할 수 있었다. 또한 FROM
구에서 복수의 테이블을 결합할 때도 새로 큰 집합을 만들어 계산한다. 두 가지 방식이 서로 비슷하지만, 확대 방향이 다르다.
UNION
으로 합집합을 구했을 때는 세로 방향으로 데이터가 더해진다.
FROM
구로 테이블을 결합한 경우에는 가로방향으로 데이터가 더해진다.
결합은 열(가로) 방향으로 확대된다.
내부결합 (Inner Join)
테이블 수가 많아지게 되면 교차결합보다 내부결합이 자주 사용된다.
다른 테이블의 데이터를 참조해야하는 경우, 참조할 테이블의 기본키와 동일한 이름과 자료형으로 열을 만들어서 행을 연결하는 경우가 많다.
SELECT * FROM table1, table2;
위 예제로 FROM
구에 두 테이블을 지정하면 곱집합으로 계산된다. 이렇게 만들어진 집합에서 원하는 데이터를 검색하기 위해 WHERE
구로 조건을 지정한다.
WHERE
구로 기본키가 같은 점을 이용해서 조건에 부합하도록 지정한다. 하지만 각 두 테이블의 기본키 이름이 동일하므로, (동일한 기본키로 결합할 것이기 때문에) 조건식을 지정할 때 테이블 이름도 같이 지정해놓을 필요가 있다.
SELECT * FROM table1, table2
WHERE table1.pk = table2.pk;
위처럼 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것을 내부결합이라고 한다.
만약 WHERE
구의 조건에서 다른 조건이 추가되는 경우에는 기존 조건식과 추가할 조건식이 모두 참이 되어야한다. 그래서 AND
로 조건식을 연결한다.
SELECT * FROM table1, table2
WHERE table1.pk = table2.pk
AND table1.ex = 'A';
위 식의 뜻은 table1과 table2를 참조하는데, table1의 기본키와 table2의 기본키가 같고, table1의 ex항목이 A인 것만 참조하여라.
위 WHERE
구에는 두 개의 조건식이 지정되어있다. 첫 번째 조건식은 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것이다. 두 번째 조건식은 결합 조건이 아닌 검색 조건이다.
여기에서 첫 번째 조건식의 조건을 결합조건이라 부른다.
INNER JOIN으로 내부결합하기
지금까지 설명 요약
- FROM 구에 테이블을 복수 지정해 가로 방향으로 테이블을 결합할 수 있다.
- 교차결합을 하면 곱집합으로도 계산된다.
- WHERE 조건을 지정해 곱집합에서 필요한 조합만 검색할 수 있다.
SELECT table1.name, table2.name
FROM table1 INNER JOIN table2
ON table1.pk = table2.pk
WHERE table1.age = '10';
위 식의 뜻은 table1의 기본키와 table2의 기본키를 기준으로 table1과 table2를 내부결합하여 table1의 name과 table2의 name을 참조하고, 그 중 table1의 age가 10인 것을 가려내 참조한다.
이와 같은 새로운 형식에서는 테이블과 테이블 사이에 INNER JOIN
이라는 키워드를 넣는다. INNER JOIN
은 즉, 내부결합이라는 의미이다. INNER JOIN
에서는 ON
을 사용하여 결합조건을 지정한다.
INNER JOIN으로 두 개의 테이블을 가로로 결합할 수 있다.
내부결합을 활용한 데이터 관리
SELECT * FROM A.name, B.name
FROM table1 A INNER JOIN table2 B
ON A.code = B.code;
위 식을 설명하면 table1을 A, table2를 B로 두고 A의 name과 B의 name을 참조하는데, A와 B를 A의 code와 B의 code로 내부결합하여 진행한다.
그렇다면 결과는 A의 name과 B의 name만 나열되는 표가 나온다.
A 테이블과 B 테이블이 결합했을 때, A와 B 중 어느 쪽이 하나의 행만 가지는지(1:n, n:1) 아니면 양쪽 모두 하나의 행을 가지는지(1:1) 등과 같은 서로 결합하는 테이블 간의 관계가 중요하다.
외부키
B의 code는 기본키이다. 그에 비해 A의 code는 외부키라 불리는 것으로, 다른 키의 기본키를 참조하는 열의 외부키가 된다.
뭔소리지………
자기결합 (Self Join)
자기결합은 테이블에 별명을 붙일 수 있는 기능을 이용해 같은 테이블끼리 결합하는 것을 말한다. 특별히 명령어가 정해져 있지 않다.
SELECT T1.name, T2.name
FROM table1 T1 INNER JOIN table1 T2
ON T1.code = T2.code;
table1 테이블을 가로로 두 개 나열해 code로 결합하는 의미이다. 자기결합에서는 결합의 좌우가 같은 테이블이 되기 때문에 이를 구별하기 위해서 반드시 별명을 붙여야한다.
외부결합
결합 방법은 크게 내부결합과 외부결합 두 가지로 구분된다. 외부결합 또한 교차결합으로 결합 조건을 지정하여 검색한다는 방식은 같다. 외부결합은 어느 한 쪽에만 존재하는 데이터행을 어떻게 다룰지를 변경할 수 있는 결합 방법이다.
특정 테이블에만 데이터를 새로 추가했을 때, 다른 테이블에는 해당 데이터가 존재하지 않으므로 내부결합 결과에서는 해당 데이터가 제외된다.
추가된 데이터를 결합시 나타내고 싶을 때, 외부결합을 사용하면 된다. 외부결합은 결합하는 테이블 중에 어느 쪽을 기준으로 할지 결정할 수 있다.
SELECT table1.name, table2.name
FROM table1 LEFT JOIN table2
ON table1.code = table2.code
WHERE table1.age = '10';
위 식은 table1을 기준으로 INNER JOIN
대신 LEFT JOIN
을 사용하여 나타낸 것이다. 이 상태에서 table1에서 새로 추가한 데이터는 table2엔 없으므로 NULL로 표시된다.
반대로 오른쪽 기준으로 테이블을 지정하고 싶을 때엔 RIGHT JOIN
으로 외부결합을 할 수 있다.
외부결합은 LEFT JOIN, RIGHT JOIN이다.
구식방법에서의 외부결합과 표준 SQL
이건 나중에 참고하겠다.