[바미] 데이터베이스 - Join
JOIN?
JOIN은 데이터베이스에서 두 개 이상의 테이블을 연결하고 결합하여 원하는 데이터를 조회할 때 사용합니다.
이를 통해 테이블 간의 관계를 기반으로 데이터를 결합할 수 있죠.
기본적으로 Join은 교집합입니다.
JOIN의 종류
- INNER JOIN
- LEFT JOIN (LEFT OUTER JOIN)
- RIGHT JOIN (RIGHT OUTER JOIN)
- FULL JOIN (FULL OUTER JOIN)
- CROSS JOIN
- SELF JOIN
이제 각각의 아래 테이블 구조를 바탕으로 JOIN의 종류에 대해 자세히 살펴보겠습니다.
테이블 구조
Employees
EmployeeID | Name | DepartmentID |
1 | John Doe | 1 |
2 | Jane Smith | 2 |
3 | Sam Brown | 1 |
Departments
DepartmentID | DepartmentName |
1 | HR |
2 | IT |
3 | Sales |
Employees 테이블과 Departments 테이블에서 DepartmentID가 일치하는 행을 조회하여 직원이 어떤 부서에 재직중인 지 알아내는 예제를 공통적으로 사용하여 알아보도록 하죠!
INNER JOIN
INNER JOIN은 두 테이블에서 일치하는 데이터를 조회하는 Join입니다.
양쪽 테이블에서 공통으로 존재하는 행만 결과에 포함되는 형태죠.
쿼리 구조
SELECT A.column1, B.column2
FROM TableA A
INNER JOIN TableB B ON A.common_column = B.common_column;
쿼리 예제
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
결과
Name | DepartmentName |
John Doe | HR |
Jane Smith | IT |
Sam Brown | HR |
Employees 테이블과 Departments 테이블에서 DepartmentID가 일치하는 행을 조회하여 직원이 어떤 부서에 재직중인 지 알 수 있습니다.
LEFT JOIN (LEFT OUTER JOIN)
LEFT JOIN은 쉽게 설명하면 왼쪽 테이블이 주인공이 되는 조인이라 생각하시면 됩니다. 그래서 왼쪽 테이블은 모든 레코드를 반환하지만 오른쪽 테이블은 왼쪽 테이블과 일치되는 값만 반환되는 형태입니다.
쿼리 구조
SELECT A.column1, B.column2
FROM TableA A
LEFT JOIN TableB B ON A.common_column = B.common_column;
쿼리 예제
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
주인공인 Employees 테이블에 Departments 테이블이 일치하는 데이터를 조회합니다.
Name | DepartmentName |
John Doe | HR |
Jane Smith | IT |
Sam Brown | HR |
현재 예제에선 테이블의 데이터가 모두 매치되기 때문에 일치하지 않는 데이터가 없어 Null을 출력하는 모습을 보여주고 있지 않습니다.
RIGHT JOIN (RIGHT OUTER JOIN)
RIGHT JOIN은 앞서 살펴봤던 LEFT JOIN과 반대로 생각하시면 됩니다.
주인공인 오른쪽 테이블을 기준으로 결합하여 왼쪽 테이블과 일치하는 데이터만 포함하는 형태죠. 일치하지 않는 왼쪽 테이블의 데이터는 NULL로 채워집니다.
쿼리 구조
SELECT A.column1, B.column2
FROM TableA A
RIGHT JOIN TableB B ON A.common_column = B.common_column;
쿼리 예제
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
Name | DepartmentName |
John Doe | HR |
Jane Smith | IT |
NULL | Sales |
Sam Brown | HR |
Departments의 Sales 부서는 Employees 테이블에 일치하는 데이터가 없으므로 결과에 NULL로 표시되는 결과를 확인 할 수 있습니다.
FULL JOIN (FULL OUTER JOIN)
FULL JOIN은 두 테이블의 모든 데이터를 포함하는 JOIN이며 일치하지 않는 데이터는 NULL로 채워집니다.
즉, 두 테이블의 모든 데이터를 합쳐서 보여줍니다.
쿼리 구조
SELECT A.column1, B.column2
FROM TableA A
FULL OUTER JOIN TableB B ON A.common_column = B.common_column;
쿼리 예제
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
FULL OUTER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
Name | DepartmentName |
John Doe | HR |
Jane Smith | IT |
Sam Brown | HR |
NULL | Sales |
Jack White | NULL |
CROSS JOIN
CROSS JOIN은 두 테이블의 모든 조합을 반환하는 JOIN 입니다. 즉, 두 테이블의 각 행이 서로 결합되죠.
쿼리 구조
SELECT A.column1, B.column2
FROM TableA A
CROSS JOIN TableB B;
쿼리 예제
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
CROSS JOIN Departments;
Name | DepartmentName |
John Doe | HR |
John Doe | IT |
John Doe | Sales |
Jane Smith | HR |
Jane Smith | IT |
Jane Smith | Sales |
Sam Brown | HR |
Sam Brown | IT |
Sam Brown | Sales |
SELF JOIN
SELF JOIN은 동일한 테이블을 두 번 JOIN인데 주로 테이블 내의 행을 비교하거나 계층적 데이터를 조회하는 데 사용되죠.
쿼리 구조
SELECT A.column1, B.column2
FROM TableA A
INNER JOIN TableA B ON A.common_column = B.common_column;
쿼리 예제
SELECT e1.Name AS EmployeeName, e2.Name AS ManagerName
FROM Employees e1
LEFT JOIN Employees e2 ON e1.ManagerID = e2.EmployeeID;
EmployeeName | ManagerName |
John Doe | NULL |
Jane Smith | John Doe |
Sam Brown | Jane Smith |
NULL | Sam Brown |
함께보면 좋을 자료
https://codesk.tistory.com/360