[SQL] 32. 테이블 결합

uuuu.jini·2023년 2월 5일
0

SQL 첫걸음

목록 보기
32/36
post-thumbnail

테이블 결합은 RDBMS에서 대단히 중요한 개념이다. 결합에서는 가로(열) 방향으로 데이터가 늘어나느 계산이 된다. 보통 데이터베이스는 하나의 테이블에 많은 데이터를 저장하지 않고 몇 개의 테이블로 나누어 저장한다. 이처럼 여러 개로 나뉜 데이터를 하나로 묶어 결과를 내는 방법이 테이블 결합이다. - 곱집합

1. 곱집합과 교차결합


곱집합은 합집합이나 교집합처럼 집합의 연산 방법 중 하나이다. 두 개의 집합을 곱하는 연산 방법으로 적집합 또는 카티전곱이라고도 불린다.

- 교차결합(Cross Join)

만약 SELECT 명령의 FROM 구에 두 개의 테이블을 지정하는 경우 이들은 곱집합으로 계산된다.

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

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

- UNION 연결과 결합 연결의 차이

UNION으로 합집합을 구하는 경우 세로 방향으로 더해지게 된다. FROM구로 테이블을 결합할 경우에는 가로 방향으로 더해지게 된다.

결합을 열(가로) 방향으로 확대된다.

2. 내부결합


테이블을 세 개, 네개로도 지정할 수 있으나 너무 많아지면 조합수가 엄청나게 늘어나 집합이 거대해진다. 이렇게 많은 테이블을 교차결합하는 경우는 드물다. 결합 방법으로는 교차결합보다 내부 결합이 자주 사용된다.

기본키는 하나의 데이터행을 대표할 수 있는 속성을 가진다. 다른 테이블의 데이터를 참조해야 하는 경우, 참조할 테이블의 기본키와 동일한 이름과 자료형으로 열을 만들어서 행을 연결하는 경우가 많다.

FROM 구에 테이블을 복수로 지정하여 곱집합을 계산한 후 원하는 데이터를 검색하기 위해 WHERE 구로 조건을 지정한다.

  • 상품코드가 같은 행을 검색하기
  • SELECT * FROM 상품, 재고수 WHERE 상품.상품코드 = 재고수.상품코드;

이렇게 교차결합으로 계산된 곱집합에서 원하는 조합을 검색하는 것을 내부결합이라고 부른다. (Inner join)

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


  • FROM 구에 테이블을 복수 지정해 가로 방향으로 테이블을 결합할 수 있다.
  • 교차결합을 하면 곱집합으로 계산된다.
  • WHERE 조건을 지정해 곱집합에서 필요한 조합만 검색할 수 있다.

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

SELECT 상품.상품명, 재고수.재고수 
	FROM 상품 INNER JOIN 재고수 
    	ON 상품.상품코드 = 재고수.상품코드
	WHERE 상품.상품분류 = '식료품';

테이블과 테이블 사이에 INNER JOIN이라는 키워드를 넣는다 .여기서 INNER는 안쪽이라는 의미이며 JOIN은 연결시킨다라는 의미이다. 즉 INNER JOIN은 내부결합이라는 의미가 된다.

INNER JOIN으로 두개 테이블을 가로로 결합할 수 있다

4. 내부결합을 활용한 데이터 관리


테이블명을 매번 지정하는 것은 번거로운 일이므로 짧게 줄여 별명을 붙이는 경우가 많다. A테이블과 B 테이블을 결합했을 때, A와 B중 어느쪽이 하나의 행만 가지는지(일대다, 다대일) 아니면 양쪽 모두 하나의 행을 가지는지 (일대일) 등과 같은 서로 결합하는 테이블 간의 관계가 중요하다.

- 외부키

다른 테이블의 기본키를 참조하는 열

- 자기결합(Self Join)

테이블에 별명을 붙일 수 있는 기능을 이용해 같은 테이블끼리 결합하는 것을 말한다. 결합의 좌우가 같은 테이블이 되기 때문에 이를 구별하기 위해 반드시 별명을 붙여야 한다. (쓸모 없는 쿼리 -> 자기 자신의 기본키를 참조하는 열을 자기자신이 가지는 데이터 구조로 되어 있을 경우 자주 사용한다. )

5. 외부결합


외부 결합은 어느 한 쪽에만 존재하는 데이터행을 어떻게 다룰지를 변경할 수 있는 결합방법이다. 외부 결합은 결합하는 테이블 중에 어느 쪽을 기준으로 할지 결정할 수 있다.

  • 외부 결합으로 상품코드 0009인 상품도 결과에 포함하기
SELECT 상품3.상품명, 재고수.재고수
	FROM 상품3 LEFT JOIN 재고수
    	ON 상품3.상품코드 = 재고수.상품코드
	WHERE 상품3.상품분류 = '식료품';

재고수 테이블에 상품3에 해당하는 값이 없는 경우 NULL로 표시된다. 기준이 되는 상품 테이블을 JOIN 외쪽에 기술했으므로 LEFT JOIN이라 지정한다. 상품 테이블을 오른쪽에 지정하는 경우나 재고 테이블을 기준으로 삼고 싶은 경우에는 RIGHT JOIN을 사용해 외부결합을 시행한다.

LEFT JOIN, RIGHT JOIN으로 외부결합

- 구식방법에서의 외부결합과 표준 SQL

MySQL X
Orcale O

FROM 구에 결합 조건을 기술하지 않는다. 대신 WHERE 구로 결합 조건을 지정한다. 그냥 조건식을 지정하면 내부 결합이 되어버리므로, 외부 결합을 진행하고 싶은 경우에는 특별한 연산자를 사용한다. Oracle에서는 데이터가 존재하지 않을 수도 있는 테이블의 열에 (+)라는 특수한 기호를 붙여서 조건식을 지정한다.

SELECT 상품3.상품명, 재고수.재고수
	FROM 상품3, 재고수
    	WHERE 상품3.상품코드 = 재고수.상품코드(+)
        	AND 상품3.상품분류 = '식료품';

현재는 표준화로 인해 내부결합은 INNER JOIN으로 외부결합은 LEFT/RIGHT JOIN을 사용하도록 권장한다.

구식 결합방법은 사용하지 않는다.

profile
멋쟁이 토마토

0개의 댓글