오늘은 관계형 SQL의 꽃 JOIN을 배우고 공부했다.
두 개 이상의 테이블 간에 데이터를 결합하는데 사용하는 연산자.
테이블을 가로로 붙이는 개념
테이블A에 테이블B 안에서 조건에 맞는 것을 붙인다.
JOIN
~ON
~
FROM 테이블A
JOIN 테이블B
ON 테이블A.컬럼C = 테이블B.컬럼C;
컬럼C가 양쪽 테이블에 존재해 붙이기 위한 키워드가 된다.
테이블 A의 1 레코드 마다 테이블 B안에서 ON 뒤의 조건에 맞는 레코드가 붙는다.
customer 테이블
membertype 테이블
SELECT *
FROM customer AS c
JOIN membertype AS m
ON c.membertype_id = m.membertype_id;
이미지 출처 : 혼공
위의 JOIN은 INNER JOIN의 생략형이다.
내부 결합은 테이블B에서 조건에 일치하는 레코드가 없으면 테이블A의 레코드도 가져오지 않는다.
즉, 양쪽이 일치하는 결과물만 가져온다.
FROM 테이블A
INNER JOIN 테이블B
ON 조건;
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의 모든 레코드를 조합 |
내부결합과 달리 한쪽 테이블 밖에 없는 레코드도 가져올 수 있다.
이미지 출처 : 혼공
붙어있는 2개의 테이블 중 한쪽 테이블을 우선해서 붙인다.
테이블a(먼저 쓴 테이블)이 우선이면 LEFT, 테이블b(후순위)가 우선이면 RIGHT
우선하는 테이블을 기준으로 다른 쪽의 테이블의 레코드가 없으면 NULL 레코드를 붙인다.
왼쪽(먼저 쓴 테이블)을 우선해서 붙인다.
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로 나온다.
오른쪽(나중에 쓴 테이블)을 우선해서 붙인다.
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로 나온다.
모든 레코드를 조합해서 테이블을 결합한다.
모든 레코드가 조건 없이 붙으므로 ON구에 조건을 적을 필요가 없다.
작성법
FROM 테이블A
CROSS JOIN 테이블B;
SELECT *
FROM customer
CROSS JOIN membertype;
customer 테이블의 레코드 6개와 membertype의 레코드 2개가 모두 상호 조합되어 출력된다.
- 레코드 수가 많지 않으면 LEFT JOIN으로 전부 결합하고 나서 WHERE구에서 레코드 수를 간추리는 방식을 자주 사용한다.
- 레코드 수가 많으면 INNER JOIN으로 미리 레코드 수를 줄여 처리 속도를 빠르게 하는 방법을 자주 사용한다.