헷갈리는 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은 오지 않았다.