SQL 첫걸음 - 7장 복수의 테이블 다루기(2)

강경훈·2021년 1월 12일
0
post-thumbnail

32강 테이블 결합

UNION으로 합집합을 구하는 것은 세로 방향으로 데이터가 커졌다면, 결합(JOIN)은 가로(열)방향으로 데이터가 커지게 된다.

1. 교차결합 (CROSS JOIN)

  • From에서 하나 이상의 테이블을 지정하여 만들 수 있다.
  • 선택된 테이블들은 곱집합으로 계산된다.
  • 선택하는 테이블이 많아 질수록 조합의 개수가 증가하여 사용하는 경우는 드물다.

곱집합
각 집합의 요소가 모두 만나는 경우의 수를 계산하는 것으로, 예를 들어 1시즌에 6개의 드마를 방영되는 드라마가 있을 때, 3시즌 동안 방영되는 경우를 구해 보자
시즌 = {1, 2, 3}
회차 = {1, 2, 3, 4, 5, 6}
드라마 곱집합 = {{1,1}, {1,2}, {1,3}, {1,4}, ... , {3,5}, {3,6}}
총 18개의 경우를 계산하게 된다.

예제

  • sample72_x
  • sample72_y
  • sample72_x와 sample72_y의 교차결합

2. 내부결합 (INNER JOIN)

  • 교차결합보다 내부결합을 더 자주 사용한다.
  • PRIMERY KEY(pk)을 이용하여 테이블들을 결합한다.
  • pk을 참조하기 위해 pk와 동일한 이름과 자료형으로 열을 만들어서 연결하는 경우가 많다.

PRIMERY KEY
기본키라고 부르며, 기본키는 중복이 없고, NULL값이 없다는 성질을 가지고 있다. 따라서 기본키는 하나의 데이터 행을 대표할 수 있는 속성을 가지게 된다.

WHERE을 사용한 내부결합

  • products
  • stock
  • products와 stock의 교차결합
  • 같은 code에 대해서 내부결합
    SELECT * FROM products,stock WHERE products.code=stock.code

    INNER JOIN을 사용한 내부결합

    SELECT {열} FROM {기준 테이블} INNER JOIN {결합 테이블} ON {결합조건} WHERE {조건}

  • *을 통해 전부 결합
SELECT * FROM products INNER JOIN stock ON products.code=stock.code;

3. 외부결합 (LEFT JOIN)

  • 교차결합으로 결합 조건을 결정하는 것은 내부결합과 동일
  • 어느 한 쪽에만 존재하는 데이터행을 어떻게 다룰지 결정
  • 기준이 되는 테이블의 값과 조건에 맞는 외부 테이블의 값을 가져 온다.
  • 기준은 LEFT JOIN(결합의 왼쪽), RIGHT JOIN(결합의 오른쪽)
  • 결합 결과 값이 없으면 Null로 표시

FORIEGN KEY(외부키)
다른 테이블의 기본키를 참조하는 열이 외부키가 된다. 외부키는 기본키는 아니며, 중복으로 가질 수 있다.

예제

  • stock에 없는 code를 갖는 상품 products에 상품 추가
  • INNER JOIN
    SELECT products.code, products.name, stock.num_of_stocks FROM products INNER JOIN stock ON products.code=stock.code WHERE products.category="food";
  • LEFT JOIN
    SELECT products.code, products.name, stock.num_of_stocks FROM products LEFT JOIN stock ON products.code=stock.code WHERE products.category="food";

기준이였던, products에 조건이 맞는 food들을 가져 왔으며, code 0009는 결합하는 외부테이블에 값이 존재하지 않기 때문에 Null로 표시

4. 자기결합 (SELF JOIN)

  • 테이블에 별명을 붙일 수 있는 것을 활용
  • 내부 결합을 별명을 사용해서 자기 자신과 결합
  • 사실 거의 사용되는 경우가 없다.
  • 사용하기 위해서는 무조건 별명을 이용해서 해야 한다.
profile
방랑하는 개발자

0개의 댓글