: 두개 이상의 테이블의 레코드를 그들 사이에 관련이 있는 컬럼을 기준으로 합치는 작업입니다.
- 조인의 종류
두 테이블의 비교기준은 관련된 컬럼(id, name ...)의 일치여부 입니다
이 중 가장 많이 쓰이는 두 가지 조인에 대해서 더 자세히 알아보겠습니다!
-
두 테이블은 CustomerID를 기준으로 관계를 맺고있습니다. 만약 각 주문에 대한 주문자의 이름을 뽑아와야 한다면 inner조인으로 아래와 같은 테이블을 뽑아낼 수 있습니다.
여기서 FROM에 있는 테이블이 왼쪽테이블이 됩니다. 그리고 INNER JOIN에 오는 테이블이 오른쪽 테이블이 됩니다. ON뒤에는 관련을 맺고있는 컬럼으로 비교문을 써줍니다.
SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
-
이번에는 반대로 회원을 기준으로 주문내역을 뽑아보겠습니다. 주문내역이 없는 손님들은 null이 뜹니다. 회원 중 주문을 하지 않아서 Orders테이블과 겹치는 것이 없더라도 left join이기때문에 주문을 하지 않은 회원까지 뽑아낼 수 있는 것입니다.
SELECT Customers.CustomerName, Orders.OrderID FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID ORDER BY Customers.CustomerName;
모든 컬럼을 출력해보면 이런식으로 겹치지 않는 레코드들은 Customers쪽에 컬럼만 채워지고 Order쪽 정보는 null로 채워진 것을 확인할 수 있습니다

-
inner join
- inner join + WHERE조건
SELECT CustomerName,OrderID, City FROM Customers INNER JOIN Orders ON Orders.CustomerID = Customers.CustomerID WHERE Customers.City = "London";
- inner join + ON조건
SELECT CustomerName,OrderID, City FROM Customers INNER JOIN Orders ON Orders.CustomerID = Customers.CustomerID AND Customers.City = "London";
-
left join
- left join + WHERE조건
SELECT CustomerName,OrderID, City FROM Customers LEFT JOIN Orders ON Orders.CustomerID = Customers.CustomerID WHERE Customers.City = "London";
- left join + ON조건
SELECT CustomerName,OrderID, City FROM Customers LEFT JOIN Orders ON Orders.CustomerID = Customers.CustomerID AND Customers.City = "London";
이 두쿼리의 결과를 보면 ON에서의 조건과 WHERE에서의 조건이 다르게 적용된다는 것을 알 수 있습니다. ON은 JOIN을 할때 적용되는 조건이고 WHERE 은 JOIN이 끝난뒤에 적용되는 조건입니다. 따라서 ON에서의 결과를 보면 Orders테이블과 조인이 된 레코드는 다 <Orders.CustomerID = Customers.CustomerID AND Customers.City = "London"> 이 조건을 만족합니다. left기 때문에 나머지 customer에 orders정보는 null로 되어있습니다.
- INNER JOIN
SELECT CustomerName, OrderID, City
FROM Customers
INNER JOIN Orders
ON Orders.CustomerID = Customers.CustomerID- EQUI JOIN
SELECT CustomerName, OrderID, City
FROM Customers, Orders
WHERE Orders.CustomerID = Customers.CustomerID
1번쿼리는 2번쿼리로도 나태낼 수 있습니다. 심지어 두 쿼리는 똑같이 동작합니다. 하지만 2번같은 쿼리는 지양해야합니다. 왜냐면 JOIN은 무거운 연산이기 때문에 병목이 생기는 부분으로 의심해볼 수 있기때문에 JOIN이라는 키워드가 직접들어가게 쿼리를 짜줘야 나중에 성능개선시에 알아보기 쉽습니다.
참고









