231109 TIL #238 SQL #12 JOIN

김춘복·2023년 11월 9일
0

TIL : Today I Learned

목록 보기
238/543
post-custom-banner

Today I Learned

오늘은 관계형 SQL의 꽃 JOIN을 배우고 공부했다.


JOIN

두 개 이상의 테이블 간에 데이터를 결합하는데 사용하는 연산자.
테이블을 가로로 붙이는 개념

사용법

테이블A에 테이블B 안에서 조건에 맞는 것을 붙인다. JOIN ~ ON ~

FROM 테이블A
JOIN 테이블B
ON 테이블A.컬럼C = 테이블B.컬럼C;
  • 컬럼C가 양쪽 테이블에 존재해 붙이기 위한 키워드가 된다.

  • 테이블 A의 1 레코드 마다 테이블 B안에서 ON 뒤의 조건에 맞는 레코드가 붙는다.


예시

  • customer 테이블

  • membertype 테이블

  • JOIN 쿼리 사용
SELECT *
FROM customer AS c
JOIN membertype AS m
ON c.membertype_id = m.membertype_id;


이미지 출처 : 혼공

  • 일치하는 것이 없는 경우
    만약 membertype_id가 3인 임의의 레코드를 넣을 경우 해당 쿼리를 다시 사용하면 새로 넣은 레코드는 보이지 않는다. JOIN이 INNER JOIN으로 동작했기 때문이다.

INNER JOIN(내부 결합)

위의 JOIN은 INNER JOIN의 생략형이다.

  • 내부 결합은 테이블B에서 조건에 일치하는 레코드가 없으면 테이블A의 레코드도 가져오지 않는다.

  • 즉, 양쪽이 일치하는 결과물만 가져온다.

FROM 테이블A
INNER JOIN 테이블B
ON 조건;

JOIN 종류

a JOIN b의 형식으로 결합하는 경우

종류의미
JOIN / INNER JOIN테이블a와 테이블b를 내부결합
LEFT JOIN / LEFT OUTER JOIN테이블a에 테이블b를 외부결합
RIGHT JOIN / RIGHT OUTER JOIN테이블b에 테이블a를 외부결합
CROSS JOIN테이블a와 테이블b의 모든 레코드를 조합
  • 보통 INNER와 OUTER는 생략한다.

OUTER JOIN(외부 결합)

내부결합과 달리 한쪽 테이블 밖에 없는 레코드도 가져올 수 있다.


이미지 출처 : 혼공

  • 붙어있는 2개의 테이블 중 한쪽 테이블을 우선해서 붙인다.

  • 테이블a(먼저 쓴 테이블)이 우선이면 LEFT, 테이블b(후순위)가 우선이면 RIGHT

  • 우선하는 테이블을 기준으로 다른 쪽의 테이블의 레코드가 없으면 NULL 레코드를 붙인다.

LEFT JOIN

왼쪽(먼저 쓴 테이블)을 우선해서 붙인다.

FROM 테이블A
LEFT JOIN 테이블B
ON 조건;
  • 예시

    customer 테이블을 우선에서 membertype 테이블과 JOIN 해라.

SELECT a.customer_id, a.customer_name, b.membertype
FROM customer AS a
LEFT JOIN membertype AS b
ON a.membertype_id = b.membertype_id;

membertype_id가 3인 레코드가 membertype 테이블엔 없으므로 NULL로 나온다.

RIGHT JOIN

오른쪽(나중에 쓴 테이블)을 우선해서 붙인다.

FROM 테이블A
RIGHT JOIN 테이블B
ON 조건;
  • 예시
SELECT *
FROM membertype AS a
RIGHT JOIN customer AS b
ON a.membertype_id = b.membertype_id;

나중에 쓴 customer 테이블이 우선이 되므로 먼저 쓴 membertype에서 일치하는 레코드가 없는 레코드가 NULL로 나온다.

  • RIGHT JOIN을 썼다고 출력되는 컬럼의 순서가 바뀌는건 아니다. FROM 구에서 적은 순서로 출력된다.

CROSS JOIN

모든 레코드를 조합해서 테이블을 결합한다.

  • 모든 레코드가 조건 없이 붙으므로 ON구에 조건을 적을 필요가 없다.

  • 작성법

FROM 테이블A
CROSS JOIN 테이블B;
  • 예시
SELECT *
FROM customer
CROSS JOIN membertype;

customer 테이블의 레코드 6개와 membertype의 레코드 2개가 모두 상호 조합되어 출력된다.


자주 사용하는 경우

  • 레코드 수가 많지 않으면 LEFT JOIN으로 전부 결합하고 나서 WHERE구에서 레코드 수를 간추리는 방식을 자주 사용한다.
  • 레코드 수가 많으면 INNER JOIN으로 미리 레코드 수를 줄여 처리 속도를 빠르게 하는 방법을 자주 사용한다.
profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글