본문 바로가기

SQL

(SQL) JOIN - JOIN, LEFT JOIN, RIGHT JOIN, FULL

헷갈리는 JOIN을 W3SCHOOL 의 그림으로 쉽게 알아보자.

  • (INNER) JOIN: Returns records that have matching values in both tables
  • LEFT (OUTER) JOIN: Returns all records from the left table, and the matched records from the right table
  • RIGHT (OUTER) JOIN: Returns all records from the right table, and the matched records from the left table
  • FULL (OUTER) JOIN: Returns all records when there is a match in either left or right table

 

JOIN은 결국 2개의 테이블을 연결하는 것이다. 

위의 그림에서 table1 과 table2 이렇게 2개의 테이블이 있다.

초록색으로 그려진 영역이 SQL 문으로 반환되는 영역이다.

 

1. (INNER) JOIN

SELECT table1.order_id, table2.customer_name

FROM table1 JOIN table2

ON table1.customer_id = table2.customer_id

 

table1과 table2 이렇게 2개의 테이블에 모두 존재하는 컬럼에 공통된 값을 가진  레코드를 반환한다.

 

1.1 3중 JOIN

SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);

3개의 테이블을 JOIN했다. 3개의 원의 교집합이 반환된다.

 

2. LEFT (OUTER) JOIN

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.order.id

table1과 table2의 해당 컬럼에서 공통 값을 가진 레코드들 중에서 table1의 레코드를 반환한다.

 

다른 방식으로 이야기를 하자면,

지정한 컬럼을 기준으로

table1(LEFT[왼쪽] 쪽에 있는 테이블) 레코드들 중에서 table2에 동일한 값이 있는 레코드를 반환한다.

 

3. RIGHT(OUTER) JOIN

SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.order.id

 

LEFT JOIN과 유사하다.

table1과 table2에서 공통 값을 가진 레코드들 중에서 table2의 레코드를 반환한다.

 

4. FULL JOIN

 

 

단순 INNER JOIN과 OUTER JOIN의 차이가 명확히 떠오르지 않아서 시뮬레이션을 해보았다.

 

1. LEFT OUTER 의 경우

기준 테이블은 Customers이고 Customers의 CustomerName과 Orders의 OrderID를 가져왔다.

그런데 OrderID가 null인 경우의 CustomterName도 모두 가져왔다.

즉 orderID의 유무에 상관없이 LEFT에 있는 CustomerName 모두 가져왔다.

 

2. INNER JOIN의 경우

OrderID가 null인 CustomerName은 오지 않았다.