JOIN은 여러 테이블의 데이터를 결합해서 하나의 결과로 표시하고 싶을 때 사용합니다.
LEFT JOIN, RIGHT JOIN의 사용법을 예제를 통해 설명드리겠습니다.
기본 구조
SELECT 구문에서 JOIN을 사용하는 기본 구조는 다음과 같습니다.
SELECT [컬럼]
FROM [테이블]
JOIN [테이블] ON [조건]
LEFT JOIN [테이블] ON [조건]
RIGHT JOIN [테이블] ON [조건]
INNER JOIN [테이블] ON [조건]
JOIN 절은 ON 조건을 통해 FROM 절의 테이블과 연결됩니다.
JOIN 절은 여러개 사용이 가능합니다.
SELECT 구문 말고도 UPDATE, DELETE 같은 다른 구문에서도 JOIN을 사용할 수 있습니다.
참고로 JOIN 절 사용 시 SELECT 절에 *(별, asterisk)을 사용하면 전체 컬럼이 모두 조회되는데,
테이블의 컬럼이 많거나 컬럼의 수가 변동되는 경우 성능이나 로직에 문제가 생길 수 있습니다.
그래서 * 보다는 필요한 컬럼만 가져다가 사용하는 것이 좋습니다.
LEFT JOIN
LEFT JOIN은 FROM 절의 테이블과 일치하는 데이터를 반환합니다.
일치하는 데이터가 없으면 NULL을 반환합니다.
# city 테이블과 country 테이블 left join
SELECT *
FROM city
LEFT JOIN country on country.Code = city.CountryCode;
# 별칭 사용
SELECT *
FROM city c
LEFT JOIN country ct on ct.Code = c.CountryCode;
도시 테이블의 국가 코드와 국가 테이블의 국가 코드를 연결해서 하나의 테이블로 결합하였습니다.
결과 데이터에서 Code 컬럼 기준 왼쪽이 city 테이블, 오른쪽이 country 테이블입니다.
LEFT JOIN으로 연결된 테이블에 FROM 절의 테이블과 일치하는 데이터가 없으면 null로 반환됩니다.
RIGHT JOIN
RIGHT JOIN은 JOIN 절의 테이블과 일치하는 데이터를 반환합니다.
일치하는 데이터가 없으면 제외됩니다.
# city 테이블과 country 테이블을 right join
SELECT *
FROM city
RIGHT JOIN country ON country.Code = city.CountryCode;
# country 테이블과 city 테이블을 right join
# from city left join country와 결과 세트가 같음
SELECT *
FROM country
RIGHT JOIN city ON country.Code = city.CountryCode;
FROM city RIGHT JOIN country로 실행하면 LEFT JOIN처럼 city 테이블 데이터가 먼저 나오고 그 다음에 country 테이블이 나옵니다.
만약에 국가에 도시가 없으면(country.Code와 일치하는 city.CountryCode가 없으면) 제외됩니다.
LEFT JOIN은 왼쪽 테이블(from)의 모든 레코드와 오른쪽 테이블(join)에서 조건에 맞는 데이터가 결합됩니다.
조건에 맞는 데이터가 오른쪽 테이블에 없으면 왼쪽 테이블의 결과에는 변함이 없고, 오른쪽 테이블은 NULL 값으로 채워집니다.
(from 도시 left join 국가일 때, 도시 테이블의 국가 코드가 국가 테이블에 없는 경우 국가 데이터 부분은 NULL로 반환)
RIGHT JOIN을 사용하면 오른쪽 테이블(join)의 모든 데이터와 왼쪽 테이블(from)에서 조건에 맞는 데이터가 결합됩니다.
조건에 맞는 데이터가 왼쪽 테이블에 없으면 왼쪽 테이블이 NULL로 채워집니다.
(from 도시 right join 국가일 때, 국가 테이블의 국가 코드가 도시 테이블에 없으면 == 국가에 속한 도시가 없으면 도시 데이터 부분이 NULL로 반환)
그래서 FROM 테이블1 LEFT JOIN 테이블2의 결과와 FROM 테이블2 RIGHT JOIN 테이블1의 결과는 같습니다.
읽으면 좋은 글
[MySQL] UPDATE JOIN - 다른 테이블의 값을 참조하여 수정하는 방법