[SQL] INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN 설명 및 예제
RDBMS에서 데이터의 중복을 최소화하기 위해 데이터를 여러 테이블에 나눠서 저장합니다.
따라서 여러 테이블에 존재하는 데이터를 검색하기 위해 필요한 것이 JOIN입니다.
JOIN 절은 둘 이상의 테이블 사이에 관련된 열을 기반으로 행을 결합하는 것을 말합니다.
orders 테이블, customer 테이블로 예를들어 설명하겠습니다.
· orders 테이블
order_id | customer_id | order_date |
1035 | 1 | 2021-10-14 |
1036 | 2 | 2021-10-15 |
1037 | 3 | 2021-10-16 |
· customer 테이블
customer_id | name | address | phone |
1 | 김호준 | 경기도 파주시 | 010-0000-0002 |
2 | 이성민 | 서울특별시 송파구 | 010-0000-0101 |
3 | 남건우 | 강원도 춘천시 | 010-0000-0301 |
4 | 이성규 | 대전광역시 유성구 | 010-1234-5678 |
orders 테이블의 customer_id 컬럼은 customer테이블의 customer_id를 참조합니다.
따라서 위의 두 테이블 간의 관계는 customer_id 컬럼입니다.
1. (INNER) JOIN
두 테이블에서 일치하는 값을 가진 레코드를 반환합니다.
따라서 테이블1과 테이블2 모두 가지고 있는 레코드만 검색됩니다.
· INNER JOIN 구문
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
· 예제
SELECT order_id, name, address, phone, order_date
FROM orders
INNER JOIN customer
ON orders.customer_id = customer.customer_id;
· 결과확인
order_id | name | address | phone | order_date |
1035 | 김호준 | 경기도 파주시 | 010-0000-0002 | 2021-10-14 |
1036 | 이성민 | 서울특별시 송파구 | 010-0000-0101 | 2021-10-15 |
1037 | 남건우 | 강원도 춘천시 | 010-0000-0301 | 2021-10-16 |
orders 테이블과 customer 테이블에서 customer_id가 일치하는 값을 가진 레코드를 반환합니다.
따라서 두 테이블에서 customer_id값이 일치하는 세 개의 레코드만 검색하게 됩니다.
2. LEFT (OUTER) JOIN
테이블1의 모든 레코드와 두 테이블에서 일치하는 값을 가진 레코드를 반환합니다.
따라서 테이블1의 모든 레코드와 테이블1과 테이블2에서 일치하는 값을 가진 레코드만 검색됩니다.
· LEFT JOIN 구문
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
· 예제
SELECT order_id, name, address, phone, order_date
FROM orders
LEFT JOIN customer ON orders.customer_id = customer.customer_id;
· 결과확인
order_id | name | address | phone | order_date |
1035 | 김호준 | 경기도 파주시 | 010-0000-0002 | 2021-10-14 |
1036 | 이성민 | 서울특별시 송파구 | 010-0000-0101 | 2021-10-15 |
1037 | 남건우 | 강원도 춘천시 | 010-0000-0301 | 2021-10-16 |
orders 테이블의 모든 레코드와 두 테이블에서 customer_id가 일치하는 값을 가진 레코드를 반환합니다.
따라서 orders 테이블의 모든 레코드와 두 테이블에서 customer_id값이 일치하는 총 세 개의 레코드만 검색하게 됩니다.
3. RIGHT (OUTER) JOIN
테이블2의 모든 레코드와 두 테이블에서 일치하는 값을 가진 레코드를 반환합니다.
따라서 테이블2의 모든 레코드와 테이블1과 테이블2에서 일치하는 값을 가진 레코드만 검색됩니다.
· RIGHT JOIN 구문
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
· 예제
SELECT order_id, name, address, phone, order_date
FROM orders
RIGHT JOIN customer ON orders.customer_id = customer.customer_id;
· 결과확인
order_id | name | address | phone | order_date |
1035 | 김호준 | 경기도 파주시 | 010-0000-0002 | 2021-10-14 |
1036 | 이성민 | 서울특별시 송파구 | 010-0000-0101 | 2021-10-15 |
1037 | 남건우 | 강원도 춘천시 | 010-0000-0301 | 2021-10-16 |
NULL | 이성규 | 대전광역시 유성구 | 010-1234-5678 | NULL |
customer 테이블의 모든 레코드와 두 테이블에서 customer_id이 일치하는 값을 가진 레코드를 반환합니다.
따라서 customer 테이블의 모든 레코드와 두 테이블에서 customer_id값이 일치하는 총 네 개의 레코드만 검색하게 됩니다.
4. FULL (OUTER) JOIN
두 테이블이 가지고 있는 모든 레코드를 반환합니다.
따라서 두 테이블이 가지고 있는 모든 레코드가 검색됩니다.
· FULL JOIN 구문
MySQL에서는 FULL JOIN을 지원하지 않습니다.
대신에 UNION을 사용하여 FULL JOIN을 구현할 수 있습니다.
· 예제
(SELECT * FROM orders LEFT JOIN customer ON orders.customer_id = customer.customer_id)
UNION
(SELECT * FROM orders RIGHT JOIN customer ON orders.customer_id = customer.customer_id);
· 결과확인
order_id | customer_id | order_date | customer_id | name | address | phone |
1035 | 1 | 2021-10-14 | 1 | 김호준 | 경기도 파주시 | 010-0000-0002 |
1036 | 2 | 2021-10-15 | 2 | 이성민 | 서울특별시 송파구 | 010-0000-0101 |
1037 | 3 | 2021-10-16 | 3 | 남건우 | 강원도 춘천시 | 010-0000-0301 |
NULL | NULL | NULL | 4 | 이성규 | 대전광역시 유성구 | 010-1234-5678 |