MariaDB / Query / LEFT JOIN, RIGHT JOIN, INNER JOIN
JOIN
SQL의 JOIN은 여러 테이블을 한 번에 나타낼 때 사용합니다. 대표적인 JOIN 방식은 LEFT JOIN, RIGHT JOIN, INNER JOIN이 있습니다.
다음은 세 가지 JOIN의 차이를 알아보기 위한 간단한 예제 테이블입니다.
- A 테이블에는 나라, B 테이블에는 도시가 있습니다.
- 도시가 어떤 나라의 도시인지는 a_no로 확인합니다.
- 나라는 있는데 도시가 없는 것도 있고, 나라는 없는데 도시는 있는 것도 있습니다.
- A 테이블과 B 테이블을 동시에 나타낸 것이 두 번째 표입니다.
LEFT JOIN
FROM A LEFT JOIN B
A에 B를 붙입니다. A 테이블의 자료는 다 나오고, B 테이블에 대응하는 값이 없으면 NULL을 출력합니다.
SELECT A.a_country, B.b_city FROM A LEFT JOIN B ON A.a_no = B.a_no ;
+-----------+--------+ | a_country | b_city | +-----------+--------+ | A | AA | | B | BB | | C | NULL | | D | NULL | | E | NULL | +-----------+--------+
RIGHT JOIN
FROM A RIGHT JOIN B
B에 A를 붙입니다. B 테이블의 자료는 다 나오고, A 테이블에 대응하는 갑이 없으면 NULL을 출력합니다.
SELECT A.a_country, B.b_city FROM A RIGHT JOIN B ON A.a_no = B.a_no ;
+-----------+--------+ | a_country | b_city | +-----------+--------+ | A | AA | | B | BB | | NULL | FF | | NULL | GG | +-----------+--------+
LEFT JOIN으로 같은 결과를 만들 수 있습니다.
SELECT A.a_country, B.b_city FROM B LEFT JOIN AON A.a_no = B.a_no ;
+-----------+--------+ | a_country | b_city | +-----------+--------+ | A | AA | | B | BB | | NULL | FF | | NULL | GG | +-----------+--------+
INNER JOIN
연결된 값이 있는 것만 출력합니다. 즉, 대응하는 값이 없으면 출력하지 않으므로 NULL은 없습니다.
SELECT A.a_country, B.b_city FROM A INNER JOIN B ON A.a_no = B.a_no ;
+-----------+--------+ | a_country | b_city | +-----------+--------+ | A | AA | | B | BB | +-----------+--------+
LEFT JOIN에 WHERE문을 추가해서 같은 결과를 만들 수 있습니다.
SELECT A.a_country, B.b_city FROM A LEFT JOIN B ON A.a_no = B.a_no WHERE B.b_city IS NOT NULL ;
+-----------+--------+ | a_country | b_city | +-----------+--------+ | A | AA | | B | BB | +-----------+--------+
세 개 이상 테이블 JOIN
테이블이 세 개 이상인 경우 JOIN을 연달아 입력해서 연결 시킵니다. 예를 들어 다음과 같은 자료가 있다고 합시다. 위의 DB에 도시의 인구 수를 담은 C 테이블을 추가한 것입니다.
다음은 나라, 도시, 인구 수를 출력하는 쿼리입니다.
SELECT A.a_country, B.b_city, C.c_pop FROM A INNER JOIN B ON A.a_no = B.a_no INNER JOIN C ON B.b_no = C.b_no ;
+-----------+--------+-------+ | a_country | b_city | c_pop | +-----------+--------+-------+ | A | AA | 1000 | | B | BB | 2000 | +-----------+--------+-------+