SQL JOIN은 관계형 데이터베이스에서 두 개 이상의 테이블을 연결하여 데이터를 조회할 때 사용하는 중요한 문법입니다. 각 테이블에 분산되어 있는 데이터를 관련성 있는 컬럼(주로 Primary Key와 Foreign Key)을 기준으로 결합하여 하나의 결과 집합으로 만들 수 있습니다.
JOIN의 기본 문법JOIN의 기본 문법은 다음과 같습니다:
SELECT column_list
FROM table1
JOIN_TYPE table2
ON table1.common_column = table2.common_column;
column_list: 조회하려는 컬럼들을 쉼표로 구분하여 나열합니다.table1: 첫 번째 테이블의 이름입니다.JOIN_TYPE: 사용할 JOIN의 종류 (예: INNER JOIN, LEFT JOIN 등)를 지정합니다.table2: 두 번째 테이블의 이름입니다.ON table1.common_column = table2.common_column: 두 테이블을 연결할 조건을 명시합니다. 일반적으로 두 테이블 간에 공통으로 존재하는 컬럼을 사용하며, 이 컬럼의 값이 일치하는 행들을 연결합니다.JOIN의 종류주요 JOIN의 종류는 다음과 같습니다:
INNER JOIN (내부 조인)
설명: 두 테이블에서 ON 조건에 맞는, 즉 공통된 값이 있는 행들만 반환합니다. 가장 일반적으로 사용되는 JOIN이며, JOIN 키워드만 사용하면 기본적으로 INNER JOIN으로 동작합니다.
벤 다이어그램: 두 집합의 교집합(A ∩ B)과 같습니다.
예시:
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID = Customers.CustomerID;
(주문 테이블과 고객 테이블에서 CustomerID가 일치하는 주문과 고객 정보를 조회)
LEFT JOIN (LEFT OUTER JOIN)
설명: 왼쪽 테이블(FROM 절에 먼저 명시된 테이블)의 모든 행을 반환하고, 오른쪽 테이블에서 ON 조건에 일치하는 행들을 함께 반환합니다. 만약 오른쪽 테이블에 일치하는 행이 없으면, 오른쪽 테이블의 컬럼에는 NULL 값이 채워집니다.
벤 다이어그램: 왼쪽 집합 전체와 오른쪽 집합과의 교집합을 포함합니다.
예시:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
(모든 고객 정보와, 해당 고객이 주문한 주문 정보를 조회합니다. 주문이 없는 고객도 CustomerName은 표시되고 OrderID는 NULL로 표시됩니다.)
RIGHT JOIN (RIGHT OUTER JOIN)
설명: 오른쪽 테이블의 모든 행을 반환하고, 왼쪽 테이블에서 ON 조건에 일치하는 행들을 함께 반환합니다. 만약 왼쪽 테이블에 일치하는 행이 없으면, 왼쪽 테이블의 컬럼에는 NULL 값이 채워집니다. LEFT JOIN과 논리적으로 반대 개념입니다.
벤 다이어그램: 오른쪽 집합 전체와 왼쪽 집합과의 교집합을 포함합니다.
예시:
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
RIGHT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
(모든 주문 정보와, 해당 주문을 한 고객 정보를 조회합니다. 고객 정보가 없는 주문 (만약 그런 경우가 있다면)도 OrderID는 표시되고 CustomerName은 NULL로 표시됩니다.)
FULL JOIN (FULL OUTER JOIN)
설명: 양쪽 테이블의 모든 행을 반환합니다. ON 조건에 일치하는 행은 함께 반환하고, 일치하지 않는 행은 다른 테이블의 컬럼에 NULL 값을 채워서 반환합니다. MySQL에서는 FULL OUTER JOIN을 직접 지원하지 않지만, LEFT JOIN과 RIGHT JOIN을 UNION 연산자로 결합하여 동일한 결과를 얻을 수 있습니다.
벤 다이어그램: 두 집합의 합집합(A ∪ B)과 같습니다.
예시: (PostgreSQL, SQL Server 등 FULL OUTER JOIN을 지원하는 DB)
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
(모든 고객과 모든 주문 정보를 조회하며, 매칭되는 것이 없어도 모든 행이 포함됩니다.)
CROSS JOIN (카르테시안 곱)
설명: ON 조건 없이 두 테이블의 모든 행을 조합하여 반환합니다. 첫 번째 테이블의 각 행이 두 번째 테이블의 모든 행과 결합됩니다. 결과 집합의 행 수는 테이블1의 행 수 * 테이블2의 행 수가 됩니다. 일반적으로 잘 사용되지 않으며, 의도치 않게 사용하면 매우 큰 결과 집합을 생성할 수 있습니다.
예시:
SELECT *
FROM table1
CROSS JOIN table2;
SELF JOIN (셀프 조인)
설명: 동일한 테이블을 마치 두 개의 다른 테이블처럼 사용하여 조인하는 것입니다. 테이블 내의 계층 구조(예: 직원-관리자 관계)나 특정 조건에 맞는 같은 테이블 내의 다른 행을 찾을 때 유용합니다. ALIAS (별칭)를 사용하여 테이블을 구분해야 합니다.
예시: (직원 테이블에서 각 직원과 해당 관리자의 이름을 조회)
SELECT E.EmployeeName, M.EmployeeName AS ManagerName
FROM Employees E
INNER JOIN Employees M
ON E.ManagerID = M.EmployeeID;
JOIN 시 고려사항