SQL/DML

[SQL] INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN 설명 및 예제

빠르게 핵심만 2021. 10. 17. 02:52

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

 

· 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

· 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

· 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

· 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